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" } |