关于 token 过期的疑惑,为什么需要 refresh token?

2021-12-08 18:00:08 +08:00
 nianyu

平时做项目早就习惯了,在拦截器中将 access token 放入 request header 头中,如果 token 过期,则请求 refresh token 接口,拿到一个新 token ( babalabala ,还有很多细节 isRereshing and 刷新过程中将新请求的 request 放入队列...)

但是一直不是很明白为什么需要 refresh token

疑问 1: 为什么不能将 token 设置的有效期长一些,失效就直接重新登陆,而需要不停的刷新 token, 毕竟 refresh token 过期的时候,总还是要重新登陆的。

在网上搜了相关问答,有人说用户不能正在进行操作时,突然因为 token 过期重新登陆了了,然而当 refresh 也过期的时候,依然要重新登陆。

疑问 2: 有人说是为了安全问题,如果 token 被人劫持,就可以冒充用户进行一些操作,所以需要将 token 的有效期设置的非常短,这样即使破译了 token ,没过几分钟就失效了,我觉得没有道理啊,客户端通常将 access token 喝 refresh token 存在 storage 中,或者说既然能拿到 token 为什么拿不到 access token 。

11185 次点击
所在节点    信息安全
42 条回复
liuxu
2021-12-16 22:13:28 +08:00
今天我也遇到这个问题,所以详细看了下 oauth2 refresh token 的 rfc ,https://datatracker.ietf.org/doc/html/rfc6749#section-1.5

简单的说,安全有等级,即使用 rsa 加密,是要不限制时间,你算个千百万年,也可以破解出来

access token 有 scope 限制资源范围,它只用于用户和资源方交互(资源方转而和授权方交互),同时限制有效时间,这样它存储在用户 client 端,如浏览器中,所以即使被盗取后也只能被盗取有限的信息,攻击面很窄

refresh token 一般只存储在绝对安全的环境,如用户 server 端,而且它只用于和授权方交互,更新 access token 等

oauth2 获取 access token 和 refresh token 都是强制要求 https 环境,也即是要保证信道安全,避免被网络劫持获取到

同时 oauth2 强制要求 refresh token 使用时必须能验证使用者身份来源,避免被冒充,方案一般有限制 refresh token 只能使用一次,这样攻击者获取到使用后,你再使用授权方会通知你 refresh token 已被使用,这样就可以发现当前用户 server 环境有安全问题,需要修复
或者限制 ip 白名单等
ioufev
2022-12-30 09:44:58 +08:00
正好和人最近讨论这个 token 刷新问题。
比如 token 有效期时 30 分钟,
用户登录 20 分钟后,有操作,需要续期。
否则用户正操作着呢,突然需要重新登录,体验太差了。
续期操作分前端和后端两种方式。
后端方式,简单粗暴就是将 token 的 redis 有效期重新设为 30 分钟,不过这样 token 自带的有效期就用不上了,不太推荐。
前端方式,token 剩余 10 分钟时,使用旧的 token ,申请个新的 token 。

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

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

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

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

© 2021 V2EX