跳转到内容

SSO单点登录

Session 是最传统的单点登录实现方式之一。

  1. 用户登录时在 SSO 服务器创建全局会话
  2. 各子系统通过共享 Session 实现登录状态同步
  3. 用户登出时销毁全局会话
  • 实现简单,易于理解
  • 安全性较高
  • 适合同域应用
  • 服务器需要存储会话信息,增加服务器负载
  • 跨域场景下需要处理复杂的 Cookie 问题
  • 集群环境下需要 Session 共享方案
┌──────────────┐ ┌──────────────┐
│ Browser │ │ SSO Server │
└──────┬───────┘ └──────┬───────┘
│ │
│ 1. 登录请求 │
│──────────────────> │
│ │
│ 2. 创建Session │
│ <─────────────────│
│ │
┌──────┼────────┐ │
│ Application A │ │
└──────┬────────┘ │
│ 3. 访问 │
│──────────────────>│
│ 4. 验证Session │
│<──────────────────│
  1. 用户首次访问 SSO 服务器进行登录
  2. SSO 服务器创建全局会话,设置 Cookie
  3. 用户访问子系统时携带 Cookie
  4. 子系统通过 SSO 服务器验证 Session 有效性
  5. 用户登出时,SSO 服务器销毁全局会话
  1. 用户登录后获取 Token
  2. Token 携带用户信息和权限
  3. 各系统通过验证 Token 实现身份认证
  • 无状态,服务器不需存储会话信息
  • 适合分布式环境
  • 跨域支持好
  • Token 管理复杂
  • 注销实现相对复杂
  • Token 泄露风险
┌──────────────┐ ┌──────────────┐
│ Browser │ │ Auth Server │
└──────┬───────┘ └──────┬───────┘
│ │
│ 1. 登录请求 │
│──────────────────> │
│ │
│ 2. 返回Token │
│ <─────────────────│
│ │
┌──────┼────────┐ │
│ Application A │ │
└──────┬────────┘ │
│ 3. 携带Token │
│──────────────────>│
│ 4. 验证Token │
│<──────────────────│
  1. 用户登录认证服务器
  2. 认证服务器生成 Token 并返回
  3. 客户端存储 Token(LocalStorage/Cookie)
  4. 后续请求携带 Token 在 Header 中
  5. 各子系统验证 Token 有效性

OAuth2.0 是一个授权框架,常用于第三方登录。

  1. 授权码模式
  2. 简化模式
  3. 密码模式
  4. 客户端模式
  • 第三方应用授权
  • 移动应用登录
  • 微服务架构
  • 使用 HTTPS
  • Token 有效期管理
  • 刷新 Token 机制

SAML (Security Assertion Markup Language) 是一个基于 XML 的开放标准。

  • 基于 XML 格式
  • 支持跨域
  • 提供丰富的安全断言
  • 企业级应用
  • 政府部门
  • 教育机构

CAS (Central Authentication Service) 是一个开源的企业级单点登录解决方案。

  • TGT (Ticket Granting Ticket)
  • ST (Service Ticket)
  • CAS Client
  • CAS Server
  1. 用户访问应用
  2. 重定向到 CAS 服务器
  3. 认证通过后返回 ST
  4. 应用验证 ST
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Browser │ │ CAS │ │ App │
│ │ │ Server │ │ │
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ 1. 访问应用 │ │
│────────────────────────────────>│
│ │ │
│ 2. 重定向到CAS │
│<────────────────────────────────│
│ │ │
│ 3. CAS登录 │ │
│───────────────>│ │
│ │ │
│ 4. TGT+Cookie│ │
│<───────────────│ │
│ │ │
│ 5. ST请求 │ │
│───────────────>│ │
│ │ │
│ 6. 返回ST │ │
│<───────────────│ │
│ │ │
│ 7. 访问应用(带ST) │
│────────────────────────────────>│
│ │ │
│ 8. 验证ST │ │
│ │<──────────────│
│ │ │
│ 9. ST有效 │ │
│ │──────────────>│
│ │ │
│ 10. 返回响应 │ │
│<────────────────────────────────│

JWT (JSON Web Token) 是一种轻量级的认证方案。

  • Header(头部)
  • Payload(负载)
  • Signature(签名)
  • 自包含(包含用户信息)
  • 无状态
  • 支持跨域
  • 合理设置过期时间
  • 使用强密钥
  • 考虑刷新 Token 机制
  1. 用户信息存储在 Redis
  2. Session ID 作为 Key
  3. 分布式 Session 共享
  • 高性能
  • 支持集群
  • 可设置过期时间
  • Redis 高可用
  • 数据持久化
  • 网络延迟
  1. HTTPS 传输
  2. 防止 XSS 攻击
  3. 防止 CSRF 攻击
  4. 密码加密存储
  5. 登录失败次数限制
  1. 定期修改密钥
  2. 日志监控
  3. 异常检测
  4. 多因素认证
  5. 会话管理
  1. 系统规模
  2. 安全需求
  3. 性能要求
  4. 维护成本
  5. 用户体验
  • 小型同域应用:Session 方案
  • 大型分布式系统:JWT/Token 方案
  • 企业应用:CAS/SAML 方案
  • 开放平台:OAuth2.0 方案