gRPC 的基于令牌的身份验证是否为每次调用添加元数据?

Is token based authentication for gRPC adds metadata for each call?

我正在阅读 gRCP 身份验证,根据我所读的内容,身份验证信息(令牌)似乎作为元数据附加到每个调用(相对于通道)。

我理解的对吗?

我之所以如此困惑,是因为gRPC被吹捧为一种最小化流量的协议。看起来向每个调用添加 JWT 令牌会是一个很大的开销。

有两种身份验证方法:

  1. 频道凭据。这通常意味着相互 TLS,带有客户端证书
  2. 调用凭据。这通常意味着 OAuth 或 JWT,但它是在每个请求中发送的某种承载令牌。基本 HTTP 身份验证属于此类。

您可以选择使用的方法。 TLS 客户端证书在可用时绝对是“最佳”方式,但即使在完美世界中也不能始终使用它。在某些情况下,例如使用三方 OAuth 进行模拟,您唯一的选择是调用凭据。

在元数据中为每个请求发送调用凭证与 HTTP 所采用的方法相同,并且是 JWT 或 OAuth 之类的唯一真实选择。这种类型的身份验证主要独立于 gRPC,需要将令牌与每个请求相关联。如果重复使用相同的令牌,HTTP/2 中的 HPACK 可以避免 re-sending 每个请求中的整个令牌,但这主要只是减少带宽使用。

Exchange-based 不支持 HTTP Header 身份验证系统,这意味着没有 HTTP 摘要。支持这种类型的系统会显着增加延迟,但实际收益有限。 NTLM/Kerberos 也是 exchange-based,但与 HTTP 的集成模型很奇怪,并且与 HTTP/2 完全不兼容。这就是 IIS and .Net 不支持它的原因,除了 HTTP/1.1.