使用NestJS时,刷新Access Token是否需同步更换Refresh Token?
Refresh Token刷新Access Token的最佳实践(NestJS场景)
直接给结论:优先选场景1——刷新时吊销原Refresh Token并生成新的Refresh Token,这是行业内的通用最佳实践,原因主要有这几点:
- 安全性更高:要是原Refresh Token不小心泄露了,攻击者最多只能用它刷新一次Access Token,因为刷新后原Token就失效了,不会被反复滥用,能把风险降到最低。
- 可控的生命周期:通过定期轮换Refresh Token,你可以限制单个Refresh Token的最长有效时间,就算真的泄露,攻击者能利用的窗口也很短。
- 对齐主流方案:像Auth0、Okta这类成熟的身份认证服务,都是采用这种Token轮换机制,OAuth2的官方最佳实践也推荐这么做。
再说说场景2的问题:如果刷新时不换Refresh Token,一旦这个Token泄露,攻击者可以一直用它刷新Access Token,直到Token过期。要是你的Refresh Token有效期设得长(比如7天以上),那风险就很大;如果设得太短,用户又得频繁重新登录,体验很差。
结合你用的NestJS,给点具体实现的建议:
- 先把Refresh Token存在数据库里,字段至少要有
userId、refreshToken、expiresAt、isRevoked,用来跟踪每个Token的状态。 - 写
/api/refresh-token接口的时候,步骤要清晰:- 先校验传入的原Refresh Token,检查是否过期、是否已经被吊销。
- 校验通过后,把原Token标记为
isRevoked = true。 - 用
@nestjs/jwt生成新的Access Token和Refresh Token。 - 把新的Refresh Token存到数据库,然后一起返回给客户端。
- 客户端那边要注意,收到新的Refresh Token后,必须替换掉旧的,不然下次再用旧Token刷新就会报错。
内容的提问来源于stack exchange,提问作者cheng
相关产品推荐
相关产品推荐

