2019獨角獸企業重金招聘Python工程師標準>>>
官方 https://jwt.io
英文原版 https://www.ietf.org/rfc/rfc7519.txt 或 https://tools.ietf.org/html/rfc7519
中文翻譯 https://www.jianshu.com/p/10f5161dd9df
?
1. 概述
JSON Web Token(JWT)是一種緊湊的、URL安全的方法用來表示
在兩個部分之間的傳輸聲明. 通常由2種實現: JWS=JSON Web Signature,JWE=JSON Web Encryption。實際上JWT包含了一個大家族。
https://tools.ietf.org/html/rfc7515 = JWS
https://tools.ietf.org/html/rfc7516 =JWE
https://tools.ietf.org/html/rfc7517 = JWK
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" } |