Open ChuChencheng opened 3 years ago
JWT (JSON Web Token) 是一个公开的标准(RFC 7519),其定义了一种紧凑且独立的方式,使双方可以用 JSON 格式安全地传输信息。使用数字签名使得传输的信息可以被校验和信任。JWT 可以使用一个 secret 签名(HMAC 算法),也可以使用公钥秘钥进行签名(RSA,ECDSA 等)。
JWT 通常用于以下几个场景:
压缩过的 JWT 由三个部分组成,以 . 连接:
.
因此 JWT 看起来会像是如下结构:
xxxxx.yyyyy.zzzzz
逐个拆解一下
Header 部分一般包含两个字段
示例:
{ "alg": "HS256", "typ": "JWT" }
将这串 JSON 经过 Base64 编码后,就得到了 Header 部分
Payload 部分是一些声明,一般包含对一个实体(例如用户)的描述与一些额外的信息。
声明有三种:
这部分声明是预定义的,在标准中推荐有但不强制。提供一系列有用的、用于信息交换的声明。
包括以下字段:
(claims 字段都只有三个字母,是为了保持紧凑)
这部分声明可以按使用者的意愿来定义,但是需要避免与其他字段的冲突,因此,这部分字段应该在 IANA JSON Web Token Registry 中有定义,或者应被定义为一个带有不冲突命名空间的 URI 。
这部分自定义的声明应是使用 JWT 的双方约定好的字段,并且不能是 registered 或者 public 中的声明。
Payload 示例:
{ "sub": "1234567890", "name": "John Doe", "admin": true }
将 Payload 部分经过 Base64 编码后,组成 JWT 的第二部分
注意:JWT 虽然可以防止篡改,但是其内容是对任何人可见的,不要将任何未加密的私密信息放入 JWT 中。
将编码过的 Header, Payload 和一个 secret ,经过 Header 中指定的算法进行签名,即可得到 Signature 部分
例如,如果使用 HMAC SHA256 算法,签名将这样生成:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
签名用于验证信息在传输途中没有被篡改,并且如果是使用私钥进行签发,还可以验证签发者的身份。
把三段 Base64 编码过的内容组合起来,并用 . 连接,即可得到一串 JWT 。
一个简易的时序图:
客户端一般会将 JWT 附在 Authorization Header 中,使用 Bearer 模式,例如:
Authorization: Bearer <token>
使用这种方式传输 JWT ,可以跨域使用,因为不是使用 Cookie 。
什么是 JWT
JWT (JSON Web Token) 是一个公开的标准(RFC 7519),其定义了一种紧凑且独立的方式,使双方可以用 JSON 格式安全地传输信息。使用数字签名使得传输的信息可以被校验和信任。JWT 可以使用一个 secret 签名(HMAC 算法),也可以使用公钥秘钥进行签名(RSA,ECDSA 等)。
JWT 的用途
JWT 通常用于以下几个场景:
JWT 的结构是什么样的
压缩过的 JWT 由三个部分组成,以
.
连接:因此 JWT 看起来会像是如下结构:
xxxxx.yyyyy.zzzzz
逐个拆解一下
Header
Header 部分一般包含两个字段
示例:
将这串 JSON 经过 Base64 编码后,就得到了 Header 部分
Payload
Payload 部分是一些声明,一般包含对一个实体(例如用户)的描述与一些额外的信息。
声明有三种:
Registered claims
这部分声明是预定义的,在标准中推荐有但不强制。提供一系列有用的、用于信息交换的声明。
包括以下字段:
(claims 字段都只有三个字母,是为了保持紧凑)
Public claims
这部分声明可以按使用者的意愿来定义,但是需要避免与其他字段的冲突,因此,这部分字段应该在 IANA JSON Web Token Registry 中有定义,或者应被定义为一个带有不冲突命名空间的 URI 。
Private claims
这部分自定义的声明应是使用 JWT 的双方约定好的字段,并且不能是 registered 或者 public 中的声明。
Payload 示例:
将 Payload 部分经过 Base64 编码后,组成 JWT 的第二部分
注意:JWT 虽然可以防止篡改,但是其内容是对任何人可见的,不要将任何未加密的私密信息放入 JWT 中。
Signature
将编码过的 Header, Payload 和一个 secret ,经过 Header 中指定的算法进行签名,即可得到 Signature 部分
例如,如果使用 HMAC SHA256 算法,签名将这样生成:
签名用于验证信息在传输途中没有被篡改,并且如果是使用私钥进行签发,还可以验证签发者的身份。
将三段内容组合
把三段 Base64 编码过的内容组合起来,并用
.
连接,即可得到一串 JWT 。JWT 工作原理
一个简易的时序图:
客户端一般会将 JWT 附在 Authorization Header 中,使用 Bearer 模式,例如:
使用这种方式传输 JWT ,可以跨域使用,因为不是使用 Cookie 。
JWT 特点
Reference