Redis

关注公众号 jb51net

关闭
首页 > 数据库 > Redis > Redis会话机制和JWT机制

Redis会话机制和JWT机制深度解析

作者:向日的葵006

本文对比分析了Redis会话机制和JWT机制的差异与应用场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

登录鉴权是每个系统的第一道门,而"Token 存哪里"是这个模块最核心的架构决策。同样是登录成功后给前端发一个 Token,Redis 会话机制和 JWT 机制背后是两种截然不同的架构哲学:前者把状态留在服务端,服务端掌握绝对控制权;后者把状态推给客户端,服务端彻底"失忆"换取无状态扩展能力。

本文基于一张完整的运行过程对比图,分三部分展开:第一部分拆解 Redis 会话(Session)机制的完整运行链路,第二部分拆解 JWT 机制的完整运行链路,第三部分给出七个维度的对比总结和可落地的选型建议。

第一部分:Redis 会话(Session)机制运行过程

1.1 总体思路:服务端记住一切

Redis 会话机制的本质是"服务端记住一切"。登录成功后,服务端生成一把无意义的、不可伪造的"钥匙"(session_token),把真正的用户身份信息作为"行李"寄存在 Redis 里,然后把钥匙通过 Cookie 交给浏览器。之后每次请求,浏览器自动带钥匙上门,服务端拿钥匙去 Redis 开柜取行李。

这个模型的关键词是:Token 本身没有信息量,它只是一个索引。

1.2 登录阶段的完整执行链路

Step 1:用户登录

前端提交账号 + 密码(明文,依赖 HTTPS 保护传输安全),请求 POST /login (account, password)。

Step 2:查 MySQL

服务端查询 users 表,获取用户信息:(id, username, password_hash, status)。注意这里取出的是密码哈希,绝不存储明文密码。

Step 3:密码校验

使用 bcrypt.checkpw(明文密码, 数据库 password_hash) 进行校验:

bcrypt 自带盐值且计算成本可调,是目前密码存储的工业标准,这一步在两种机制中完全一致。

Step 4:雪花算法生成 session_token

用雪花算法(Snowflake)生成全局唯一的 session_token。它就是那把"会话钥匙":无业务含义、不可猜测、天然适合分布式发号。

Step 5:写入 Redis

把会话数据写入 Redis,这是整个机制的核心动作:

TTL 的设置让会话天然具备"到期自动销毁"的能力,不需要额外的清理任务。

Step 6:下发 Cookie + 返回用户信息

通过响应头下发凭证:

Set-Cookie: fitmall_session=session_token; HttpOnly; Path=/

同时返回 JSON(user: {昵称, 头像...}),前端可将其存入 localStorage 用于页面渲染。注意区分这两份数据:Cookie 里的 session_token 是鉴权凭证,localStorage 里的用户资料只是展示数据,前者决定"你是谁",后者只负责"页面画什么"。

1.3 后续请求:浏览器自动携带 Cookie

登录之后,浏览器会在每次请求的请求头中自动携带 Cookie: fitmall_session=xxx。这是 Cookie 的天然行为,前端不需要写任何鉴权相关代码。

1.4 后端鉴权流程

服务端收到请求后的鉴权动作只有两步:

  1. 从 Cookie 中取出 session_token;
  2. 去 Redis 查询 Key: session:{session_token}:
    • 查到,鉴权通过,放行;
    • 查不到(不存在或已过期),会话失效,返回 401 未登录。

1.5 访问业务数据

鉴权通过后,服务端根据 user_id 去 MySQL 查询真实业务数据(如订单、资料等),返回给前端。至此一次完整的请求闭环结束。

1.6 Redis 会话机制特点

特点说明
服务端存储会话会话信息存储在 Redis 中,Key 为 session:{session_token},Value 为用户身份信息 + TTL
安全性高Cookie 设置 HttpOnly 后,JS 无法读取,天然防 XSS 窃取凭证
可主动失效删除 Redis 中的 Key,即可立即让指定用户下线
服务端有状态每次请求都需要访问一次 Redis,鉴权依赖外部存储
扩展性需要保证 Redis 高可用;但因为会话集中存储,反而天然支持分布式 Session 共享,多台应用服务器无差别鉴权

第二部分:JWT 机制运行过程

2.1 总体思路:客户端自带一切

JWT(JSON Web Token)机制的本质是"客户端自带一切"。服务端在登录成功后,把用户身份信息直接编码进 Token 并加上密码学签名,然后彻底"失忆",服务端不存任何会话数据。之后每次请求,前端出示这张"身份证",服务端只做两件事:验真伪(签名校验)、查有效期(exp 检查)。

这个模型的关键词是:Token 本身就是信息载体,验签通过即信任。

2.2 登录阶段的完整执行链路

Step 1:查 MySQL 验证用户

查询 users 表,使用 bcrypt 校验账号密码。这一步与 Redis 会话机制完全相同,登录入口的安全性不因为 Token 方案不同而有差别。

Step 2:生成 JWT Payload

构造包含用户身份与有效期的载荷:

payload = {
  "user_id": 123,
  "role": "user",
  "exp": 1719220000
}

需要特别强调:Payload 只是 Base64 编码,不是加密,任何人拿到 Token 都能解码查看内容,所以绝不能在 Payload 里放密码、手机号等敏感信息。

Step 3:签名生成 JWT

使用密钥(对称的 HS256 或非对称的 RS256)对 Header + Payload 计算签名,拼出完整的 JWT 字符串。签名的意义在于:服务端可以识别出任何对 Payload 的篡改,改一个字节,验签就会失败。

Step 4:返回 JWT 给前端

把完整 JWT 返回给前端,由前端自行存储在 localStorage 或 Cookie 中。服务端到此为止,不落下任何状态。

2.3 后续请求:前端主动携带 JWT

与 Cookie 的自动携带不同,JWT 需要前端在每次请求时显式地把 Token 放进请求头:

Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

携带的是整条 JWT 字符串。

2.4 后端鉴权流程(无需查 Redis)

这是 JWT 机制最有吸引力的地方,鉴权完全在本地计算完成:

  1. 从 Authorization 头中取出 JWT;
  2. 使用密钥校验签名合法性;
  3. 校验通过,解析 payload,拿到 user_id、role、exp;
  4. 检查是否过期(exp):
    • 未过期,鉴权通过,放行;
    • 已过期,返回 401 未登录。

整个过程不查 Redis、不查数据库,一次签名运算就完成鉴权。

2.5 访问业务数据

鉴权通过后,同样根据 user_id 去 MySQL 查询真实业务数据(如订单、资料等)。可以看到,两种机制的差异只在"认人"环节,业务数据访问环节完全一致。

2.6 JWT 机制特点

特点说明
客户端存储全部信息JWT 自身包含用户身份信息,服务端无需存储会话
无状态每次请求只需校验 JWT 签名,不依赖 Redis,鉴权成本是一次本地运算
可扩展性强任何服务节点用同一把密钥(或公钥)即可独立验签,天然适合分布式、微服务架构
安全性Signature 防篡改,可配合 HTTPS;建议存储在 HttpOnly Cookie 中降低 XSS 窃取风险
最大短板:无法主动失效只要没过期就一直有效;密码修改、强制下线无法立即生效;若需主动失效,必须引入黑名单 Redis,等于放弃无状态优势

第三部分:对比总结与选型建议

3.1 七维对比表

对比项Redis 会话(Session)机制JWT 机制
存储位置服务端 Redis 存储会话信息客户端存储 JWT
鉴权方式每次请求查 Redis每次请求校验 JWT 签名(无需查 Redis)
状态有状态无状态
主动失效可主动删除 Redis Key 立即失效默认无法主动失效(需黑名单方案)
安全性高(Cookie HttpOnly + Redis 存储)较高(签名防篡改,但 payload 明文可解码)
性能每次请求多一次 Redis 查询性能更好,无需查 Redis
适用场景适合需要强制下线、会话管理的系统适合分布式、微服务、移动端、前后端分离

3.2 差异的本质:状态在谁手里

把七行对比收敛成一句话:状态在谁手里,谁就掌握主动权,同时谁就承担可用性责任。

理解了这一层,选型就不再是"哪个更先进",而是"我的系统更缺什么"。

3.3 选型建议

选 Redis 会话机制,当:

选 JWT 机制,当:

3.4 架构师的实践补充

真实项目里往往不是二选一,几个工程上常用的折中方案值得知道:

结语

Redis 会话机制与 JWT 机制没有高下之分,它们是对"信任与状态应该放在哪里"这一问题的两种回答。会话机制信任服务端的存储,JWT 信任密码学的签名。作为架构师,需要做的不是站队,而是看清自己系统的控制力诉求、扩展性诉求和运维成本底线,然后把票投给最匹配的那一个。如果你的业务同时需要两者的好处,那么"短期 JWT + 长期 Refresh Token"的混合架构,值得作为默认起点。

到此这篇关于Redis会话机制和JWT机制深度解析的文章就介绍到这了,更多相关Redis会话机制和JWT机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文