单点登出

登出比登录难

SSO 里最容易翻车的不是登录,而是登出。

用户在认证中心退出后,问题来了:各业务系统的本地会话要不要一起失效?

如果只清掉 IdP 的全局会话,业务系统的本地会话可能仍然有效——用户以为「已退出」,但攻击者若拿到某个系统的本地会话,仍然能持续访问。这就是会话残留。

三种登出策略

策略做法可靠性成本
前端重定向通知前端逐个跳转到各业务系统通知登出依赖浏览器跳转,可能漏低
后端通道通知IdP 通过服务端回调通知各业务系统撤销会话可靠高,需维护回调
缩短本地会话业务系统本地会话很短,降低残留风险中低,但体验略差

如何选

选择不是「越彻底越好」,而是看安全要求:

  • 内部管理系统(后台、财务、客服):要求统一登出,用后端通道通知为主,务必彻底。
  • 普通内容站点:可以放宽,本地会话短一点即可。

统一登出越彻底,实现越复杂。关键是先想清楚:哪些系统残留会话会造成实际损失。

后端通道通知的实现要点

如果走后端通道(如 OpenID Connect 的 back-channel logout / SAML 的 Single Logout),注意:

  • 各业务系统提供登出回调地址,IdP 在用户登出时服务端调用。
  • 回调要鉴权(防止伪造登出请求)。
  • 业务系统收到通知后,撤销指定会话(按 session_id 或 sub)。
  • 全程记录审计日志:谁在何时发起登出、通知了哪些系统、结果如何。

登出体验

  • 用户主动登出时,跳回一个「已退出所有系统」的确认页。
  • 被动失效(会话过期)时,提示重新登录即可,不必大张旗鼓。

下一节看 SSO 的信任边界——为什么 IdP 一旦被攻破,等于所有系统的钥匙都丢了。

发现内容有问题?

告诉我们哪里需要改进。