Skip to main content

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。