"小崔部署到测试环境后,发现同一个账号在 Chrome 和 Firefox 上同时登录都成功了。白歌说:'默认配置下 Spring Security 允许无限并发,这在生产环境很危险。'这一章,你将掌握会话管理的完整策略——从会话创建到并发控制,从会话固定防护到记住我。"
章节导读:会话管理与记住我
本章定位
本章解决的核心问题:Spring Security 如何管理用户会话的生命周期、如何限制并发登录、如何防范会话固定攻击,以及如何通过"记住我"机制在关闭浏览器后保留登录状态。 本章是会话安全的核心实践章节。
学习路线图
学习顺序说明:先建立会话管理的整体认知(创建策略、超时管理、注册表)→ 深入 SessionCreationPolicy(控制何时创建 HttpSession)→ 掌握 SessionFixation(登录后更换 Session ID,防止会话劫持)→ 理解会话并发控制(限制同一账号同时在线数量)→ 最后掌握 RememberMe(关闭浏览器后通过持久化 Token 保持登录状态)。
文件关系说明
| 文件 | 一句话角色 |
|---|---|
会话管理.md | 会话管理整体认知:创建策略、超时管理、注册表、会话固定防护、并发控制的全貌。 |
SessionCreationPolicy.md | 会话创建策略:ALWAYS / IF_REQUIRED / NEVER / STATELESS 四种策略的选择与场景。 |
SessionFixation.md | 会话固定防护:登录后更换 Session ID,防止攻击者通过预设 Session ID 劫持身份。 |
会话并发控制.md | 并发限制:通过 maximumSessions 限制同一账号同时在线数,支持踢出旧会话或拒绝新会话。 |
RememberMe.md | 记住我机制:通过持久化 Cookie 在关闭浏览器后保持登录,基于 Token 和密钥的安全验证。 |
知识图谱
核心逻辑:Spring Security 的会话管理从创建策略开始:ALWAYS 始终创建 Session,IF_REQUIRED 按需创建,NEVER 不主动创建但复用已有,STATELESS 完全无状态(适合 JWT)。登录成功后通过 SessionFixation 更换 Session ID,防止攻击者劫持。SessionRegistry 维护所有活跃会话,配合 maximumSessions 实现并发控制。RememberMe 通过持久化 Token 在浏览器关闭后保持登录,Token 经密钥签名防篡改,用户可以选择"记住我"获得长期会话,不选择则获得短期 Session。
与上下章的衔接
上一章回顾:你掌握了过滤器链的完整结构,知道 SecurityContextHolderFilter 从 Session 中加载 SecurityContext。本章将深入 Session 的管理策略——何时创建、何时销毁、如何防护劫持、如何控制并发。
下一章预告:Session 机制在单体应用中工作良好,但在分布式系统和微服务架构中,Session 共享成为瓶颈。下一章「JWT 与无状态认证」将引入基于 Token 的无状态认证方案,服务端无需存储会话状态,天然支持横向扩展。