观帖“登录最佳实践”有感, jwt token 如何优雅的刷新?

2021-11-25 14:28:50 +08:00
 AllenHua

原帖点我,一般的业务系统里 jwt token 都是如何刷新的?有没有最佳实践。

亮出一些观点

在 SpringBoot + redis + jwt token 的技术实践中,我的一点想法:

  1. 充分利用 jwt token 和 redis ,在拦截器中校验用户请求是否有效使用 jwt token 的 verify 和 redis hasKey 联合校验
  2. 设置一个 jwt token 已过期的缓冲区,比如设计 token 有效期 1 小时,但是在超时的 20 分钟内用户可以拿现有 token 换一个新的 token ,实现 token 的刷新。如果用户在此期间一直有操作系统,那么就不用重新登录。如果用户有 80 分钟没有使用系统就需要重新登录

为的是服务器开销和业务需求之间寻求平衡。


网上搜到一些讨论(如下),欢迎大家畅所欲言

4492 次点击
所在节点    程序员
30 条回复
hhyyd
2021-11-25 23:04:14 +08:00
我做了两个项目的登录功能后,目前的方案是:accessToken 过期时间设置短些,如果过期则前端用 refreshToken 获取新 token 即可(对用户来说是无感知的替换了 accessToken )。jwt 和 redis 选择一种方案即可,jwt 本身有附带信息解密即可,如果用 redis 关联 token-用户信息查询也很快。

两种方案都有尝试过,相对更倾向加上 redis 去做记录,如果想要在服务端清除用户本次的登录状态,如果有 redis 记录就方便些;如果用的是纯 jwt 的话,不是很好办,最终还是要服务端记录这个 jwt 。

楼主的过期超时 20 分钟的缓冲,其实就是 refreshToken 方式, 刚开始接触的时候,也用过这种 token 替换 token 的方式,后来发现还有 refreshToken 这种方式,非常适合这种频繁操作时延长 token 有效期的场景
AllenHua
2021-11-25 23:14:46 +08:00
@hhyyd #21 很有用,谢谢分享
xxfye
2021-11-26 00:30:01 +08:00
每次请求都用中间件判断 jwt ,快过期了就发一个新的,附加到 header 上。拦截器发现新 token 的就替换旧的。
nl101531
2021-11-26 09:36:55 +08:00
设定过期时间,服务端检测每次请求时,token 还有多久过期,在一定允许时间范围内,重新下发。 这个方案需要 cookie 承接 token
gengchun
2021-11-26 14:33:47 +08:00
@hhyyd refesh token 总感觉有些多余。一次要整两个 token ,一个 refresh 和一个 access 。

而目的好像只是防止第三方的 js 脚本可以读取 access token ,但是读不了 refresh token 。这个设计还有别的目的吗?
AllenHua
2021-11-26 16:21:30 +08:00
@zhleonix #20 长见识了
@gengchun #25 我原本也是这样认为的,但是新的认知还得重新建立
chtcrack
2021-11-27 16:35:19 +08:00
从来不用 jwt,都是自己设计一套 token 系统..
kssss
2021-11-28 09:26:45 +08:00
刷新啥,让用户退出重新登录
AllenHua
2021-11-28 09:56:18 +08:00
@kssss #28 给你补充个 doge
poorcai
2022-12-08 18:01:07 +08:00
@xxfye #23 这样会不会比 refresh_token 危险一些?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/817906

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX