3、认证与授权基础:认证(Authentication) vs 授权(Authorization)、常见认证机制(Token/JWT/mTLS)对比
在构建 gRPC 微服务时,认证(Authentication)与授权(Authorization)是权限验证体系的两大核心支柱。两者常被混淆,但职责截然不同。本章将厘清概念差异,并对比三种主流认证机制:Token、JWT 与 mTLS,为后续 gRPC 实战打下坚实基础。
3.1 认证 vs 授权:核心区别
认证解决“你是谁”的问题,授权解决“你能做什么”的问题。两者在流程上前后衔接,但在职责、数据载体和验证方式上有本质区别。
| 维度 | 认证(Authentication) | 授权(Authorization) |
|---|---|---|
| 核心问题 | 你是谁? | 你能做什么? |
| 验证对象 | 身份凭证(密码、证书、Token) | 权限策略、角色、属性 |
| 常见机制 | 密码校验、OAuth2、mTLS 握手 | RBAC、ABAC、ACL |
| 失败结果 | 401 Unauthorized | 403 Forbidden |
| gRPC 拦截器位置 | 认证拦截器(先执行) | 授权拦截器(后执行) |
实战提示:在 gRPC 拦截器链中,认证拦截器必须优先于授权拦截器执行。只有确认了调用方身份,才能基于该身份进行权限判定。如果认证失败,直接返回 401,不再执行授权逻辑。
3.2 认证与授权流程关系
下图展示了从客户端发起请求到服务端完成权限验证的完整流程,清晰区分认证与授权的职责边界。
3.3 常见认证机制对比
在 gRPC 微服务架构中,最常用的三种认证机制是:Token(不透明令牌)、JWT(JSON Web Token)和mTLS(双向 TLS)。它们在实现方式、性能、安全性和适用场景上各有优劣。
| 维度 | Token(不透明令牌) | JWT(JSON Web Token) | mTLS(双向 TLS) |
|---|---|---|---|
| 令牌格式 | 随机字符串(无结构) | Base64 编码的 JSON 三段式 | X.509 数字证书 |
| 验证方式 | 服务端查询数据库/缓存 | 本地签名验证(无状态) | TLS 握手时双向证书校验 |
| 是否携带用户信息 | 否(仅令牌 ID) | 是(Payload 包含声明) | 是(证书 CN/SAN 字段) |
| 性能 | 中等(需远程查询) | 高(本地验证,无 I/O) | 高(握手后无额外开销) |
| 吊销能力 | 强(直接删除/过期) | 弱(需黑名单或短过期) | 中等(CRL/OCSP) |
| 适用场景 | 传统 Web 应用、Session 模式 | 微服务间传递身份、API 网关 | 服务间通信、零信任网络 |
| gRPC 集成复杂度 | 低(自定义拦截器) | 低(标准拦截器 + 库) | 中(需管理证书体系) |
安全提醒:JWT 虽然支持无状态验证,但一旦签发,在过期前无法主动吊销。对于高安全场景,建议将 JWT 的过期时间设置为较短(如 15 分钟),并结合 Refresh Token 机制。mTLS 在吊销方面依赖证书吊销列表(CRL)或在线证书状态协议(OCSP),需要额外基础设施支持。
3.4 三种认证机制架构对比
下图从架构层面展示三种认证机制在 gRPC 调用链中的工作位置与数据流向。
3.5 选择建议
- 内部微服务间通信:优先选择 mTLS,利用证书实现身份认证,同时加密传输,符合零信任安全模型。
- 外部客户端访问:推荐 JWT,无状态、可携带用户声明,适合 API 网关统一认证后转发给后端 gRPC 服务。
- 遗留系统或 Session 模式:可使用 不透明 Token,但需注意每次验证都需查询后端存储,可能成为性能瓶颈。
gRPC 实战要点:在 gRPC 中,认证信息通常通过 metadata(元数据)传递。JWT 放在
authorization 头部,格式为 Bearer <token>。mTLS 的客户端证书信息可通过 gRPC 的 Peer 上下文获取。后续章节将分别实现这三种机制的拦截器代码。