Redis在jwt中作用小结

 更新时间:2026年03月16日 09:29:45   作者:哈里谢顿  
本文主要介绍了Redis在jwt中作用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Redis 在上述认证流程中主要扮演状态管理者和性能加速器的角色,弥补了 JWT 无状态特性的不足。以下是具体作用:

核心作用:解决 JWT 的"不可撤销"问题

JWT 一旦签发,在过期前无法主动失效(这是无状态的双刃剑)。Redis 通过存储关键状态,实现了有状态的控制能力:

传统 JWT:签发 ──► 过期前一直有效(即使用户登出)
JWT + Redis:签发 ──► Redis 标记失效 ──► 即时作废

具体应用场景

Token 黑名单(登出失效)

场景 实现方式 Redis 数据结构 用户主动登出 将 Token 的 jti(唯一ID)存入 Redis,设置过期时间为 Token 剩余有效期 SET blacklist:{jti} 1 EX {remaining_ttl} 后台强制下线 同上,或存储用户级标记 SET user:{id}:force_logout 1

# 登出时加入黑名单
def logout(token_jti, exp_timestamp):
    ttl = exp_timestamp - current_time()
    redis.setex(f"blacklist:{token_jti}", ttl, "revoked")

# 验证时检查
def is_token_valid(token_jti):
    return not redis.exists(f"blacklist:{token_jti}")

多端登录控制

限制同一账号同时登录设备数(如 QQ/微信的"已在其他设备登录"):

# 登录时记录设备
redis.lpush(f"user:{user_id}:sessions", token_jti)
redis.ltrim(f"user:{user_id}:sessions", 0, 2)  # 只保留最近3个

# 验证时检查当前 Token 是否在列表中
valid_tokens = redis.lrange(f"user:{user_id}:sessions", 0, -1)
if token_jti not in valid_tokens:
    raise Exception("账号已在其他设备登录")

Refresh Token 存储

Access Token 短期有效(15分钟),Refresh Token 长期有效(7天),但需可撤销:

# 存储 Refresh Token 与用户绑定
redis.setex(
    f"refresh:{user_id}:{device_id}", 
    7*24*3600,  # 7天过期
    hash(refresh_token)  # 存储哈希值防泄露
)

# 刷新时验证
stored_hash = redis.get(f"refresh:{user_id}:{device_id}")
if stored_hash != hash(incoming_refresh_token):
    raise Exception("Refresh Token 无效或已轮换")

速率限制与安全防护

# 登录失败计数(防暴力破解)
key = f"login_attempts:{ip}"
attempts = redis.incr(key)
if attempts == 1:
    redis.expire(key, 3600)  # 1小时窗口
if attempts > 5:
    raise Exception("尝试次数过多,请稍后再试")

# Token 使用频率限制(防 Token 泄露后被滥用)
redis.zadd(f"token:{jti}:requests", {current_time(): current_time()})
# 清理1分钟前的记录
redis.zremrangebyscore(f"token:{jti}:requests", 0, current_time()-60)
if redis.zcard(f"token:{jti}:requests") > 100:
    # 1分钟内请求超过100次,可能泄露,加入黑名单
    redis.setex(f"blacklist:{jti}", 3600, "suspected_leak")

架构对比

方案 优点 缺点 适用场景 纯 JWT 完全无状态,扩展性强 无法强制失效,难以追踪 内部服务、短期令牌 JWT + Redis 黑名单 可撤销,保留无状态优势 每次验证需查 Redis 常规 Web 应用 纯 Redis Session 完全可控,可实时强制下线 有状态,扩展需共享 Session 高安全要求(金融)

关键设计原则

  1. 最小化存储:Redis 只存必要的状态标记(如黑名单),不存完整的用户数据
  2. TTL 对齐:Redis 键的过期时间严格对齐 JWT 的 exp 时间,避免永久堆积
  3. 异步清理:黑名单过期后自动删除,无需人工维护

本质:Redis 让 JWT 从"完全不可控"变为"可控的无状态",在架构简洁性和业务需求间取得平衡。

到此这篇关于Redis在jwt中作用小结的文章就介绍到这了,更多相关Redis jwt作用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Redis的Expire与Setex区别说明

    Redis的Expire与Setex区别说明

    这篇文章主要介绍了Redis的Expire与Setex区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Redis中HyperLogLog的使用详情

    Redis中HyperLogLog的使用详情

    这篇文章主要介绍了Redis中HyperLogLog的使用详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • 关于linux redis安装及安装遇到的问题

    关于linux redis安装及安装遇到的问题

    这篇文章主要介绍了关于linux redis安装及安装遇到的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Redis结合Lua脚本实现分布式锁详解

    Redis结合Lua脚本实现分布式锁详解

    Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 本文主要为大家介绍了Redis如何结合Lua脚本实现分布式锁,需要的可以参考下
    2024-02-02
  • 一篇文章揭秘Redis的磁盘持久化机制

    一篇文章揭秘Redis的磁盘持久化机制

    这篇文章主要给大家介绍了如何通过一篇文章揭秘Redis的磁盘持久化机制的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Redis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-09-09
  • redis使用skiplist跳表的原因解析

    redis使用skiplist跳表的原因解析

    经常会有人问这个问题,redis中为什么要使用跳表?这个问题,redis作者已经给出过明确答案,今天通过本文再给大家讲解下这个问题,对redis skiplist跳表知识感兴趣的朋友一起看看吧
    2022-10-10
  • Redis全量同步和增量同步原理

    Redis全量同步和增量同步原理

    主从第一次同步是全量同步:也就是说,当你主从节点连接建立后,需要执行一次全量同步,但如果slave重启后同步,此时slave重启后,slave节点和master节点的数据之间有落后,因此需要进行增量同步,感兴趣的同学可以参考阅读
    2023-04-04
  • Redis源码解析:集群手动故障转移、从节点迁移详解

    Redis源码解析:集群手动故障转移、从节点迁移详解

    这篇文章主要介绍了Redis源码解析:集群手动故障转移、从节点迁移的相关内容,涉及通过集群定时器函数clusterCron实现从节点迁移等知识,具有一定参考价值,需要的朋友可以了解。
    2017-10-10
  • 一文弄懂Redis Stream消息队列

    一文弄懂Redis Stream消息队列

    本文主要介绍了一文弄懂Redis Stream消息队列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Redis使用元素删除的布隆过滤器来解决缓存穿透问题

    Redis使用元素删除的布隆过滤器来解决缓存穿透问题

    本文主要介绍了Redis使用元素删除的布隆过滤器来解决缓存穿透问题,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08

最新评论