一、基本概念
1. OAuth 2.0
- 定位:开放授权协议,用于 第三方应用安全获取用户资源权限(如“使用微信登录”)。
- 核心流程:
- 用户向资源所有者(如微信)发起授权请求。
- 授权服务器返回 访问令牌(Access Token)。
- 第三方应用通过令牌访问用户资源(如获取微信头像)。
- 适用场景:
- 第三方应用集成(如社交登录、API 访问)。
- 单点登录(需结合 OpenID Connect 扩展)。
- 优点:
- 标准化流程,支持多种授权模式(授权码、密码模式等)。
- 支持细粒度权限控制(如仅允许读取用户邮箱)。
- 缺点:
- 需依赖 HTTPS 保证令牌传输安全。
- 实现复杂度较高(需管理令牌生命周期)。
2. JWT(JSON Web Token)
- 定位:轻量级令牌格式,用于安全传输声明信息(如用户身份)。
- 结构:
- Header(算法类型)、Payload(用户数据)、Signature(签名验证完整性)。
- 示例:
{ "alg": "HS256", "typ": "JWT" }
+{ "sub": "xiaolingting", "exp": 1735689600 }
+ 签名。
- 适用场景:
- 无状态认证(如前后端分离架构)。
- 简单 SSO 场景(需配合密钥管理)。
- 优点:
- 自包含(避免频繁查库),适合分布式系统。
- 跨语言支持,轻量易扩展。
- 缺点:
- 令牌无法主动失效(依赖短期有效期或黑名单)。
- 需自行处理敏感数据加密。
3. SAML(Security Assertion Markup Language)
- 定位:基于 XML 的认证协议,用于 企业级跨域身份联合(如内部系统 SSO)。
- 核心流程:
- 用户访问服务提供商(SP),SP 生成 SAML 请求重定向到身份提供商(IdP)。
- IdP 认证用户后返回 SAML 断言(包含身份信息)。
- SP 解析断言并授权访问。
- 适用场景:
- 企业内网单点登录(如访问多个内部系统)。
- 支持浏览器单点登录(依赖 HTTP 重定向和 POST 绑定)。
- 优点:
- 高安全性(XML 数字签名和加密)。
- 成熟的企业级解决方案(兼容 ADFS、Okta)。
- 缺点:
- 协议复杂,XML 解析开销大。
- 移动端支持较弱(需浏览器环境)。
二、对比总结
维度 | OAuth 2.0 | JWT | SAML |
---|---|---|---|
核心目标 | 第三方授权(资源访问权限) | 无状态身份声明(信息传输格式) | 跨域身份认证(企业级 SSO) |
数据格式 | 无固定格式(令牌为随机字符串) | JSON | XML |
典型应用 | 社交登录、API 授权(如微信登录) | 前后端分离认证、简单 SSO | 企业内网 SSO(如访问多个内部系统) |
安全性 | 依赖 HTTPS 和短期令牌 | 需签名和加密敏感数据 | XML 签名和加密,支持复杂安全策略 |
性能开销 | 中等(需令牌管理) | 低(自包含,无需查库) | 高(XML 解析和签名验证) |
开发复杂度 | 高(需实现授权流程) | 低(标准化库支持) | 高(XML 处理复杂) |
三、 实际应用建议
- OAuth 2.0 + JWT:
- 场景:第三方应用授权 + 无状态认证(如 Spring Security OAuth2 + JWT)。
- 示例:用户通过微信登录后,后端生成 JWT 供前端访问 API。
- SAML:
- 场景:企业内网 SSO(如集成 ADFS 或 Okta)。
- 示例:员工登录企业门户后,直接访问 HR 系统、OA 系统。
- 纯 JWT:
- 场景:简单内部系统 SSO(需自行管理密钥和令牌生命周期)。
- 示例:小型微服务架构中,服务间通过 JWT 传递用户身份。
四、总结
- OAuth 2.0 是授权协议的首选,适合互联网应用和第三方集成。
- JWT 是轻量级令牌格式,适合无状态场景,常与 OAuth 配合使用。
- SAML 是企业级 SSO 的成熟方案,适合复杂安全需求的内部系统。
- 根据场景选择:开放生态用 OAuth,企业内网用 SAML,轻量级用 JWT。