单点登录(SSO)的实现方案¶
一、什么是 SSO¶
一个用户在多个互相信任的应用系统中,只登录一次,就能访问所有系统。
二、常见协议¶
1. CAS(Central Authentication Service)¶
经典 SSO 协议,有独立的 CAS Server。流程:
- 用户访问 App1,未登录,重定向到 CAS Server。
- 用户在 CAS Server 登录。
- CAS Server 重定向回 App1,带 Ticket(ST)。
- App1 拿 Ticket 去 CAS Server 校验,成功后建立本地 Session。
- 用户访问 App2,同样重定向到 CAS Server,发现已有 SSO Session(TGC cookie),直接发 Ticket,不需要再登录。
2. OAuth2 / OIDC¶
现代 Web 常用:
- Authorization Code 模式:最安全。
- 第三方登录(微信、GitHub 登录)本质就是 OAuth2。
流程:
App -> 授权服务器: 跳转到登录页
用户输入账号密码
授权服务器 -> App: 回调带 code
App -> 授权服务器: code 换 access_token
App -> 用户: 登录成功
3. JWT¶
前后端分离、微服务场景:
- 登录后签发 JWT。
- 后续请求带
Authorization: Bearer <token>。 - 每个服务自己验签,不需要调用认证中心。
三、方案对比¶
| 方案 | 适用 |
|---|---|
| CAS | 企业内部多系统、传统 Web |
| OAuth2/OIDC | 第三方登录、开放平台 |
| JWT | 前后端分离、微服务、APP |
四、关键点¶
1. 登出¶
SSO 登出要通知所有系统:
- CAS:单点登出,CAS Server 通知各 App 销毁 Session。
- JWT:服务端维护黑名单。
2. 安全性¶
- HTTPS 必须。
- Cookie 设 HttpOnly、Secure、SameSite。
- Token 过期时间合理,用 Refresh Token。
- 防止 CSRF。
3. 跨域¶
SSO 域和业务域不同,要处理跨域 Cookie。
面试加分
- 为什么需要 Ticket?防止把凭证直接放在 URL 里。
- JWT 不适合存放大量用户信息,payload 放 userId 即可。