3. JSON Web Token (JWT) Overview (JWT概述)
JWT将一组声明表示为编码在JWS和/或JWE结构中的JSON对象。这个JSON对象就是JWT声明集 (JWT Claims Set)。根据RFC 7159 [RFC7159] 第4节,JSON对象由零个或多个名称/值对(或成员)组成,其中名称是字符串,值是任意JSON值。这些成员就是JWT所表示的声明。根据RFC 7159 [RFC7159] 第2节,此JSON对象可以 (MAY) 在任何JSON值或结构字符之前或之后包含空格和/或换行符。
JWT声明集内的成员名称称为声明名称 (Claim Names)。对应的值称为声明值 (Claim Values)。
JOSE Header的内容描述了应用于JWT声明集的加密操作。如果JOSE Header是用于JWS的,则JWT表示为JWS,声明被数字签名或使用MAC保护,JWT声明集是JWS有效载荷 (JWS Payload)。如果JOSE Header是用于JWE的,则JWT表示为JWE,声明被加密,JWT声明集是JWE加密的明文。JWT可以 (MAY) 封装在另一个JWE或JWS结构中以创建嵌套JWT (Nested JWT),从而实现嵌套签名和加密。
JWT表示为由句点('.')字符分隔的URL安全部分序列。每个部分包含一个base64url编码的值。JWT中的部分数量取决于使用JWS紧凑序列化表示的JWS或使用JWE紧凑序列化表示的JWE。
3.1. Example JWT (JWT示例)
以下示例JOSE Header声明编码的对象是JWT,并且该JWT是使用HMAC SHA-256算法进行MAC保护的JWS:
{"typ":"JWT",
"alg":"HS256"}
为了消除上述JSON对象表示中的潜在歧义,本示例中JOSE Header实际使用的UTF-8表示的字节序列也包含在下面。(请注意,由于不同平台对换行符的表示不同(CRLF与LF)、行首和行尾的空格不同、最后一行是否有终止换行符以及其他原因,可能会产生歧义。在本示例使用的表示中,第一行没有前导或尾随空格,第一行和第二行之间有CRLF换行符(13, 10),第二行有一个前导空格(32)且没有尾随空格,最后一行没有终止换行符。)本示例中JOSE Header的UTF-8表示的字节(使用JSON数组表示法)为:
[123, 34, 116, 121, 112, 34, 58, 34, 74, 87, 84, 34, 44, 13, 10, 32,
34, 97, 108, 103, 34, 58, 34, 72, 83, 50, 53, 54, 34, 125]
对JOSE Header的UTF-8表示的字节进行Base64url编码,得到以下编码的JOSE Header值:
eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9
以下是JWT声明集的示例:
{"iss":"joe",
"exp":1300819380,
"http://example.com/is_root":true}
以下字节序列是本示例中上述JWT声明集使用的UTF-8表示,即JWS有效载荷:
[123, 34, 105, 115, 115, 34, 58, 34, 106, 111, 101, 34, 44, 13, 10,
32, 34, 101, 120, 112, 34, 58, 49, 51, 48, 48, 56, 49, 57, 51, 56,
48, 44, 13, 10, 32, 34, 104, 116, 116, 112, 58, 47, 47, 101, 120, 97,
109, 112, 108, 101, 46, 99, 111, 109, 47, 105, 115, 95, 114, 111,
111, 116, 34, 58, 116, 114, 117, 101, 125]
对JWS有效载荷进行Base64url编码,得到以下编码的JWS有效载荷(为便于显示添加了换行符):
eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly
9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ
使用HMAC SHA-256算法计算编码的JOSE Header和编码的JWS有效载荷的MAC,并按照 [JWS] 中指定的方式对HMAC值进行base64url编码,得到以下编码的JWS签名:
dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
按此顺序连接这些编码的部分,部分之间用句点('.')字符分隔,得到以下完整的JWT(为便于显示添加了换行符):
eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9
.
eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFt
cGxlLmNvbS9pc19yb290Ijp0cnVlfQ
.
dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
此计算在 [JWS] 附录A.1中有更详细的说明。加密JWT的示例请参见附录A.1。