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

3 天前
 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:轻喷,心平气和
6122 次点击
所在节点    程序员
67 条回复
Alliot
3 天前
accessToken 用来真正的访问资源, 它通常是无状态的 JWT , 带有时间戳,过期时间短。

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

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


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

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

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

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

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

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

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

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

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

© 2021 V2EX