← [ BACK_TO_NOTES ]

Stateful、Stateless 与 Hybrid 认证架构

对比纯服务端 Session、纯无状态 Access Token 与 Hybrid 架构,解释登录生命周期、短期访问凭证、刷新、撤销和性能之间如何分工。

#synthesis #growing #security #backend #http

[!info] related notes

Stateful、Stateless 与 Hybrid 认证架构

覆盖范围

这篇不讨论密码登录、OAuth Provider 或 MFA,而只讨论:登录成功后,系统如何维护长期登录状态,以及普通 API 请求如何携带和验证凭证。

为什么需要一起理解

认证系统常把四个维度混在一起:

State
→ 登录生命周期由谁保存?

Credential role
→ Access Token / Refresh Token / Session Token 各自做什么?

Credential format
→ JWT 还是 opaque random string?

Transport
→ Cookie 还是 Authorization Header?

只有把这四层拆开,才能正确比较 Session 和 JWT。

方案一:纯 Server-side Session

Client
  │ opaque session token
  ▼
Server
  │ lookup
  ▼
Session Store

每次请求都通过 Session Store 确认登录状态。

特点:

  • 服务端掌握实时会话权威;
  • logout / revoke 可以立即生效;
  • 客户端 Token 只是随机 Session 标识,不需要 JWT;
  • 每个请求通常需要共享状态查询。

这类方案特别适合普通 Browser Web App、BFF 或单体/模块化后端,因为实现简单,撤销语义清楚。

方案二:纯 Stateless Access Token

Client
  │ self-contained signed token
  ▼
Resource Server
  │ local verify
  ▼
allow / deny

服务端不保存每次登录对应的实时 Session 状态,通常根据签名、exp、iss、aud、scope 等本地判断。

优点是高频请求无需 Session lookup,适合多服务独立验证。

代价是:一个已签发且未过期的 Token 很难立即单独撤销,用户封禁、权限变化和 logout 可能只能等 Token 过期,除非重新引入 blacklist、version、introspection 等服务端状态。

方案三:Hybrid

Hybrid 把“长期生命周期”和“高频请求验证”分开:

Server-side Session / Grant
        │
        │ issue
        ▼
short-lived Access Token
        │
        │ normal API requests
        ▼
Resource Server local verify

Access Token 过期时:

Refresh Token
      ↓
Authorization Server
      ↓
check Session / Grant / revoke / user state
      ↓
new short-lived Access Token

核心思想是:

高频路径
→ Stateless fast path

低频生命周期控制
→ Stateful authority

因此 Hybrid 可以理解为:长期登录状态有状态,短期 Access Token 无状态。

Access Token 是 Session 的短期投影

一个有用心智模型:

Session / Grant
= 当前长期登录生命周期的 Source of Truth

Access Token
= 某个时刻从这份状态签发出的短期授权快照

如果 Session 在 Access Token 签发后被撤销,而 Resource Server 不查 Session,那么已签发 Access Token 可能继续工作到 exp。

这段时间就是 stale authorization window。短 TTL 的意义是限制这个窗口,而不是实现真正的即时撤销。

Refresh Token 的角色

Refresh Token 是进入长期生命周期控制面的高价值凭证:

Refresh Token
→ validate / rotate
→ check Session / Grant
→ issue new Access Token

因此 Hybrid 架构通常把 Refresh、Logout、Revoke、设备管理等放回 Auth Server,而不是让每个 Resource Server 管理长期 Session。

Authentication 与 Authorization

即使 Access Token 带 role、scope:

Token valid
≠
所有资源操作都已授权

例如是否能修改 Assessment 789,仍可能需要查询当前业务数据判断 ownership、组织关系或资源状态。

所以:

Access Token
→ identity + coarse-grained claims

Policy / Service / DB
→ fine-grained resource authorization

什么时候选哪一种

普通 Browser Web App

优先考虑:

HttpOnly Cookie
→ opaque session token
→ server-side Session

如果每次 Session lookup 的成本并不是系统瓶颈,就没必要为了“使用 JWT”额外引入 Access/Refresh 双 Token、rotation、replay family 和刷新并发控制。

Mobile / Public API / 多 Resource Server / 微服务

Hybrid 往往更有价值:

  • Access Token 可以被不同服务本地验证;
  • Auth Server 继续掌握长期生命周期;
  • Refresh 请求频率远低于普通 API 请求。

需要绝对即时撤销的敏感操作

即使系统整体使用短期 Access Token,也可以对敏感操作强制做额外 Session / User 状态检查,或采用更短的凭证窗口。

不是“哪种更现代”

Session
≠ 旧技术
JWT
≠ 高级版 Session
Hybrid
≠ 所有项目默认答案

真正的决策问题是:

  • 是否需要每请求实时撤销?
  • 有多少独立 Resource Server?
  • 可以接受多长的 stale window?
  • Session Store 延迟和可用性成本如何?
  • 客户端类型是 Browser、Mobile 还是第三方 API Client?

最短记忆

Stateful Session
→ 每请求回到实时服务端状态

Stateless Token
→ 每请求只验证短期凭证本身

Hybrid
→ 长期生命周期有状态 + 短期访问快路径无状态

JWT 只是其中一种凭证格式,不定义系统属于 Stateful 还是 Stateless。

创建于 2026/9/15 更新于 2026/9/30
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本