一般的用户认证流程如下图:

image.png

但是,这种模式的扩展性不好。单个服务器没问题,如果多个服务器集群,要求共享 session ,每个服务器都能访问到 session

  • 解决方案一:session 数据持久化,写入数据库或者其他持久层。各个服务器收到请求后,向持久层发送数据请求。
    • 缺点:工程量大。
  • 解决方案二:服务器不保存 session 数据,所有的数据保存在客户端,每次请求都发回服务器。如:JWT(Json Web Token)。

# JWT

JWT 服务器不保存 session 数据,在服务器认证之后,返回一个 JSON 对象。格式如下:

{
    "姓名": "zero",
    "角色": "管理员",
    "到期时间": "2018年10月6日0点0分"
}

之后,客户端与服务器的用户认证都靠这个 JSON 对象,当然,这个对象后面会加上签名,保证数据不被篡改。

# JWT 的数据结构

  • JWT 是一个很长的字符串,中间用 . 分隔,内部没有换行。
  • 组成由三个部分:Header.Payload.Signature
    • Header:头部。JSON 对象,描述 JWT 的元数据。
    • Payload:负载。JSON 对象,存放实际需要传递的数据;不加密。
    • Signature:签名。对 HeaderPayload 的签名,防止数据被篡改。

Header 格式:

{
  "alg": "HS256",   // 签名的算法
  "typ": "JWT"      // token 类型
}

Payload 七个字段:

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

# JWT 的使用方式

  • 存储在 cookie 中。
  • 存储在 localStorage 中。
  • 客户端每次与服务器进行通信的时候,都会带上 JWT

参考:

  • http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html