同志们,技术问题来了,大家讨论下, jwt 续签为什么要使用双 token

2025 年 12 月 18 日
 lusxh
Access Token 和 Refresh Token 有什么区别呢?为什么需要两个 token? 有什么优点吗?
9170 次点击
所在节点    程序员
80 条回复
tanxnative
2025 年 12 月 18 日
抖音上徐庶说, 这样安全!
shakaraka
2025 年 12 月 18 日
首先,这种问题在 v2 算是日经贴的了,搜一下就有了,其次直接问 GPT 就有很标准的答案的。

另外我再回答一下吧

Access Token 是让网关去进行身份认证的,不需要查询数据库,数据库没有压力,高流量场景不需要查询 redis 、db 等,也支持分布式,同时 Access Token 不会授权很长时间

Refresh Token 是需要查询 db 的,因为要对用户进行一些业务逻辑判断,分析是否能够重新下发 Access Token
ty29022
2025 年 12 月 18 日
一种工程上的 trade off
本质上是想把无状态的 jwt token 变成有状态的
然后把每次状态的查询成本摊到 n 秒一次(refresh token 的过期时间)
zhlssg
2025 年 12 月 18 日
无感知续签,token 是有有效期的,Refresh 可以在用户过期时续签 token ,无需用户重新登录
yiqiao
2025 年 12 月 18 日
@shakaraka 确实,好像见过不止一次了。不过很多人都不用 RefreshToken ,Access Token 过期就直接重新登录了。
shakaraka
2025 年 12 月 18 日
@yiqiao #5 想要完全后端类决定前端生死的只能是 session 的模式。没有比这种掌控力更强了。token 模式多数用在互联网产品中。像是金融客户系统就多数是类似 session 模式的
cfancc
2025 年 12 月 18 日
问 ai 或者百度
zxjxzj9
2025 年 12 月 18 日
理论上一直用一个 token 来鉴权也不是不行,问题就在于 jwt 这样的无状态 token 不改秘钥不设置过期时间,token 发下去就会永久有效。为了让服务端有办法能让 token 过期但是又利用无状态特性,实践上把这一个 token 拆成两个,验证的时候用 access token ,让鉴权的时候不需要访问数据库直接端侧完成。refresh token 完全可以理解成一个 session id, 只要会话不过期服务端就可以给你续签,好处就是直接把请求 db 的次数用 access token 全压下去了。 这两个 token 也没明说非要用 jwt ,只不过如果要用的话全用 jwt 可以少造点轮子。
yeqizhang
2025 年 12 月 18 日
虽然是月经帖,但我还是没得出标准结论,之前有从网络安全来讲的,也见过像第三方授权如对接微信那种又是不一样的,今天又在这里说查不查数据库的……
zuixinwenyue
2025 年 12 月 18 日
只是表示讨论,国内好多大厂对外开放的 api 都是双 token 模式,肯定是有一定优势的,我说一下我自己的理解吧。
zuixinwenyue
2025 年 12 月 18 日
@zuixinwenyue 没想到拍了回车就回复了
lusxh
2025 年 12 月 18 日
@shakaraka 只是为了减轻数据库的压力吗?两个 token 都可以不查数据库么。
lusxh
2025 年 12 月 18 日
@yeqizhang 确实看到很多地方讨论这个问题,说什么的都有,面试有时候也被问到,随便几句就敷衍过去了,就是不自信,感觉没有触及到深处
zuixinwenyue
2025 年 12 月 18 日
@zuixinwenyue
先说一些传统的 token 模式有状态和无状态
1.有状态:cookie 或者 uuid 生成一个 token 放请求头里,这些都属于有状态。服务侧缓存 token 信息
2.无状态: jwt 本身就带了 token 的信息&用户信息;

分析一下痛点,可能举例不完善:

有状态: 每次请求进来需要查询缓存啊 or 数据库,影响性能
可以做判断 token 是否存在啊 用户是否登录过期啊 用户有没有被禁用 也可以做到用户信息发生修改 踢用户下线之类的操作 只允许一端登录啊。可控性非常大;

无状态: 无状态的话就不需要查询数据库了,从性能来讲肯定是比有状态要好的,服务侧拿到只需要验签就可以。
缺点也很明显,上面说到有状态能做的都不行

双 token 我自己感觉是折中了一下 在需要性能+用户可控方面折中,一般来讲 accessToken 是无状态的用于快速验证 过期时间较短,refreshToken 是有状态 用于判断用户信息之类的操作 过期时间较长。这样就可以在性能和用户可控方面折中啦。
以上是我的浅见
SethShi
2025 年 12 月 18 日
提一嘴.
JWT 没有双 token, 它只定义了 token 的格式
楼上说的国内大厂的那种是 OAuth 2.0

至于你要问的问题, 楼上的答案都差不多了, 当然不排除很多人是“为了遵守协议( OAuth2 )”而盲目使用双 Token
zuixinwenyue
2025 年 12 月 18 日
网上说什么的都有 有说是为了让用户无感续签,之前做的项目是有状态的 每次用户请求进来都会给 token 续期。我之前面试也被问过这个问题 我回答的就是用户带 token 进来验证成功就续期一下 现在想起来问的应该是双 token 。但是我理解使用双 token 不是为了续签,更是为了追求性能+用户可控性一个折中的方案;
zuixinwenyue
2025 年 12 月 18 日
@SethShi oauth2.0 是提供授权码,最后用授权码换回来的就是双 token 。
Ketteiron
2025 年 12 月 18 日
@yeqizhang #9 标准结论一直都有啊,用不用 jwt 只看需不需要 jwt 。
jwt 实际上是拿 cpu 解密开销换取数据库查询开销,为了安全性可能会双 token(15 分钟危险期) or 单 token+redis(秒级封禁)。除此之外有非常多的组合方法,但各有侧重点没有高下之分,软件开发不存在通用最优解。
softlight
2025 年 12 月 18 日
看了下,access token 只需要校验 token 是否有效,无需外部依赖查询。Refresh Token 分发 Access Token 时,需要额外查询,比如用户是否被禁用, 权限是否发生变更,账号是否被封。 在性能和可控当中,做这个折衷选择
shakaraka
2025 年 12 月 18 日
@lusxh #12 你这句话完整复制给 AI 就有很详细的回复了,这里不赘述了

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

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

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

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

© 2021 V2EX