最近做的项目Springboot+vue前后端分离
还是选用了扩展功能很强大的shiro作为安全框架
并且弃用了shiro的session管理,使用JWT(JSON Web Token)取而代之
现在已经实现登录认证
有个问题是,用户在token有效时间内的正常操作(请求header中携带token的请求)如何刷新token最好?
在网上查了查,我总结出两个方案:
1.第一种方案,单token反复刷新
简单来说就是用户每次访问后台服务,验证老token通过时,会进行jwt续期(重新颁发token),签发newtoken放到Response的header返回给前端
前端axios全局拦截Response获取header中的newtoken储存在localstorage,下次请求再带上这个newtoken
这样每次请求都会保持token时间重置,同时token也重置
但是这样做好像会在并发请求时引起反复刷新token导致多个请求失败的异常。
而且我不知道这样做是不是太过冗余,每次都要生成新token,如果用户在一段时间内反复点击一个按钮访问后端服务,会不会太影响性能了?
2.第二种方案,分为access_token和refresh_token
这种方案给我的理解就是大小token,大token(refresh_token)比小token(access_token)过期时间要长。
小token在有效期内,则正常处理,小token失效,则使用大token验证,通过则重新颁发token作为小token给前端,否则需要重新登录。
前端依旧拦截Responseheader存储新的小token
这样做减少了方案一冗余的刷新令牌操作,但是感觉这样做,是不是有点无用功了?就好像给单token延长了时间一样。。。
百思不得其解,希望大神能给讲一讲