在传统的用户登录认证中,因为http是无状态的,所以都是采用session方式,当用户登录成功,服务端会保存一个session,会给客户端一个sessionId,客户端会把sessionId保存在cookie中,每次请求都会携带这个sessionId。
cookie+session这种模式通常是保存在内存中,而且服务从单服务到多服务会面临session共享问题,随着用户量的增加,开销就会越大,而jwt不是这样的,只需要服务端生成token,客户端保存这个token,每次请求携带这个token,服务区认证解析就可以。
JWT的身份验证基本流程
- 客户端使用自己的账号密码发送POST请求登录
- 由于这是首次接触,服务器会校验账号与密码是否合法
- 如果一致,则根据密钥生成一个JWT并返回
- 客户端收到这个token并保存在本地,
- 客户端需要访问一个受保护的资源时,只要附加上jwt发送到服务器
- 服务器就会检查这个token是否有效,并做出响应
JWT的构成
header(头部)、payload(载荷)、signature(签证)
header(头部):
jwt的头部承载两部分信息:{“type”:“JWT”,“alg”:“HS256”}(类型、对签名加密的算法)
payload(载荷):
-
iss:jwt签发者
-
List item
-
sub:jwt所面向的用户
-
aud:接收jwt的一方
-
exp:jwt的过期时间,这个过期时间必须大于签发时间
-
nbf:定义在什么时间之前,该jwt都是不可用的
-
iat:jwt的签发时间
-
jti:jwt的唯一身份便是,主要用来作为一次性token,从而回避重放攻击
signature(签名):
- 用Base64编码的header.payload
- HS256加密算法加密(将密钥存储在服务端)