官方 https://jwt.iohtml
英文原版 https://www.ietf.org/rfc/rfc7519.txt 或 https://tools.ietf.org/html/rfc7519git
中文翻譯 https://www.jianshu.com/p/10f5161dd9dfweb
1. 概述算法
JSON Web Token(JWT)是一種緊湊的、URL安全的方法用來表示json
在兩個部分之間的傳輸聲明. 一般由2種實現: JWS=JSON Web Signature,JWE=JSON Web Encryption。實際上JWT包含了一個你們族。安全
https://tools.ietf.org/html/rfc7515 = JWS數據結構
https://tools.ietf.org/html/rfc7516 =JWEapp
https://tools.ietf.org/html/rfc7517 = JWKide
https://tools.ietf.org/html/rfc7518 = JWA網站
https://tools.ietf.org/html/rfc7519 = JWT
https://tools.ietf.org/html/rfc7520 =JOSE
2.定義
JWS
|
JSON Web Signature (JWS) represents content secured with digital signatures or Message Authentication Codes (MACs) using JSON-based data structures. |
JSON Web Signature (JWS)表示使用基於JSON的數據結構用數字簽名或消息身份驗證代碼(MACS)保護的內容。 |
JWE |
JSON Web Encryption (JWE) represents encrypted content using JSON-based data structures. |
JSON Web Encryption(JWE)表示基於JSON數據結構的加密內容。 |
JWK |
A JSON Web Key (JWK) is a JavaScript Object Notation (JSON) data structure that represents a cryptographic key. |
JSON Web Key(JWK)是一個表示加密密鑰的JSON數據結構。 |
JWA |
This specification registers cryptographic algorithms and identifiers to be used with the JSON Web Signature (JWS), JSON Web Encryption (JWE), and JSON Web Key (JWK) specifications. |
本規範註冊了密碼算法和標識符。用於JSON Web簽名(JWS)、JSON Web加密 (JWE)和json web key(JWK)規範。 |
仔細扣字眼去理解以上文縐縐的定義,能夠發現 JW(*)家族並非同級關係。
舉個不是很恰當的例子:
一個json:
{"action":"8點進攻"},
對這個json作數字簽名,用而後用 內容 || "." || 簽名 的格式包裝
{"action":"8點進攻"}.eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9
這個就是JWS
對這個json
{"action":"8點進攻"}
或
{"action":"8點進攻"}.eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9
加密,造成
05kLzcSr4qKAq7YN7e9jwQRb23
這個就是JWE.
以上例子說明JSE和JSW的核心區別是一個簽名(數據沒有被篡改,來源是真實),一個加密(明文沒法被第三者知曉)。通常把JSE做爲多JWT的實現用來作網站的請求驗證。
3.結構
格式 |
例子,注意標點 . 的存在 |
|
JWS |
BASE64URL(UTF8(JWS Protected Header)) || '.' || BASE64URL(JWS Payload) || '.' || BASE64URL(JWS Signature) |
eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9 . eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ . dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk |
JWE |
BASE64URL(UTF8(JWE Protected Header)) || '.' || BASE64URL(JWE Encrypted Key) || '.' || BASE64URL(JWE Initialization Vector) || '.' || BASE64URL(JWE Ciphertext) || '.' || BASE64URL(JWE Authentication Tag) |
eyJhbGciOiJSU0EtT0FFUCIsImVuYyI6IkEyNTZHQ00ifQ. OKOawDo13gRp2ojaHV7LFpZcgV7T6DVZKTyKOMTYUmKoTCVJRgckCL9kiMT03JGe ipsEdY3mx_etLbbWSrFr05kLzcSr4qKAq7YN7e9jwQRb23nfa6c9d-StnImGyFDb Sv04uVuxIp5Zms1gNxKKK2Da14B8S4rzVRltdYwam_lDp5XnZAYpQdb76FdIKLaV mqgfwX7XWRxv2322i-vDxRfqNzo_tETKzpVLzfiwQyeyPGLBIO56YJ7eObdv0je8 1860ppamavo35UgoRdbYaBcoh9QcfylQr66oc6vFWXRcZ_ZT2LawVCWTIy3brGPi 6UklfCpIMfIjf7iGdXKHzg. 48V1_ALb6US04U3b. 5eym8TW_c8SuK0ltJ3rpYIzOeDQz7TALvtu6UG9oMo4vpzs9tX_EFShS8iB7j6ji SdiwkIr3ajwQzaBtQD_A. XFBoMYUZodetZdvTiFvSkQ |
JWK |
{"kty":"EC", "crv":"P-256", "x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU", "y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0", "kid":"Public key used in JWS spec Appendix A.3 example" } |