1. 认证与授权基础
1.1 核心概念:认证 vs 授权
在构建安全系统时,认证(Authentication)与授权(Authorization)是最容易被混淆的两个基础概念。它们虽然紧密关联,但职责完全不同。
| 维度 | 认证(Authentication) | 授权(Authorization) |
|---|---|---|
| 核心问题 | 你是谁? | 你能做什么? |
| 目的 | 验证用户身份的真实性 | 授予用户访问资源的权限 |
| 执行时机 | 先执行,通常在登录时完成 | 后执行,在认证通过后校验 |
| 凭证示例 | 用户名/密码、生物特征、OTP | 访问令牌、角色、权限策略 |
| 常见协议 | LDAP、SAML、OIDC | OAuth 2.0、RBAC、ABAC |
| 失败后果 | 无法进入系统 | 越权操作或数据泄露 |
实战口诀:认证是“验明正身”,授权是“划定权限”。在 JWT 契约校验中,
sub(主题)声明用于认证,roles 或 permissions 声明用于授权。
1.2 常见认证模型对比
现代 Web 应用主要采用三种认证模型:Session 模型、Token 模型和OAuth 2.0 模型。每种模型在状态管理、扩展性和安全性上各有取舍。
1.2.1 Session 模型(有状态)
- 工作原理:服务端生成 Session ID,存储在服务端内存或 Redis 中,客户端通过 Cookie 携带 Session ID。
- 优点:实现简单,服务端可主动吊销会话。
- 缺点:服务端需要维护会话状态,水平扩展时需共享 Session(如 Redis Session Store),不适合移动端和跨域场景。
1.2.2 Token 模型(无状态)
- 工作原理:服务端签发一个自包含的 Token(如 JWT),客户端在后续请求中通过 HTTP Header 携带 Token。
- 优点:服务端无需存储会话,天然支持水平扩展,适合移动端和跨域场景。
- 缺点:Token 签发后无法直接吊销(需配合黑名单或短有效期),Token 体积较大。
1.2.3 OAuth 2.0 模型(授权委托)
- 工作原理:资源所有者(用户)授权第三方应用获取有限访问权限,通过授权服务器颁发访问令牌。
- 优点:解耦资源服务器与授权服务器,支持多种授权流程(授权码、客户端凭证等),是开放 API 的标准方案。
- 缺点:协议复杂,需要理解多种 grant type,实现成本较高。
选型建议:单体应用或内部系统优先考虑 Session 模型;分布式微服务架构首选 Token 模型(JWT);开放 API 或第三方集成场景必须使用 OAuth 2.0。
1.3 JWT 在认证授权中的角色
JSON Web Token(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间以 JSON 对象形式安全传输信息。JWT 在认证授权体系中扮演着“契约载体”的核心角色。
1.3.1 JWT 的核心价值
- 自包含(Self-contained):JWT 本身携带了用户身份、权限、有效期等所有必要信息,服务端无需查询数据库即可完成校验。
- 防篡改(Tamper-proof):通过 HMAC 或 RSA/ECDSA 签名机制,任何对 JWT 内容的修改都会导致签名验证失败。
- 跨域友好:JWT 基于 HTTP Header 传输,不受 Cookie 同源策略限制,天然支持跨域和移动端场景。
- 标准化:JWT 结构(Header.Payload.Signature)被广泛支持,几乎所有编程语言都有成熟的 JWT 库。
1.3.2 JWT 在三种模型中的位置
| 模型 | JWT 的角色 | 典型场景 |
|---|---|---|
| Session 模型 | 可选替代方案,将 Session 数据编码为 JWT,减少服务端存储 | 无状态 Session、移动端适配 |
| Token 模型 | 核心载体,作为访问令牌(Access Token)直接使用 | 微服务认证、单点登录(SSO) |
| OAuth 2.0 模型 | 访问令牌的推荐格式,也可用于 ID Token(OIDC) | 开放 API 授权、第三方登录 |
⚠️ 常见误区:JWT 不是加密协议,它是签名协议。JWT 的 Payload 默认是 Base64 编码(非加密),任何人都可以解码读取。如果需要保护敏感数据,必须使用 JWE(JSON Web Encryption)或额外加密。
1.4 本章小结
- 认证与授权是安全体系的两大支柱:认证解决“你是谁”,授权解决“你能做什么”。
- Session、Token、OAuth 2.0 三种模型各有适用场景,选择时需权衡状态管理、扩展性和安全性。
- JWT 作为自包含的契约载体,在 Token 模型和 OAuth 2.0 模型中扮演核心角色,其签名机制保证了信息的完整性和防篡改性。
- 在后续章节中,我们将深入 JWT 的契约校验细节,包括签名验证、声明校验、黑名单处理以及安全最佳实践。