SSO、Token、Session 应该怎么设计?一次讲清单点登录、登录态续期与多端会话管理
大家好,我是一名有 4 年工作经验的 Java 后端开发。
登录认证几乎是所有后台和业务系统的基础能力,但真正做过多系统、多端登录的人都知道,这里面最容易乱的不是“能不能登录”,而是登录态怎么统一、会话怎么管理、不同端怎么续期。
这篇文章我想系统聊一聊 SSO、Token、Session 到底应该怎么设计。
🦅个人主页
🐼
文章目录
- SSO、Token、Session 应该怎么设计?一次讲清单点登录、登录态续期与多端会话管理
- 一、为什么登录系统经常越做越乱
- 二、Session 和 Token 到底怎么选
- 2.1 Session
- 2.2 Token
- 三、SSO 适合什么场景
- 四、推荐设计思路
- 五、最容易踩的坑
- 5.1 token 一旦签发就完全不可控
- 5.2 统一登录后权限也想统一
- 5.3 续期策略不清晰
- 六、面试中怎么回答
- 七、总结
- 八、结尾
一、为什么登录系统经常越做越乱
很多系统一开始都很简单:
- 用户名密码登录
- 返回 token
- 后端验 token
但一旦系统变多、终端变多,很快就会遇到:
- 管理后台和商家后台是否共用登录态
- App、H5、PC 登录态是否统一
- token 过期怎么续期
- 用户改密码后是否强制下线
- 一个账号能否多端同时登录
所以认证系统真正要解决的,不只是“发一个 token”,而是:
身份认证、登录态管理、会话续期、终端隔离和统一退出的一整套设计。
二、Session 和 Token 到底怎么选
2.1 Session
优点:
- 服务端可控性强
缺点:
- 多服务共享成本更高
2.2 Token
优点:
- 更适合分布式和前后端分离
缺点:
- 续期、吊销、强制下线要额外设计
现在大多数系统更常用:
Token + 服务端会话存储
也就是:
- token 负责携带会话标识
- 服务端仍然保留会话控制能力
三、SSO 适合什么场景
SSO 本质是:
多个系统共享一套认证中心。
适合:
- 平台后台
- 商家后台
- 运营后台
这些多个后台要统一登录体验的场景。
但要注意:
统一认证不等于统一权限。
登录可以统一,权限仍然可以分域。
四、推荐设计思路
我更建议:
- 统一认证中心
- 各业务系统独立权限域
- token 里只放轻量身份信息
- 服务端保存会话状态
- 支持主动失效和统一下线
这样既能有:
- 分布式友好
又能保留:
- 会话治理能力
五、最容易踩的坑
5.1 token 一旦签发就完全不可控
后面做强制下线会很痛苦。
5.2 统一登录后权限也想统一
这很容易把系统边界搞乱。
5.3 续期策略不清晰
容易导致:
- 用户频繁掉登录
- 或者 token 长期不失效
六、面试中怎么回答
如果面试官问你:
SSO、Token、Session 一般怎么设计?
你可以这样回答:
第一,Session 和 Token 并不是非此即彼。现在很多系统更常见的是 Token 负责承载会话标识,服务端仍然保留会话状态和续期、下线控制能力,这样在分布式场景下更灵活。
第二,SSO 适合多个系统统一登录入口的场景,但统一认证不等于统一权限,认证中心和业务权限域最好分开设计。
第三,真正上线时我会特别关注 token 续期、主动失效、多端会话管理和退出登录能力,而不是只关注“登录成功没成功”。
七、总结
认证系统真正难的,不是“发 token”,而是如何把:
- 登录
- 会话
- 续期
- 下线
- 多系统共用
一起管稳。
如果只记一句结论,我觉得可以记住这句:
统一认证可以集中做,但权限边界和会话治理一定要独立设计。
八、结尾
如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注。
后面我会继续整理一些更偏实战的 Java 后端和系统设计文章,尽量少写空泛概念,多写真实项目里会踩到的坑。