封面图片

编程

token刷新机制的思考

后端不主动刷新token,前端只在必要时携带refresh_token去请求刷新token。


在使用JWT进行前后端分离的开发中,Token刷新机制是一个非常重要的问题。Token是一段有时限的字符串,用于验证用户身份和权限,如果Token过期,用户需要重新登录,这会对用户体验造成影响。因此,我们需要实现一种Token刷新机制,使得用户能够保持在线,同时又不会影响系统安全。

方案1

一种常见的Token刷新机制是:前端在每次请求前,去校验token是否快过期,如果接近过期,则向后端发送一个携带refresh_token的头的Token刷新请求。后端提供刷新token接口。后端校验refresh_token是否合法,合法则签发新的token。在代码层面还需要在刷新接口方法中加一个开关,防止多个请求同时请求刷新接口。这种机制能够保持用户在线,同时也能保证系统安全。变种形式是前端设置定时任务,每隔一段时间去请求刷新接口,但这个方法不够优雅。

方案2

另一种更为“无感”的Token刷新机制(方案2)是:当用户进行访问时,后端服务器会检查当前Token是否快过期,如果快过期则自动刷新Token,并将新Token返回给前端。这种机制能够完全保持用户在线,同时也无需用户重新登录或者手动刷新Token,提升了用户体验。这种方式有个风险,就是每个请求都需要携带refresh_token,让后端可以直接验证刷新token并返回。但这样refreshtoken就失去了存在的意义了。

方案3

以上2种方案是token过期前的刷新机制。如果长时间未操作页面,导致token过期,但是refresh_token还未过期,则需要另一种机制(方案3)去保证登录状态。当然也可以直接退出登录,返回登录界面。对于token过期后刷新的机制,当前端在发送请求前校验token,如果快过期或者已经过期,则将当前请求和后续请求进行缓存,先发送刷新token请求,当收到新的token后再使用新的token将缓存的请求继续发送。

总结

如果要长期保持登录状态推荐使用方案3。如果长时间未登录需要退出到登录界面则推荐方案1。方案2不推荐。

综上所述,Token刷新机制是JWT前后端分离开发中一个非常关键的问题,我们需要根据实际需求选择适合的刷新机制,以保证系统的安全性和用户体验。

2023年04月03日
在初学者眼中,世界充满了可能;专家眼中,世界大都已经既定。--铃木俊隆