JSON web token@03#JSON Web Token (JWT)综述

来源:互联网 发布:mac不要开机密码 编辑:程序博客网 时间:2024/06/06 00:57

3. JSON Web Token (JWT) 综述

JWTs 表示一个 claims 集合,构成一个 JSON 对象,编码在 JWS 和/或 JWE 结构中。这个 JSON 对象是一个 JWT Claims 集合。按照 RFC 7159 [RFC7159] 第四章节的定义,JSON 对象包含零个或者多个 name/value pairs(或者 members), 这里 names 是 strings, values 是任意 JSON 值。这些 members 是由 JWT 表示的 claims。 这个 JSON 对象可能包含空格 和/或 任何 JSON 值 之前或之后的换行符 或 结果字符串。与 RFC 7159[RFC7159]第2章节的定义一致。

JWT Claims 集合中的成员名叫做 Claim Names。与之对应的值叫做 Claim Values。

JOSE Header 的 文本内容记录了加密 JWT Claims Set 所使用的加密行为。 如果这个 JOSE Header 用于 JWS,那这个 JWT 就是一个 JWS, 它的 claims 是 数字签名 (digitally signed) 或者 消息鉴权码 (Message Authentication Code: MACed), 同 JWT Claims 集合在一起作为 JWS Payload。如果这个 JOSE Header 用于 JWE,那这个 JWT 就是一个 JWE, 她的 claims 是加密的, 和 JWT Claim 集合一起,作为 plaintext 被 JWE 加密。 一个 JWT 可能包含在 其他的 JWE 或者 JWS 结构中,以创建一个 Nested JWT, 允许嵌套签名和加密。

一个 JWT 代表着一系列用英文句号(’.’)分隔连接 URL-safe parts。每个 part 包含一个 base64url 加密的值。 JWT 中 parts 的数量依赖于 JWS 使用 JWS Compact Serialization 的输出结果,或 JWE 使用 JWE Compact Serialization 的输出结果。

3.1. Example JWT

下面的 JOSE Header 样例声明了这个编码对象是一个 JWT, 并且这个 JWT 是一个 JWS,并使用了消息鉴权编码(MACed), 使用的算法是HMAC SHA-256:

{"typ":"JWT","alg":"HS256"}

为了消除上面JSON 表示的对象的潜在歧义,下面使用 UTF-8 编码的八进制序列来表示同样的 JOSE header. (注意歧义的产生可能是因为不同系统平台换行符不同的表示方法(CRLF 或者 LF),在每行开头或结束使用不同的占位符, 最后一行是否使用换行符,还有其他原因。 在这个例子中,第一行没有前置或后置空格, 一个 CRLF 换行符 出现在第一行和第二行之间, 第二行有一个前置空格,没有后置空格, 最后一行没有终端换行符。) 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 加密后的值为:

eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9

下面是一个 JWT Claims Set 的例子:

{"iss":"joe","exp":1300819380,"http://example.com/is_root":true}

下面的八进制序列, 是上面的 JWT Claims Set 使用了 UTF-8 编码后的形式,就是 JWT Payload:

[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]

用 Base64url 加密这个 JWS Payload 产生下面加密后的 JWS Payload(换行符仅仅是为了方便排版):

eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ

计算这个加密后的 JOSE Header 的 MAC, 用 HMAC SHA-256 算法加密 JWS Payload, 用 JWS 指定的方式加密这个 HAMC 值, 得到加密后的 JWS Signature:

dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk

用英文句号(’.’)字符链接依顺序连接这些加密后的内容,得到完整的 JWT (换行符仅仅是为了排版的需要):

eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk

在 JWS 规范的 Appdendix A.1 中详细描述了这个计算过程。查阅 Appendix A.1 加密 JWT 的样例。

0 0
原创粉丝点击