3. 常见鉴权协议选型对比:JWT、OAuth2.0、SAML、OpenID Connect

在多租户 SaaS 架构中,鉴权与授权协议的选择直接决定了系统的安全性、扩展性及用户体验。本章深入对比四种主流协议——JWT、OAuth2.0、SAML 与 OpenID Connect (OIDC),从适用场景、核心优缺点及多租户适配性三个维度进行剖析,帮助架构师在拦截链路中做出精准选型。

核心认知: 鉴权(Authentication)解决“你是谁”的问题,授权(Authorization)解决“你能做什么”的问题。JWT 是一种令牌格式,OAuth2.0 是授权框架,SAML 与 OIDC 是联合身份协议。在实际链路中,它们常组合使用,而非互斥。

3.1 协议全景对比

下表从协议本质、传输格式、主要用途、多租户支持度及安全模型五个关键维度进行横向对比:

维度 JWT OAuth2.0 SAML OpenID Connect
协议本质 令牌格式标准 授权框架 联合身份协议 身份认证层(基于 OAuth2.0)
传输格式 JSON(紧凑、自包含) JSON / 令牌 XML(基于断言) JSON + JWT
主要用途 声明传递、无状态会话 第三方授权、API 访问委托 企业级 SSO、跨域身份联合 现代应用 SSO、社交登录
多租户支持 通过自定义声明(claims)实现 通过 issuer + audience 隔离 通过实体 ID + 元数据配置 通过 issuer + client_id 隔离
安全模型 签名验证(HS256/RS256) Bearer 令牌 + 刷新令牌 XML 签名 + 加密断言 ID Token + Access Token + 签名

3.2 协议详解与多租户适配

3.2.1 JWT(JSON Web Token)

JWT 是一种紧凑的、自包含的令牌格式,由 Header、Payload 和 Signature 三部分组成。在多租户 SaaS 中,JWT 常用于无状态鉴权,将租户标识(tenant_id)、用户角色(role)等声明直接编码在令牌中,减少数据库查询。

  • 优点: 无状态、跨语言支持、易于在微服务间传递、支持自定义声明。
  • 缺点: 令牌无法主动撤销(需黑名单或短有效期)、Payload 仅 Base64 编码(非加密)、令牌体积随声明增加而膨胀。
  • 多租户场景: 在 Payload 中加入 tenant_id 和 permissions 字段,网关层解析后路由到对应租户的数据源或服务实例。
// JWT Payload 示例(多租户场景)
{
  "sub": "user_12345",
  "tenant_id": "tenant_acme",
  "role": "admin",
  "permissions": ["read:orders", "write:orders"],
  "iat": 1710000000,
  "exp": 1710003600
}
避坑提示: 切勿在 JWT 中存储敏感数据(如密码、完整手机号)。Payload 仅经过 Base64 编码,未加密,任何持有令牌者均可解码读取。如需加密,应使用 JWE(JSON Web Encryption)。

3.2.2 OAuth2.0

OAuth2.0 是一个授权框架,定义了四种授权模式(授权码、隐式、密码凭证、客户端凭证)。在多租户 SaaS 中,授权码模式 + PKCE 是推荐方案,用于第三方应用委托访问用户资源。

  • 优点: 标准化授权流程、支持多种客户端类型、令牌可刷新、广泛集成。
  • 缺点: 协议复杂度高、未定义身份认证(仅授权)、需配合 HTTPS 保证安全。
  • 多租户场景: 每个租户拥有独立的 client_id 和 issuer 端点,授权服务器根据 audience 参数区分租户上下文。

3.2.3 SAML(Security Assertion Markup Language)

SAML 是一种基于 XML 的联合身份协议,主要用于企业级单点登录(SSO)。它通过身份提供商(IdP)与服务提供商(SP)之间的断言交换实现跨域认证。

  • 优点: 成熟稳定、企业级安全(支持 XML 签名与加密)、强联合身份模型。
  • 缺点: XML 解析开销大、协议复杂、移动端支持差、配置繁琐。
  • 多租户场景: 每个租户对应一个 SP 实体 ID,IdP 通过 RelayState 参数传递租户上下文,SP 根据断言中的 Attribute 映射租户角色。

3.2.4 OpenID Connect(OIDC)

OIDC 在 OAuth2.0 之上构建了身份认证层,通过 ID Token(JWT 格式)传递用户身份信息。它是现代 SaaS 应用 SSO 的首选方案,支持社交登录与企业联合。

  • 优点: 标准化身份认证、ID Token 自包含用户信息、基于 OAuth2.0 生态、支持动态发现(Discovery URL)。
  • 缺点: 依赖 OAuth2.0 基础设施、令牌管理复杂度较高、需处理 ID Token 的签名验证与过期。
  • 多租户场景: 每个租户拥有独立的 issuer(如 https://auth.saas.com/tenants/acme),OIDC 客户端通过 client_id 与 tenant_id 绑定,ID Token 中的 tenant_id 声明用于租户路由。

3.3 协议选型决策流程

下图展示了在多租户 SaaS 鉴权拦截链路中,根据业务需求选择核心协议的决策路径:

多租户 SaaS 鉴权协议选型决策流程 业务需求分析 是否需要企业级联合 SSO? 是 否 SAML 2.0 OAuth2.0 企业 IdP 集成 是否需要身份认证? 是 否 OpenID Connect 纯授权(API 委托) JWT 令牌格式统一

3.4 多租户场景下的组合策略

在实际 SaaS 架构中,单一协议往往无法满足所有需求。以下推荐三种经过验证的组合模式:

模式 协议组合 适用场景 多租户关键点
现代 SSO OIDC + JWT 面向消费者的 SaaS、社交登录 ID Token 携带 tenant_id,Access Token 用于 API 调用
企业联合 SAML + JWT 企业客户 IdP 集成(如 Azure AD、Okta) SAML 断言映射为 JWT,网关层统一令牌格式
API 生态 OAuth2.0 + JWT 第三方开发者平台、开放 API 每个 App 独立 client_id,JWT 声明租户上下文
架构建议: 在多租户鉴权拦截链路中,推荐将 JWT 作为内部令牌标准,所有外部协议(SAML、OIDC)最终在网关层转换为 JWT。这样下游微服务只需解析 JWT,无需感知上游协议差异,实现协议无关的鉴权拦截。

3.5 选型避坑清单

  • 不要将 JWT 用于长会话: JWT 无状态特性导致无法主动撤销,建议有效期控制在 15-30 分钟,配合刷新令牌使用。
  • 不要忽略 SAML 的 XML 安全: 务必验证签名、检查断言有效期、防范 XML 外部实体注入(XXE)。
  • 不要混淆 OAuth2.0 与 OIDC: OAuth2.0 不提供身份认证,仅授权;OIDC 才是认证协议。使用 OAuth2.0 做登录是常见错误。
  • 不要硬编码租户上下文: 在多租户场景中,令牌中的 tenant_id 应动态解析,避免在代码中写死租户标识。
  • 不要忽略令牌存储安全: 前端使用 HttpOnly Cookie 存储令牌,后端使用安全内存或专用令牌服务,避免 XSS 泄露。