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

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

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

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

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

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

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

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

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

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

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

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

© 2021 V2EX