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 认证与授权流程关系

下图展示了从客户端发起请求到服务端完成权限验证的完整流程,清晰区分认证与授权的职责边界。

认证与授权流程关系图 认证与授权流程关系 客户端 gRPC 请求 认证拦截器 (Authentication) 身份通过 授权拦截器 (Authorization) 权限通过 业务 认证失败 → 401 授权失败 → 403 关键原则 认证失败直接返回 401,不进入授权逻辑;授权失败返回 403,但身份已确认

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 调用链中的工作位置与数据流向。

三种认证机制架构对比 三种认证机制架构对比 Token(不透明令牌) gRPC 客户端 Token gRPC 服务端 查询 数据库/缓存 ← 验证结果 JWT(JSON Web Token) gRPC 客户端 JWT gRPC 服务端 本地签名验证 公钥验证 ← 无状态,无需远程查询 mTLS(双向 TLS) gRPC 客户端 (证书) TLS 握手 gRPC 服务端 (证书) 双向校验 CA 证书链 ← 握手后建立安全通道

3.5 选择建议

  • 内部微服务间通信:优先选择 mTLS,利用证书实现身份认证,同时加密传输,符合零信任安全模型。
  • 外部客户端访问:推荐 JWT,无状态、可携带用户声明,适合 API 网关统一认证后转发给后端 gRPC 服务。
  • 遗留系统或 Session 模式:可使用 不透明 Token,但需注意每次验证都需查询后端存储,可能成为性能瓶颈。
gRPC 实战要点:在 gRPC 中,认证信息通常通过 metadata(元数据)传递。JWT 放在 authorization 头部,格式为 Bearer <token>。mTLS 的客户端证书信息可通过 gRPC 的 Peer 上下文获取。后续章节将分别实现这三种机制的拦截器代码。