Skip to content

Session 认证和 Token 认证有什么区别?分布式环境下怎么选? ​

  • 标签:Spring Security、认证授权、后端

🏛 业务架构师 ​

Session 与 Token 认证的区别及分布式选型:

区别(五个维度):

维度SessionToken(JWT)
状态服务端存(内存/Redis),客户端只拿 Session ID客户端持有全部信息,服务端(近)无状态
扩展性需共享存储(Session 粘滞或 Redis 集中)验签本地完成,天然水平扩展
注销/踢人容易(删服务端会话即失效)难(需黑名单/短时效机制)
跨系统/跨域Cookie 策略受限(CSRF 也相关)Header 传递,跨服务友好
移动端/小程序Cookie 支持别扭原生友好

分布式环境怎么选,我的决策框架:

  1. 单体/小系统、传统 Web 后台:Session + Spring Session Redis(会话集中存储)——简单成熟,注销即时,管理后台这类强管控场景反而更合适;
  2. 微服务/多端(App/小程序/开放 API):JWT 双令牌(短 Access+可撤销 Refresh)——网关统一验签,服务无状态化,扩容不依赖会话存储;这是 2026 年的主流选择;
  3. 混合实践:对外 API 走 JWT、内部管理端走集中 Session——按端分层,各取所长。

避坑提醒:

  • 分布式 Session 别用"IP 粘滞"(负载不均、故障切换丢会话),用 Spring Session 统一 Redis;
  • JWT 别只做无状态就万事大吉——注销、改权、封号的即时性必须提前设计(黑名单/版本号);
  • 无论哪种,HTTPS 是前提,Token 别放 localStorage(XSS),Cookie 记得 HttpOnly+Secure+SameSite。

一句话:Session 是"状态在服务端"的旧契约,Token 是"状态在客户端"的新契约——分布式与多端化的业务现实让 Token 成为默认,但强管控场景 Session 依然能打,按端选型而非站队信仰。

🏗 系统架构师 ​

Session 认证:服务端存会话状态(内存/Redis),客户端只持 SessionId(Cookie)——状态在服务端。Token 认证(JWT):状态编码进令牌(签名保证可信),服务端无存储——状态在客户端。

核心差异(架构账本):

维度SessionJWT
扩展性需会话共享(粘性路由或 Redis 集中存储)无状态,任意实例本地验签
作废移除服务端会话即刻生效难(黑名单/短令牌,见专题)
跨服务/跨域Cookie 域限制、跨服务要会话共享令牌透传,天然跨服务
移动端/小程序Cookie 语义弱Header 携带自然
体积/性能每请求查会话存储(Redis 一次)验签 CPU(本地),无网络查
CSRFCookie 自动携带 → 需防 CSRFHeader 手动携带 → 天然免疫

分布式环境怎么选(决策树):

  • 单体/传统 Web 应用:Session + Spring Session Redis(会话外置到 Redis,实例无状态化)——简单、可即时作废,管理后台类应用首选;
  • 微服务/API 优先/前后端分离/移动端:JWT(OAuth2/OIDC 体系)——无状态水平扩展、网关统一验签、跨服务令牌传递;接受"作废延迟窗口"用短 Access + Refresh 吊销补;
  • 混合形态:外部面向客户端用 OIDC/JWT,内部服务间调用用服务身份(mTLS/client credentials)+ 用户上下文透传(JWT 原样转发或内部声明换发);
  • 即时封禁刚需(风控踢人):Session 或 JWT+黑名单/版本号——安全要求倒逼有状态。

架构师忠告:"JWT 更先进"是常见误解——两者是状态放哪的权衡:作废能力 vs 扩展简洁性。按业务对"踢人即时性"的要求选,而不是按潮流。

💻 全栈开发专家 ​

Session 认证:登录后服务端存会话(内存/Redis),浏览器持 sessionId(Cookie)——状态在服务端。 Token 认证(JWT):签名令牌自包含身份——状态在客户端(服务端只验签)。

维度SessionJWT
状态服务端存(水平扩要 Redis 共享)无状态,验签即可
扩容Session 粘滞/集中存储天然友好
吊销立即(删 session)难(黑名单/短有效期)
CSRF需防护(Cookie 自动携带)Header 携带天然免疫(若放 Cookie 同样要防)
跨域/多端Cookie 跨域麻烦Header 传 token 顺手
移动端/小程序Cookie 支持差标准
性能每请求查 session 存储验签(RSA 微秒级,无 IO)

分布式环境怎么选(实战决策线):

  1. 单体/传统 Web(同域、浏览器为主):Session + Spring Session Redis(@EnableRedisHttpSession)——吊销能力强、实现简单,别为了时髦上 JWT;
  2. 前后端分离 + 多端(App/小程序/Web):JWT(access+refresh)——标准答案;
  3. 微服务:网关统一认证(验 JWT 转发用户头)或 OAuth2/OIDC 中心化;内部服务间可用 token relay;
  4. 需要强吊销(金融、后台):JWT 短有效期 + refresh 管理 + 版本号方案(见注销题)。

Spring 落地:Session:spring-session-data-redis;JWT:Spring Authorization Server 签发 + 资源服务器 oauth2ResourceServer().jwt()。一个常见反模式:把 JWT 塞 Cookie 又开 CSRF 免疫——等于集两家之短,别这么干。