Refresh Token

在JWT token中,refreshToken的作用主要是避免token过期时,前端用户突然退出登录产生不良体验。
试想,如果你正访问某基于jwt token机制的网站,该网站token过期时间是24小时,你在23小时59分前已经登录过了,现在你访问某页面时,正好处于token过期时间24小时的临界点,这时token突然过期,你上一秒看视频正起劲儿呢,下一秒就让你重新登录了,你说气不气?这时候如果有一个refreshToken,虽然正式的token过期了,但前端却可以拿这个refreshToken来主动续期。这样就解决了token过期导致用户上一秒还在登录,下一秒就突然退出登录的问题。

如何实现通过refreshToken刷新token

  1. 首先,refreshToken有效时间一定要比token有效时间长至少才能不影响用户体验,具体要长多少得以实际需求为准,建议是24小时
  2. 前端每次访问后端都携带token,如果token失效则后端直接返回类似token失效请重新登录的报文。
  3. 前端第一次收到token失效的响应后,从本地存储拿refreshToken再去请求
  4. 后端一检测到refreshToken参数不为空,就去校验解析这个refreshToken
  • 如果有效,后端就返回一个新的token及refreshToken给前端,前端收到后更新本地存储,同时拿这个新的token向后端发起第三次请求,然后成功获取资源
  • 如果无效,则后端同样返回token失效,前端第二次收到失效的响应则跳转到登录页重新登录

Token 刷新并发处理解决方案

对 Token 进行刷新续期,我们要解决并发请求导致重复刷新 Token 的问题

利用 Redis 缓存

当同时发起多个请求时,第一个接口刷新了 Token,后面的请求仍然能通过请求,且不造成 Token 重复刷新。那么,后端在用户第一次登录时,需要将生成的 Token 数据(token 和 createTime)缓存一份到 Redis 中。

当 Token 过期时,重新生成新的 Token 数据并更新 Redis 缓存,同时在 Redis 中设置一条 Token 过渡数据并设置一个很短的过期时间(比如 30s)。如果后面的请求发现 Token 已经被刷新了,就判断 Redis 中是否存在 Token 过渡数据,存在就放行,这样同一时间的请求都可以通过