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

数据分析师小美 初级 1天前 748 浏览 12 点赞 约 2 分钟

很多开发者在写后端鉴权逻辑时,潜意识里会觉得用 Session 简直是“老古董”,而 JWT 才是云原生、分布式架构下的标准答案。这种想法其实挺危险的,因为你可能在还没搞清楚“状态(State)”到底该存在哪之前,就为了所谓的“现代感”跳进了一个巨大的坑里。

其实这两者的本质区别,不在于技术栈的新旧,而在于你打算把“真相”存在哪里。

Session 的本质是“存根”模式

你可以把 Session 理解为酒店的寄存柜。用户登录成功后,服务器在 Redis 或数据库里存一行数据(包含 UserID、角色、过期时间等),然后只给用户发一个随机的 Session ID(存在 Cookie 里)。

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

这个 ID 本身没有任何信息量,它只是一个“取货凭证”。

  • 核心逻辑: 每次用户发起请求,服务器拿到 ID 后,必须去数据库或 Redis 里查一下:“这人是谁?他现在还有权限吗?”
  • 杀手锏: 服务器拥有绝对控制权。如果发现某个账号被盗了,或者想强制某个用户下线,你只需要在后端执行一个 DELETE 操作,这个 Session 瞬间就废了,用户下一次请求直接变路人。
别再迷信 JWT 是现代开发的唯一标准了

JWT 的本质是“签名便条”模式

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

JWT(JSON Web Token)完全是另一套逻辑。服务器不再记录任何东西,而是把用户信息打包成一个 JSON 对象,用私钥签个名,直接甩给客户端。

这里有个非常基础但极其容易踩坑的点:JWT 是签名,而不是加密。

你可以随手拿一个 JWT 放到终端里解码看看:

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

# 拿到 Token 后,直接截取中间部分进行 Base64 解码
echo "你的JWT_TOKEN_在这里" | cut -d. -f2 | base64 -d | jq

解码出来的结果可能长这样:

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

你看,没有任何密码,没有任何加密。任何人拿到这个 Token,都能一眼看穿里面的内容。所以,绝对不要把任何敏感信息(比如用户的手机号、内部权限标识、甚至试用期状态)写进 JWT 的 Payload 里。签名只是为了证明这封“便条”没被篡改过,并不负责保密。

到底该选哪一个?

问题的核心在于:你希望“真相”存在哪?

  • 如果你追求实时控制权: 选 Session。当业务逻辑涉及到频繁的权限变更、强制踢人、或者对安全性要求极高的场景时,Session 提供的“服务器即时撤销”能力是 JWT 很难优雅实现的。
  • 如果你追求极致的横向扩展: 选 JWT。因为服务器不需要查数据库,只要拿着私钥校验一下签名就能通过,这对无状态的微服务架构非常友好,能省掉大量的数据库 IO 开销。

但别忘了,JWT 带来的“无状态”是有代价的。一旦 Token 发出去,在它过期之前,你很难从物理上完全收回它的权限,除非你额外引入一套复杂的黑名单机制,而那套机制本身又让你的架构重新变回了“有状态”。
AI编程AI编程实战RedisJWT后端开发
AI工具与大模型实操经验整理在Claude实战技巧汇总,有不少直接可参考的案例。

全部回复 (3)

老阿凯 中级 1天前
这种架构设计其实挺激进的,我之前研究过类似的方案,感觉在边缘节点处理 Session 确实能降延迟,但安全性怎么权衡?博主有提到关于 Token 吊销机制的细节吗?
0 回复
程序员老陈 初级 1天前
以前做过个项目,为了做强制下线还得专门配个Redis存黑名单,折腾半天还不如session好使。
0 回复
杭漂码农 专家 1天前
确实,JWT最头疼的就是无法主动失效,还得额外搞个黑名单机制。
0 回复

发表回复

支持 Markdown 格式