在使用 JWT(JSON Web Token)进行身份认证时,我们经常听到“无状态认证”这个词,它的核心说法是:服务端无需保存会话信息(Session)。那么这句话是什么意思?服务端真的一点数据都不用存吗?服务端又是如何验证 JWT 的签名与有效期的?本文将为你一一解答。
一、什么是“无状态”?
“无状态(Stateless)”是相对于“有状态(Stateful)”而言的系统设计理念,指的是:
服务端不需要记录用户的登录状态或会话数据,用户每次请求都必须自带身份信息,服务端根据请求本身即可完成验证。
对比理解:
类型 | 说明 |
---|---|
有状态认证 | 服务端生成 Session ID,并将其保存至服务端内存/数据库中,用户请求时带上该 ID 进行识别 |
无状态认证 | 服务端不保存用户状态,用户每次请求都带上完整的身份凭证(如 JWT),服务端直接验证 |
二、服务端是否需要保存 JWT 数据?
标准的 JWT 无需在服务端保存任何会话信息!
这是它区别于传统 Session 的关键点。JWT 是自包含(self-contained)的,它将认证相关的信息(如用户 ID、权限、过期时间)和签名一起编码在 Token 内部。服务端只需验证该 Token 是否可信、是否有效即可完成认证,不必保存或查找任何会话记录。
三、那服务端如何验证 JWT 是否有效?
服务端通常通过以下两个步骤完成验证:
1. 验证签名是否正确
JWT 的第三部分是签名(Signature),它是基于前两部分(Header 和 Payload)以及服务端的私钥/密钥进行加密生成的。
- 如果签名不对,说明 Token 被篡改。
- 服务端使用相同的密钥进行计算,并与 Token 中提供的签名比对,如果一致,则可信。
👉 密钥必须保存在服务端(但这不算是“会话信息”)
🔐 示例:使用 HMAC SHA256 算法
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
2. 验证 Token 的有效期
JWT 中的 Payload 常包含如下字段:
iat
:签发时间(Issued At)exp
:过期时间(Expiration Time)
服务端会解析 Payload,读取 exp
字段,并与当前时间对比。如果 Token 已过期,则拒绝访问。
这个验证过程只需要 Token 本身,不依赖任何服务端会话信息。
四、无状态认证的优点
- ✅ 扩展性强:多个服务节点共享密钥即可,无需 Session 同步。
- ✅ 性能更高:无需读写 Session 存储,节省资源。
- ✅ 架构简单:更适合微服务和前后端分离架构。
五、无状态并不等于“完全不存数据”
虽然 JWT 本身不需要在服务端保存,但有些安全场景下服务端可能额外增加状态记录机制,比如:
✅ 黑名单机制
若用户被强制登出、账号异常、Token 泄露,需要让某些 Token 立即失效,此时可以把 Token 的 ID(如 jti
字段)加入黑名单数据库,服务端每次校验时查黑名单。
✅ 刷新机制(Refresh Token)
JWT 通常有效期短,如果需要自动续期,系统可采用“短期访问 Token + 长期刷新 Token”的双 Token 机制,并对 Refresh Token 保存在服务端进行控制。
“无状态,服务端无需保存会话信息”是 JWT 的一大特性,意味着服务端在认证过程中无需保存用户的登录状态或 Session 数据。服务端只需依靠密钥、解析 Token 内容、验证签名与有效期即可完成认证过程。
但为了应对复杂业务和安全要求,服务端在某些情况下仍可以引入辅助状态机制,如黑名单、白名单或刷新机制,从而在保持无状态优势的基础上实现更高的安全性与灵活性。