一般的用户认证流程如下图:
但是,这种模式的扩展性不好。单个服务器没问题,如果多个服务器集群,要求共享 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:签名。对 Header 和 Payload 的签名,防止数据被篡改。
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