Skip to content

Token 无状态令牌认证与现代 Web 状态管理

本文对比传统 Session 架构在分布式集群环境下的局限,系统介绍基于 Token (如 JWT) 的无状态身份认证原理、签发与验签工作流及架构选型指南。

1. 传统 Session 架构在现代微服务中的痛点

在传统的单体架构中,Session 表现极佳。但在移动端 App、前后端分离以及大型微服务集群架构中,基于 Session 的状态管理面临以下挑战:

  1. 分布式集群数据共享难题:当服务器扩容为多台机器构成的集群时,用户请求被负载均衡路由到不同机器。如果不做 Session 共享 (如 Redis Session)Session 粘性 (Sticky Session),用户将频繁出现登录失效。
  2. 服务器内存开销大:所有的 Session 数据都必须保存在服务器内存中,当在线并发活跃用户数极高时,服务端内存负担沉重。
  3. 跨域与 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. 返回业务响应数据 ─────────────────────────────── [ 业务服务器 ]

对比维度CookieSessionToken (如 JWT)
存储位置客户端浏览器服务端内存/Redis客户端 (LocalStorage/Header)
服务器内存开销零开销开销较大(随着用户数线性增长)零开销(服务器无需存储状态)
分布式/集群扩展性较差(需配置 Redis 集中共享)极佳(任意服务器验证签名即可)
跨域与多端支持受限于 Cookie 同源策略,移动端支持差受限于 Cookie 机制支持跨域,完美适配 Web/App/小程序
安全性需配置 HttpOnlySameSite 防止 XSS/CSRF防篡改能力强依靠密码学签名防篡改,需防范 Token 被窃取
注销/主动失效清除客户端 Cookie 即可服务端直接调用 invalidate() 或删 Redis需建立黑名单库或等待过期时间到达

基于 VitePress 构建 | 技术知识库