ChuChencheng / note

菜鸡零碎知识笔记
Creative Commons Zero v1.0 Universal
3 stars 0 forks source link

JWT 概念 #45

Open ChuChencheng opened 3 years ago

ChuChencheng commented 3 years ago

什么是 JWT

JWT (JSON Web Token) 是一个公开的标准(RFC 7519),其定义了一种紧凑且独立的方式,使双方可以用 JSON 格式安全地传输信息。使用数字签名使得传输的信息可以被校验和信任。JWT 可以使用一个 secret 签名(HMAC 算法),也可以使用公钥秘钥进行签名(RSA,ECDSA 等)。

JWT 的用途

JWT 通常用于以下几个场景:

JWT 的结构是什么样的

压缩过的 JWT 由三个部分组成,以 . 连接:

因此 JWT 看起来会像是如下结构:

xxxxx.yyyyy.zzzzz

逐个拆解一下

Header

Header 部分一般包含两个字段

示例:

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

将这串 JSON 经过 Base64 编码后,就得到了 Header 部分

Payload

Payload 部分是一些声明,一般包含对一个实体(例如用户)的描述与一些额外的信息。

声明有三种:

Registered claims

这部分声明是预定义的,在标准中推荐有但不强制。提供一系列有用的、用于信息交换的声明。

包括以下字段:

(claims 字段都只有三个字母,是为了保持紧凑)

Public claims

这部分声明可以按使用者的意愿来定义,但是需要避免与其他字段的冲突,因此,这部分字段应该在 IANA JSON Web Token Registry 中有定义,或者应被定义为一个带有不冲突命名空间的 URI 。

Private claims

这部分自定义的声明应是使用 JWT 的双方约定好的字段,并且不能是 registered 或者 public 中的声明。

Payload 示例:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

将 Payload 部分经过 Base64 编码后,组成 JWT 的第二部分

注意:JWT 虽然可以防止篡改,但是其内容是对任何人可见的,不要将任何未加密的私密信息放入 JWT 中。

Signature

将编码过的 Header, Payload 和一个 secret ,经过 Header 中指定的算法进行签名,即可得到 Signature 部分

例如,如果使用 HMAC SHA256 算法,签名将这样生成:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

签名用于验证信息在传输途中没有被篡改,并且如果是使用私钥进行签发,还可以验证签发者的身份。

将三段内容组合

把三段 Base64 编码过的内容组合起来,并用 . 连接,即可得到一串 JWT 。

JWT 工作原理

  1. 当用户登录后,服务端签发一个 JWT 给客户端
  2. 用户在后续请求中,将 JWT 随请求附上
  3. 服务端验证请求中的 JWT ,验证通过后正常返回资源,否则提示未授权

一个简易的时序图:

image

客户端一般会将 JWT 附在 Authorization Header 中,使用 Bearer 模式,例如:

Authorization: Bearer <token>

使用这种方式传输 JWT ,可以跨域使用,因为不是使用 Cookie 。

JWT 特点

Reference