JWT刷新令牌轮转中的令牌家族是什么?如何创建?
一、JWT令牌家族的定义
JWT令牌家族并非RFC 7519标准中定义的概念,而是令牌轮转机制下的业界实践术语。它指的是同一用户会话生命周期内,所有通过刷新操作生成的访问令牌(AC)和刷新令牌(RT)组成的关联集合。
简单来说,用户首次登录拿到的第一对AC+RT属于一个家族,之后每次用有效RT刷新得到的新AC+RT,都归属于同一个家族。当服务器检测到恶意RT(比如重复提交、疑似泄露的令牌)时,作废整个家族就能一次性 invalidate 所有关联的令牌,避免攻击者继续利用该会话下的任何令牌进行操作。
二、创建JWT令牌家族的核心步骤
1. 生成唯一家族标识
为每个新会话(用户首次登录)生成一个随机且唯一的family_id(比如UUID),将这个ID嵌入到该家族的每一个AC和RT的JWT自定义Claim中(比如用fam作为Claim键)。
2. 服务器端维护家族状态
不需要存储所有令牌内容,只需要在服务器端记录每个用户对应的当前有效家族ID以及家族的状态(有效/作废)。可以用Redis、内存数据库或关系型数据库存储,比如以用户ID为键,存储值为{ "active_family_id": "xxx", "expire_at": "xxx" }。
3. 令牌轮转时保持家族关联
当用户使用有效的RT请求刷新令牌时,生成的新AC和RT必须沿用原有的family_id,确保整个轮转链都属于同一个家族。
4. 家族作废与重建逻辑
当检测到异常场景(比如RT重复使用、令牌不在有效家族列表中),立即将对应的family_id标记为作废。后续所有携带该ID的AC或RT,在验证阶段都会被直接拒绝。同时为用户生成新的family_id,并返回新的AC+RT令牌对,开启一个新的令牌家族。
内容的提问来源于stack exchange,提问作者Guerino Rodella

