请说明如何设计一个单点登录(SSO)系统,使得用户仅需登录一次,就能访问多个相互独立的子系统。
考察说明
考察候选人对分布式认证与会话共享机制的掌握程度,以及架构设计与安全落地能力。
回答思路
- 【回答框架 1】单点登录(SSO)的核心是建立统一认证中心,用户只需在认证中心完成一次登录,即可获得能证明身份的票据或令牌,各子系统通过校验该票据或令牌来信任用户身份,从而避免重复登录。
- 【回答框架 2】常见实现方案有基于共享会话、基于Cookie和基于Token三种。共享会话方案适合子系统在同一域名或同一内网,通过集中式会话存储实现;基于Cookie的方案适合同域场景,需要处理跨域Cookie传递;基于Token(如JWT)的方案适合跨域和移动端,无状态且易于扩展。
- 【回答框架 3】较成熟的协议有CAS(Central Authentication Service)和OAuth2/OIDC(OpenID Connect)。CAS通过Service Ticket实现服务端跳转认证;OAuth2/OIDC则通过授权码和ID Token标准流程实现,适合第三方授权场景,并支持更细粒度的权限控制。
- 【回答框架 4】设计时需考虑安全细节:使用HTTPS加密传输,防止重放攻击的票据有效期管理,状态隔离防范CSRF,以及集中式会话失效机制。同时要保证认证中心的高可用和性能,比如通过集群和缓存降低单点压力。
- 【回答框架 5】此外要明确SSO只解决“一次登录”的认证问题,并不自动实现业务层的权限隔离。不同子系统的授权仍应由各自的权限模块基于用户身份进行控制,不能因SSO而放松访问控制。
- 【关键点 1】SSO通过统一认证中心发放票据或令牌,实现多系统间的一次登录。
- 【关键点 2】跨域场景下Token方案(如JWT)相比Cookie方案更灵活安全。
- 【关键点 3】经典协议CAS和OIDC各有适用场景,OIDC更适合开放授权。
- 【关键点 4】安全必须包括HTTPS、票据有效期、防重放和防CSRF。
- 【关键点 5】SSO不替代业务授权,权限仍需按子系统独立控制。
- 【易错点 1】误将SSO等同于OAuth2,其实OAuth2主要解决授权,OIDC才是认证协议。
- 【易错点 2】忽略票据或Token的安全传输与存储,容易导致会话劫持和重放攻击。
- 【易错点 3】未考虑认证中心的单点故障,需通过负载均衡和会话复制保证高可用。