You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JWT技术问题:如何在数据库中存储多枚refreshToken?

多设备登录下Refresh Token的正确存储方案

先说说你可能的理解偏差:你之前应该是把refreshToken设成了用户全局唯一的,新登录就覆盖旧的,自然会踢掉旧会话。但实际上,refreshToken的设计本来就支持多设备同时在线,核心是给每个设备/会话单独分配refreshToken,而不是全账号共用一个。

下面是具体的实现方案:

  • 每个会话生成独立的Refresh Token
    每次用户登录(不管是新设备还是同一设备重新登),都生成全新的refreshToken,不覆盖旧的,而是把它和用户ID、设备信息(比如浏览器UA的哈希值、设备唯一标识)、登录时间、过期时间这些数据一起存在数据库里。数据库表可以这么设计:user_id, refresh_token(哈希存储), device_info, created_at, expires_at, is_revoked

  • 验证时匹配会话元数据
    当用户用refreshToken换accessToken时,除了验证token是否有效、过期,还要检查这个token对应的设备信息和当前请求的设备是否匹配(可选,看你安全需求),以及有没有被标记为已作废。

  • 做好Token的生命周期管理

    • 定期清理数据库里已过期的refreshToken,避免数据冗余;
    • 给用户加“登出某设备”的功能,把对应token标记成is_revoked;也支持“全局登出”,直接把该用户所有未过期的token都标记作废;
    • 要是想限制同时在线设备数,可以设个最大会话数,超过就自动把最早登录的那个会话的token作废。
  • 安全细节要到位
    每个refreshToken单独设过期时间,别所有token用同一个有效期;存的时候一定要哈希(比如用bcrypt),就算数据库被黑,攻击者拿不到原始token;传输全程用HTTPS,防止被劫持。

总结一下:你之前的问题出在“单token绑定用户”的设计,正确的思路是给每个会话/设备单独维护refreshToken,用数据库管理这些token的状态,既能支持多设备同时在线,又能保证账号安全。

内容的提问来源于stack exchange,提问作者Bình Phan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 06:05:37