Appearance
Token 无状态令牌认证与现代 Web 状态管理
本文对比传统 Session 架构在分布式集群环境下的局限,系统介绍基于 Token (如 JWT) 的无状态身份认证原理、签发与验签工作流及架构选型指南。
1. 传统 Session 架构在现代微服务中的痛点
在传统的单体架构中,Session 表现极佳。但在移动端 App、前后端分离以及大型微服务集群架构中,基于 Session 的状态管理面临以下挑战:
- 分布式集群数据共享难题:当服务器扩容为多台机器构成的集群时,用户请求被负载均衡路由到不同机器。如果不做 Session 共享 (如 Redis Session) 或 Session 粘性 (Sticky Session),用户将频繁出现登录失效。
- 服务器内存开销大:所有的 Session 数据都必须保存在服务器内存中,当在线并发活跃用户数极高时,服务端内存负担沉重。
- 跨域与 CSRF 攻击风险:基于 Cookie 自动携带的会话认证在跨域场景下受限,且天然容易受到 CSRF (跨站请求伪造) 攻击。
2. Token 令牌认证机制原理
为解决 Session 的状态存储痛点,无状态 (Stateless) 的 Token 认证方案成为现代 API 和前后端分离开发的主流。
2.1 Token 核心工作流
[ 客户端/前端 ] ───────── 1. 提交用户名密码进行登录 ────────> [ 认证服务器 ]
│
│ 2. 校验成功,生成加密签名 Token
▼
[ 客户端/前端 ] <──────── 3. 返回响应数据 (携带 Token) ─────────── [ 认证服务器 ]
│
│ 4. 将 Token 存入 LocalStorage 或 SessionStorage
│
[ 客户端/前端 ] ── 5. 后续请求在 Header 中携带 `Authorization: Bearer <Token>` ──> [ 业务服务器 ]
│
│ 6. 验证签名有效性
▼
[ 客户端/前端 ] <──────── 7. 返回业务响应数据 ─────────────────────────────── [ 业务服务器 ]3. Cookie vs Session vs Token 三者架构对比
| 对比维度 | Cookie | Session | Token (如 JWT) |
|---|---|---|---|
| 存储位置 | 客户端浏览器 | 服务端内存/Redis | 客户端 (LocalStorage/Header) |
| 服务器内存开销 | 零开销 | 开销较大(随着用户数线性增长) | 零开销(服务器无需存储状态) |
| 分布式/集群扩展性 | 差 | 较差(需配置 Redis 集中共享) | 极佳(任意服务器验证签名即可) |
| 跨域与多端支持 | 受限于 Cookie 同源策略,移动端支持差 | 受限于 Cookie 机制 | 支持跨域,完美适配 Web/App/小程序 |
| 安全性 | 需配置 HttpOnly 与 SameSite 防止 XSS/CSRF | 防篡改能力强 | 依靠密码学签名防篡改,需防范 Token 被窃取 |
| 注销/主动失效 | 清除客户端 Cookie 即可 | 服务端直接调用 invalidate() 或删 Redis | 需建立黑名单库或等待过期时间到达 |