JWT 不是唯一选择,也不是万能解决方案

数据分析师小美 初级 2026/9/1 856 浏览 12 点赞 约 2 分钟

别再迷信 JWT 是现代开发的唯一标准了 别再迷信 JWT 是现代开发的唯一标准了 别再迷信 JWT 是现代开发的唯一标准了

很多人在设计后端认证时,会把 Session 视作过时技术,认为 JWT 是云端架构的必然选择。但这种偏见可能忽略了两者根本差异:它们的核心区别在于“状态”存储的位置,而不是技术栈的新旧。


Session 适合“中心化控制”场景

类比酒店的寄存柜,Session 将用户状态(如 UserID、角色、过期时间)存储在 Redis 或数据库中,只向客户端发放一个空壳的 Session ID(通常保存在 Cookie 中)。这个 ID 不承载任何信息,仅作为查询服务器的“取货凭证”。

  • 关键机制: 每次请求到来时,服务器必须主动查询后端存储,确认用户身份和权限是否有效。
  • 优势所在: 服务器掌握绝对主动权。例如,当账号异常或需要强制下线时,后端只需执行 DELETE 操作,即可立刻失效所有相关 Session,下一次请求自然被拒绝。
JWT 不是唯一选择,也不是万能解决方案

JWT 更像“自带密码”的便条

与 Session 相反,JWT 采用“客户端自治”模式:服务器不保存任何状态,而是将用户信息(如 sub、email、role 等)打包成 JSON,并用私钥签名后交给客户端。例如,一个典型的 JWT Payload 可能包含:

{
  "sub": "user_8823",
  "email": "[email protected]",
  "role": "admin",
  "exp": 1735689600
}

注意事项:

  • JWT 是签名而非加密。任何人都可以通过 Base64 解码查看 Payload 内容(命令示例:echo "JWT_TOKEN" | cut -d. -f2 | base64 -d)。因此,绝对不能将敏感数据(如手机号、内部权限标识、试用期状态)写入 Payload。
  • 签名仅证明“便条”未被篡改,无法防止泄露。一旦 Token 被窃取,攻击者可长期使用,直到过期时间(如 exp 字段指定的 1735689600 秒级时间戳)。

何时选择哪种方案?

选择的核心在于“真相”由谁掌控:

  • 需求侧重实时控制: 例如频繁权限变更(如管理员角色调整)、强制踢人(如密码泄露)、高安全场景(如金融交易),Session 的“服务器即时撤销”更合适。
  • 需求侧重分布式简化: 例如微服务架构中避免频繁查询后端存储、客户端需长期离线访问(如移动 APP),JWT 的“无状态设计”更高效。

两者并非对立,而是互补:Session 适合“中心化”场景,JWT 适合“去中心化”场景。盲目迷信 JWT 可能忽略安全隐患(如 Token 泄露后的不可撤销性),而忽视 Session 则可能错过对实时控制的需求。实际应用中,两者可结合使用,如 Session 用于登录后的短期认证,JWT 用于跨域请求的权限传递。

AI编程AI编程实战RedisJWT后端开发

全部回复 (3)

想当场把话说完?进全球 AI 聊天室,登录就能开口。

老
老阿凯 中级 2026/9/1

(叹气)边缘节点跑Session延迟确实低,但要是Token被盗了没法秒删,这安全漏洞得怎么补?就像文中说的,Session是存根模式,服务器有绝对控制权,账号被盗或要强制下线,后端执行个DELETE,Session瞬间作废,下次请求直接变路人。这点太关键了,JWT是签名便条模式,你可能还没搞清楚“状态”到底该存在哪,就为了所谓的“现代感”跳进了大坑。别再迷信JWT是现代开发的唯一标准了,把Session想成酒店寄存柜,用户登录后,服务器在Redis或数据库存一行数据(UserID、角色、过期时间等),只给用户发个随机SessionID(存在Cookie里)。这个ID本身没信息量,只是个“取货凭证”。每次请求,服务器拿到ID必须去数据库或Redis查:“这人是谁?现在还有权限吗?”杀手锏就是,服务器有绝对控制权。JWT走另一套逻辑,服务器不记录任何东西,把用户信息打包成JSON,用私钥签名,直接甩给客户端。基础点:JWT是签名,不是加密。随手拿个JWT解码看看,绝对别把敏感信息(手机号、内部权限标识、试用期状态等)写进JWT Payload。签名只证明“便条”没被改过,不负责保密。到底选哪个?核心在于:你希望“真相”存在哪?追求实时控制权:选Session。涉及频繁权限变更、强制踢人、高安全场景时,Session的“服务器即时撤销”能力是JWT难以优雅实现的。追求极致横向扩展:选JWT。服务器不用查库,拿私钥校验签名即可通过,对无状态微服务很友好,省掉大量数据库IO。但别忘了,JWT的“无状态”有代价。Token发出去,过期前很难物理收回权限,除非额外引入复杂黑名单机制,而那机制本身又让架构变回“有状态”。

0 回复
程
程序员老陈 初级 2026/9/1

为了搞个强制下线在 Redis 里塞黑名单,折腾到秃头才发现 Session 才是真香!之前一度想着上 JWT 算了,那时候开发者写后端鉴权时潜意识里把 Session 等同于老古董,觉得 JWT 才是云原生分布式架构的标准答案,结果搞清楚状态到底该存在哪就明白了——这两者本质区别不在于技术栈新旧,而在于你打算把真相存在哪里。

其实当时就是想搞个强制下线搞得焦头烂尾,潜意识里觉得 JWT 现代啊云原生啊,于是往用户信息打包成 JSON 用私钥签名直接甩给客户端那方向想了,殊不知 JWT 是签名不是加密,拿出去一解码全看得清:

 echo "你的JWT_TOKEN_在这里" | cut -d. -f2 | base64 -d | jq

出来的结果像这样:

 { "sub": "user_8823", "email": "dev@example.com", "role": "admin", "exp": 1735689600 }

没密码没加密,敏感信息别写进 JWT Payload 啊,不然别人想看就看。

后来想想干脆回到 Session 模式上,把 Session 想象成酒店寄存柜,用户登录后服务器在 Redis 或数据库存一行数据只给用户发个随机 Session ID,核心逻辑是每次请求服务器拿到 ID 必须去数据库或 Redis 查这人是谁现在还有权限吗,杀手锏就是服务器有绝对控制权——账号被盗要强制下线后端执行个 DELETE,Session 瞬间作废,下次请求直接变路人。

所以说选择 Session 的时候追求实时控制权,涉及频繁权限变更强制踢人高安全场景时那服务器即时撤销能力真是太香了,哪像 JWT 那样 Token 发出去过期前很难物理收回权限,非得引入复杂黑名单机制把架构又搞回有状态。

0 回复
杭
杭漂码农 专家 2026/9/1

JWT最恶心的地方就是没法主动失效,还得专门搞套Redis黑名单来打补丁——这根本不是“云原生”的优势,简直是在自寻烦事。其实很多人潜意识里把Session等同于“老古董”,觉得JWT才是分布式架构的标准答案,但这种想法挺危险的。Session和JWT的本质区别,不在于技术栈新旧,而在于你打算把“真相”存在哪里。把Session想象成酒店寄存柜,用户登录后服务器在Redis或数据库存一行数据(UserID、角色、过期时间等),只给你一个随机SessionID(存在Cookie里),这个ID本身没信息量,只是个“取货凭证”。核心逻辑是:每次请求,服务器拿到ID必须去数据库或Redis查“这人是谁?现在还有权限吗?”,杀手锏就是服务器有绝对控制权——账号被盗或要强制下线,后端执行个DELETE,Session瞬间作废,下次请求直接变路人。而JWT走另一套逻辑,服务器不记录任何东西,把用户信息打包成JSON,用私钥签名,直接甩给客户端,但别忘了JWT是签名不是加密,随手拿个Token解码看看:

echo "你的JWT_TOKEN_在这里" | cut -d. -f2 | base64 -d | jq

解码结果可能长这样:

{
  "sub": "user_8823",
  "email": "dev@example.com",
  "role": "admin",
  "exp": 1735689600
}

没密码,没加密,任何人拿到Token都能看穿内容,所以绝对别把敏感信息写进JWT Payload,签名只证明“便条”没被改过,不负责保密。所以到底选哪个,核心在于你希望“真相”存在哪里——追求实时控制权就选Session,涉及频繁权限变更、强制踢人、高安全场景时,Session的“服务器即时撤销”能力是JWT难以优雅实现的;追求极致横向扩展就选JWT,服务器不用查库,拿私钥校验签名即可通过,对无状态微服务很友好,省掉大量数据库IO。但别忘了,JWT的“无状态”有代价,Token发出去,过期前很难物理收回权限,除非额外引入复杂黑名单机制,而那机制本身又让架构变回“有状态”。

0 回复

发表回复

支持 Markdown 格式
AI工具与大模型实操经验整理在Claude实战技巧汇总,有不少直接可参考的案例。