不懂就问,请教一下前端无感刷新 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:轻喷,心平气和
6100 次点击
所在节点    程序员
67 条回复
webcape233
2 天前
tls + cookie 不香吗
ArianX
2 天前
refreshToken ,认证应该可以结合一些签名、特征校验吧,比如 refreshToken 只在一台设备、一个地址生效?
wangtian2020
2 天前
为了假装自己的系统很有价值会被人挟持 token
accelerator1
2 天前
这种双 token 对应的基本是 oauth2.0 ,查一下 oauth2.0 中对于这两个 token 的定义就明白了。

使用双 token 主要是为了防止 token 泄漏导致的安全问题。at 泄漏,一般两小时就过期了,风险可控; rt 泄漏,过期时间很长,所以一般不会频繁使用。

前端使用双 token ,主要的泄漏途径就是网络传输层面,被抓包了很容易拿到你的 token ,所以使用 at 减少风险;至于 xss ,目前主流的认证方式都没啥用。。。

当然,国内的认证服务基本不是完全基于 jwt ,都是有状态的,吊销 at 、rt 很容易,这样的场景下,是不是双 token 没啥区别了。
flytsuki
2 天前
我们小公司直接 token 存 redis,方便登录后踢掉上一个登录状态
accelerator1
2 天前
@webcape233 不香,现在浏览器基本默认禁止跨域携带 cookie 了,做页面嵌套基本会死,特别是内网环境没有固定域名的情况下。
aloxaf
2 天前
最能说服我的理由是——你不信任使用 at 的客户端。

比如第三方提供的集成服务,我不希望它能拿到有效期很长的 at 。短 at + 长 rt 就能确保用户不使用服务后它能迅速失去对用户资料的访问权。
samnya
2 天前
根据 accessToken 能被泄漏的理论,我觉得他既然能抓取到 token ,也能够直接篡改返回值。
那么直接把用户的响应改成 401 ,客户端就会立刻触发刷新 token 流程,此时就获得了 refreshToken
2han9wen71an
2 天前
我们公司的 rt 和浏览器指纹还有用户 Ip 绑定,不一致就失效。
另外 at 的用途:
1. 用户及时下线,at 一般是 15 分钟,rt 是一个星期
2. 减少用户访问 rt 的次数,一般 rt 放数据库做鉴权,实际上就是账号加密码
canvascat
2 天前
之前加了双 token ,去年又去掉了
clocean
2 天前
斗鱼直播是不是使用了这个技术?反正作为用户来说,体验无敌,登录一次之后就没登录过了
telemsg
2 天前
1. 既然 rt 长期有效,直接用 rt 有啥问题
2. 如果从安全考虑,rt 被抓包拿了,也没辙呀
3. 既然后端知道用户操作了,如果是非异常操作,就自动给 token 延时行不?

1 ) rt 过期了咋办? 重新登陆微信? rt+at 能灵活控制过期时间 ( rt 还能 revoke )
2 )对。 什么技术抓包也没有办法。 尽量 https
3) 自动延时? 什么情况触发? 我开发业务还需要关心? 你们在网关配置好,我业务开发可不管 (分离)
abc1310054026
2 天前
@accelerator1 过滤掉跨域的 cookie 是正确的。当然你可以设置 cookie 跨域共享。
telemsg
2 天前
产生了新的疑问:
有几位提到了 at 不可修改,所以一般有效期设置的较短,那么
1. 当用户修改了账号密码时,会主动通知资源服务器 at 过期了吗?
2. 我不知道 1 的答案,所以先假设不通知,那该怎么办呢?

1 )通知了也没有用,at 就是无状态的,所以尽量是配置较短的时间
这里延伸出另一个问题: 如何做单点退出? (简单来说就是要清理 client token, at 本身还是有效的)
leokun
2 天前
听了大家的回答,我认为 accessToken 是给 refreshToken 打补丁的
refreshToken 每次都会访问用户数据库,accessToken 不需要。
所以 accessToken 本质上是 refreshToken 的离线存储,保证一段时间内不需要再次访问数据库
leokun
2 天前
@leokun 前面提到 refreshToken 是给 accessToken 打补丁,我觉得说反了
cat
2 天前
@samnya 卧槽牛逼!新思路!
635925926
2 天前
@shenyuzhi 现在单 token 基本存 redis ,也不存在什么性能问题啊
635925926
2 天前
@samnya 直接抓 rt ,在 pre-post 中每次获取最新 at 不是更爽
byte10
2 天前
回答其中一点,JWT 是无状态的,去中心化,无法踢出。所有很多大聪明就会加一个 redis 存起来,来判断是否过期 就扔掉,也就是说单纯脱裤子放屁。

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

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

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

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

© 2021 V2EX