1. SaaS鉴权概述:SaaS多租户模型、鉴权与授权的区别、常见鉴权协议对比

1.1 SaaS多租户模型

SaaS(Software as a Service)的核心特征是多租户:一套应用实例同时服务多个客户(租户),每个租户的数据和配置相互隔离。鉴权链路必须从请求中识别出租户身份,才能执行后续的权限判定。

隔离模式 数据隔离方式 鉴权关注点 典型场景
独立数据库 每个租户独享一个数据库实例 连接池路由 + 租户ID校验 金融、医疗等高合规行业
共享数据库·独立Schema 同一数据库,每个租户一个Schema Schema切换 + 租户级Token 中型企业级SaaS
共享数据库·共享表 所有租户共用表,通过tenant_id字段区分 JWT中携带tenant_id,SQL过滤 高性价比、大规模SaaS
关键原则:无论采用哪种隔离模式,SaaS鉴权的第一层必须是租户识别。JWT的payload中应包含 tenant_id 或 org_id 字段,后端在解析Token后立即提取该字段,用于后续数据路由和权限校验。

1.2 鉴权与授权的区别

这两个概念经常被混用,但在SaaS架构中必须严格区分:

  • 鉴权(Authentication):验证“你是谁”。确认用户身份是否合法,通常通过用户名/密码、SSO、OAuth等方式完成。
  • 授权(Authorization):确认“你能做什么”。在身份确认后,判断用户是否有权限执行某个操作或访问某个资源。
维度 鉴权(AuthN) 授权(AuthZ)
核心问题 你是谁? 你能做什么?
典型凭证 密码、OTP、生物特征、JWT 角色、权限策略、ACL、RBAC规则
失败结果 401 Unauthorized 403 Forbidden
SaaS中的层级 用户级 + 租户级双重校验 租户内角色 + 跨租户隔离策略
常见误区:很多开发者将JWT既用于鉴权又用于授权,但JWT本质是身份凭证,属于鉴权范畴。授权应依赖独立的权限引擎或策略决策点(PDP),避免将权限硬编码在Token中导致安全漏洞。

1.3 常见鉴权协议对比

在SaaS架构选型中,Session/Cookie、Token(JWT)、OAuth 2.0 是三种主流方案。下表从多维度对比:

对比维度 Session/Cookie Token(JWT) OAuth 2.0
状态存储 服务端存储Session 客户端自包含(无状态) 授权码+Token(有状态/无状态混合)
跨域支持 差(Cookie跨域受限) 好(Header携带) 好(标准授权流程)
扩展性 需共享Session存储(Redis) 天然水平扩展 依赖授权服务器
安全性 CSRF风险,需SameSite XSS风险,需签名+HTTPS 授权码+PKCE防拦截
SaaS适用性 单体或小型SaaS 微服务SaaS首选 第三方登录/API开放平台
典型实现 JSESSIONID + Redis JWT + RSA/HS256 Authorization Code + PKCE
课程选型建议:本课程采用JWT作为核心鉴权协议。原因:无状态、跨域友好、天然适配微服务SaaS架构。OAuth 2.0将在后续章节作为扩展协议讲解,用于第三方集成场景。

1.4 三种协议的核心流程对比(SVG)

下图直观展示Session/Cookie、JWT Token、OAuth 2.0三种鉴权协议的核心交互流程:

三种鉴权协议核心流程对比 三种鉴权协议核心流程对比 Session/Cookie 客户端 服务端 ① 登录请求 ② Set-Cookie 服务端存储Session,客户端存Cookie JWT Token 客户端 服务端 ① 登录请求 ② 返回JWT 客户端存储JWT,服务端无状态验证 OAuth 2.0 客户端 授权服务器 ① 授权请求 ② 授权码/Token 授权码+Token,支持第三方委托授权 SaaS选型建议:JWT(无状态、跨域友好、微服务适配)

1.5 JWT Token结构详解

JWT(JSON Web Token)由三部分组成,以点号(.)分隔:

// JWT格式示例
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwidGVuYW50X2lkIjoiYWNtZS1jb3JwIn0.MIIBCgKCAQEA...
部分 名称 内容 编码方式
Header 头部 签名算法(alg)、Token类型(typ) Base64URL
Payload 载荷 声明(claims):sub、iat、exp、tenant_id、role等 Base64URL
Signature 签名 对Header+Payload的签名,防止篡改 HMAC/RSA/ECDSA
SaaS最佳实践:在JWT的Payload中至少包含以下自定义声明:tenant_id(租户标识)、role(角色)、permissions(权限列表,可选)。注意Payload是Base64编码而非加密,切勿存放敏感信息(如密码、信用卡号)。

1.6 本章小结

  • SaaS多租户模型决定了鉴权链路必须包含租户识别层,JWT的payload中应携带 tenant_id。
  • 鉴权(AuthN)确认身份,授权(AuthZ)确认权限,两者不可混淆。
  • Session/Cookie、JWT、OAuth 2.0 各有适用场景,本课程聚焦JWT作为SaaS鉴权核心协议。
  • JWT由Header、Payload、Signature三部分组成,无状态、跨域友好,是微服务SaaS架构的首选。