Distributed Session

Use when cluster login state, 分布式 Session, JWT, SSO, Redis session, sticky sessions, or gateway auth is in play. Do not use for SQL 越权 resource checks (backend-safe-check).

1398281322-a11y a936de3 2.0 KB Updated

File contents

分布式会话

When to Invoke

多实例登录态、网关鉴权、C 端 token、管理端 SSO、Session 粘滞。

When NOT

资源是否属于当前商户 → safe-check。限流 → rate-limit

风险(面试考点)

Tomcat Session 默认在单机内存,集群会丢登录或要粘滞。粘滞:实例挂了那批用户掉线,扩缩容痛苦。

JWT 无状态好扩,但 无法立刻作废(除非黑名单/短 TTL+刷新)。敏感权限变更要能踢人。

Session 进 Redis:好作废,但 Redis 挂了全员掉线,要当缓存依赖来保。

Cookie 域、HTTPS、HttpOnlySameSite;跨子域 SSO 不要把 token 放 URL。

方案选型(轻量优先)

场景 默认
C 端 API 短 TTL Access Token + Refresh;网关验签
要立刻踢人 Redis 存 session 或 token 黑名单
管理端 同 Redis session 或统一认证
禁止当默认 Nginx ip_hash 粘滞当长期方案

默认方案

Authorization: Bearer <jwt>
JWT 只放 userId、过期时间;权限实时查或短缓存
登出 / 改密:把 jti 写入 Redis 黑名单直到过期

网关验签失败 401。业务服务仍要做 水平越权safe-check),有 token ≠ 能改任意订单。

反例

错误:JWT 里塞权限列表,运营改角色后 24h 仍是管理员。 正确:短 TTL 或 Redis 版本号。

错误:token 放 query string 方便 H5。 正确:头或 HttpOnly cookie。

错误:多实例内存 Session。 正确:无状态或 Redis。

验证

  • 杀一个实例,已登录用户仍可用。
  • 登出后原 token 立即 401。
  • 用户 A 的 token 不能改用户 B 的订单。

评审清单

  • 无粘滞依赖
  • 能作废或足够短 TTL
  • 鉴权之后仍有资源级校验

1398281322-a11y/java-backend-guardrails/tree/main/skills/java-backend-guardrails/distributed-session commit a936de365e

Frequently asked questions

npx skillmds@latest add 1398281322-a11y/distributed-session