双token+redis(token无感刷新)
为什么要使用双token+redis呢?单token+redis+自动续期不行吗?
单token+redis的缺点:
可能会出现用户正在操作的时候,token过期了,让用户重新登录的情况。
单token+redis+自动续期的缺点:
单token设置短期的话,虽然一直操作可以通过拦截器重置token过期时间让它续期,但是如果隔一会儿不操作不续期,超过过期时间就过期了,那么用户需要重新登录,体验不好。
单token设置长期的话,就会有被盗用的风险。
如果是自动续期还是同一个token,那么token过期时间延长变成长期token那么还是会有盗用的风险。
如果是自动续期的时候刷新token,那么是拦截器是否需要返回新的token给前端,重新发起请求?(长期的自动续期有盗用风险,短期的自动续期如果隔会儿不操作还是会有重新登录的问题)
那么有没有一种实现方式既能活跃用户长时间登录,token还能安全不被盗用呢?
引入refresh token,就解决了【access token设置时间比较长,容易泄露造成安全问题,设置时间比较短,又需要频繁让用户授权】的矛盾。
使用双token无感刷新:
双token:一个短期token,一个长期token。
短期token为访问token。
长期token为refreshToken。当短期token过期,前端发起请求刷新token接口入参为refreshToken,用来获取新的短期token,同时获取新的refreshToken返回给前端。(刷新token和refreshToken都是为了防止两种token永不过期并且一直重复会被盗用)
刷新token接口中处理:校验refreshToken是否存在redis中,如果存在则刷新token和refreshToken返回前端(短期token刷新token和过期时间。长期token刷新token,是否刷新过期时间(续期)呢?)。前端用新的token访问。
如果不存在则返回未登录,让前端转去登录。
关于refreshToken是否续期的问题:
如果不续期,那么最终refreshToken会过期,可能导致用户正在操作的时候,强制重新登录。
如果续期,用户经常活跃的话,accessToken和refreshToken都会进行续期,用户可以一直在线。不会被强制重新登录。
当用户长时间不活跃的话,即refreshToken长时间不刷新过期时间,下次访问就会在refreshToken过期时,强制重新登录。