jti
{
"sub": "user_1234",
"exp": 1717978888,
"jti": "c7613d8e-183f-4db9-bf67-0bfaad37b7f6"
}
字段 | 含义 | 生成方式 | 用途 |
jti | JWT 唯一 ID | uuid.uuid4() | 防重放攻击,保证 token 一次性 |
1 JTI 设置有效期(TTL)
ttl = exp_timestamp - int(time.time())
redis.set(redis_key, 1, ex=ttl)
大部分 JWT 设置 5~15 分钟,最长不建议超过 2 小时
2 Redis key 空间设计
jti:user_id:jti_value
例如
jti:12345:c7613d8e-183f-4db9-bf67-0bfaad37b7f6
3 Redis 容量评估
- 1 次登录 1 个 JTI
- JWT 有效期 10 分钟
- 100 万用户,每人 1 小时内活跃 10 次
- 每小时:100万 × 10 = 1000 万 JTI
- 但 TTL 是 10 分钟,所以实际同时在线的 key:
- → (10分钟/60分钟) × 1000 万 ≈ 166万 key
- Redis 存一个 key + value 粗略估算 100 Byte
- 166 万 key × 100 Byte ≈ 160 MB
- 对于现代 Redis 服务器,完全没问题(1-2G 内存空间轻松支撑)
4 避免 Redis 撑爆技巧
- 控制 JWT 有效期(5-10分钟最佳)
- 控制用户刷新频率,防止频繁发新 token
- Redis 设置 maxmemory-policy volatile-ttl:
- 只淘汰设置了 TTL 的 key,保障 jti key 优先被清理
- 可以使用 独立 Redis 实例 专门存 jti,和业务数据隔离
策略名 | 说明 |
noeviction | 不允许 Redis 淘汰任何 key,超出内存直接返回错误(一般别用) |
allkeys-lru | 所有 key 都能被淘汰,优先淘汰最近最少用的 key(危险,用户配置/重要数据也可能被淘汰) |
volatile-lru | 只淘汰带 TTL 的 key,优先淘汰最近最少用的 |
volatile-ttl | 只淘汰 TTL key,优先淘汰 TTL 最快到期的 key(你这种场景最合适) |