Jwt

JWT是(JSON Web Token])的缩写,主要用来做用户身份验证的。

随着当前分布式应用、前后端分离的技术广泛使用,早年通过session管理用户状态的成本越来越高,session共享问题以及之后出现的token认证基本都是通过如Redis之类的中间件实现的。

JWT通过将数据保存在客户端,每次请求时将token发送至服务端校验,服务端无需存储token,实现完全无状态化。

流程

  • 客户端登录请求认证
  • 服务端认证通过后,生成包含数据的JSON对象,并将此对象进行签名生成token
  • 服务端将token返回客户端,客户端存储在本地,如cookie或localStorage
  • 客户端下次请求时携带token到服务端,常用的是放在 HTTP 请求的头的Authorization字段中,Authorization: Bearer <token>
  • 服务端验证token有效性

结构

Token是一个使用.分割的三部分组成的长字符串,Header.Payload.Signature

Header是一个Base64URL之后的json对象,{"typ":"JWT","alg":"HS256"}alg表示签名的算法(algorithm),默认是 HMAC SHA256(HS256),typ表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT。

Payload

Payload 也是一个Base64URL之后的JSON对象,用来存放传递的数据。JWT 规定了7个官方字段可用:

  • iss (issuer):签发人
  • iat (Issued At):签发时间
  • exp (expiration time):过期时间
  • nbf (Not Before):生效时间
  • jti (JWT ID):编号
  • sub (subject):主题
  • aud (audience):受众

除了官方字段,还可以在这个部分定义私有字段,比如

{
  "sub": "101",
  "name": "ruesin",
  "LoginToken":"abcd123"
}

因为默认是Base64URL编码不加密的,所以客户端是可以解码读取这些数据,不要把秘密信息放在这个部分。

Signature

Signature 是对前两部分的签名,校验tonken的有效性,防止数据篡改。

签名是通过服务端指定的密钥(secret)及Header中指定的签名算法产生的。

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)
powered by Gitbook更新时间: 2021-05-27 10:52:40

results matching ""

    No results matching ""