关于JWT

403 阅读2分钟

JWT(JSON Web Tokens)

https://jwt.io/

JWT结构

JWT是一串加密后的字符串,通过.将字符串依次分割成三个部分

  1. Header
  2. Payload
  3. Signature

下面用一个案例来解释每个部分所代表的意义

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Header

通过Base64加密,用来描述JWT的元信息

解密后的内容

{
  "alg": "HS256", // 签名的算法,默认算法为HS256
  "typ": "JWT" // 令牌的类型
}

Payload

也是通过Base64加密,用来描述要传递的数据和信息

解密后的内容

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

官方为Payload提供了一些字段供使用,同时用户也可以添加自定义字段

  1. iss(issuer):签发人
  2. sub(subject):主题
  3. aud(audience):受众
  4. exp(expiration time):过期时间
  5. nbf(not before):生效时间
  6. iat(issued at):签发时间
  7. jti(jwt id):编号

Signature

由于前两部分的内容都是通过Base64加密的,这样在传输的过程中就很容易解密拿到里面的内容,为了防止篡改,所以添加一段数字签名用来校验内容是否被篡改过

加密时需要提供一个秘钥

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  your-256-bit-secret
) 

JWT工作方式

JWT优点

  1. 因为token存在客户端,服务器只需要解码,所以不占用服务器空间
  2. 服务器容易扩展
  3. 具有签名验证,防止篡改

JWT缺陷

  1. 无法主动让token失效
  2. 数据延迟:用户信息更新后,如果用户使用之前的token,那么服务器获取到的仍是用户信息
  3. 内容透明,不适合放敏感数据
  4. token包含的内容多,比sessionid占用更多网络带宽

本文使用 mdnice 排版