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三种鉴权协议的核心交互流程:
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架构的首选。