卡飞资源网

专业编程技术资源共享平台

几百万用户 + JTI 防重放设计

jti

  • jti 是 JWT 标准字段,全称 JWT ID
  • 用来给 JWT 赋予一个 唯一 ID
  • {
      "sub": "user_1234",
      "exp": 1717978888,
      "jti": "c7613d8e-183f-4db9-bf67-0bfaad37b7f6"
    }
  • 例如这里 jti 是 c7613d8e-183f-4db9-bf67-0bfaad37b7f6
  • 通常是 UUID v4,每次调用 generate_jwt 时新生成
  • 字段

    含义

    生成方式

    用途

    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(你这种场景最合适)

    控制面板
    您好,欢迎到访网站!
      查看权限
    网站分类
    最新留言