不懂就问,请教一下前端无感刷新 token 到底有没有意义?

356 天前
 MingLovesLife
在技术网站看到过无数次前端无感刷新 token 的文章,一直很费解,为啥要刷新 token 呢?那前端给 token 刷新了,token 还有啥意义呢?

文章给出的原因是,用户正操作着呢,token 突然过期,跳登录页用户体验不好。

实现步骤:
accessToken 简称 at ,refreshToken 简称 rt
1. rt 有效期长,at 有效期短
2. at 过期了拿 rt 换 at ,重新请求

疑问:
1. 既然 rt 长期有效,直接用 rt 有啥问题
2. 如果从安全考虑,rt 被抓包拿了,也没辙呀
3. 既然后端知道用户操作了,如果是非异常操作,就自动给 token 延时行不?

不知道该方案具体是为了什么,还请大神们赐教。希望接到类似需求老哥们聊聊

PS:轻喷,心平气和
9395 次点击
所在节点    程序员
67 条回复
Alliot
355 天前
accessToken 用来真正的访问资源, 它通常是无状态的 JWT , 带有时间戳,过期时间短。

refreshToken 一般在服务端有存(方便吊销),过期时间长

这样的好处是,用户的访问直接使用 accessToken, 这样不会每次都需要访问服务端鉴权,可以降低服务端压力。


比如 accessToekn 30s 过期,那鉴权部分就从每次请求都鉴权-> 变成了 30s 才访问一次鉴权续期

降低了服务端压力
zorui
355 天前
@635925926 使用 jwt 服务端不需要存储, 只需要算法验证, 短短的 token ,要么服务端存储,要么搞一套新的算法规则 还不如 jwt 呢。jwt 最大优势就是只需要算法验证验证就行。
dogfeet
355 天前
对于我们这种游戏业务,只允许单客户端登录的,有很重要的意义。

1. rt 的存在,就是为了减少核心认证数据的传输频率(比如账号密码,手机验证码等)
2. rt 会持久化,at 的校验成本更低,往往会存在内存中直接校验。
3. rt 无法用来登录,只能用来刷新 at ,重点是一个账户只有唯一的一个有效 rt ,每次刷新都需要当前正确的 rt ,刷新后 rt 会变,之前的 rt 就失效了。如果所谓的 rt 被抓包拿了,除非只有你一个人用,否则,用户刷新失败触发账号密码或验证码登录,此时刷新的 rt 会覆盖掉抓包拿的 rt 。也就是游戏中的发现自己被挤下来后,自己用最高优先级的账号密码登录,对方就无法再登录了。

重点:
rt 只能使用一次,这是与账户密码最大的不同点。
rt 只能使用一次,这也是与 at 最大的不同点,成本较 at 高。

总结:
正常用户的使用过程中,几乎很少触发账户密码验证码登录,体验更好。
非正常使用过程中,也能一定程度的保证安全。
减少账户密码的传输频率也能降低其被窃取的风险。
635925926
355 天前
@zorui jwt 无状态,不储存,无法被控制。反而是缺陷。
sardina
355 天前
你说的这种不用 rt 直接把 at 刷新也可以实现无感刷新这种双 token 主要还是用在 oauth2 里,第三方应用申请一个 rt ,然后用 rt 去申请 at ,at 有过期时间,过期了用 rt 去重新获取
这里有一篇文章可以学习学习 https://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
meteora0tkvo
355 天前
单纯是后端懒得写自动延长 token 有效期的业务,所以交给前端来调取憋屈的“刷新 token”接口
dengkj
355 天前
设计两个 token 主要是为了平衡安全性和便利性。

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

https://ex.noerr.eu.org/t/1102949

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

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

© 2021 V2EX