Logo Logo
GitHub Designed by Logto

什么是不透明令牌 (Opaque token)?

不透明令牌 (Opaque token) 是一个随机的、唯一的字符串,对客户端没有意义,但作为引用键用于在服务器的数据库中查找授权数据。

不透明令牌通常使用 密码学安全伪随机数生成器 生成,以确保其不可预测性和安全性,其格式由其发行者决定。

以下是不透明令牌的示例:

M-oxIny1RfaFbmjMX54L8Pl-KQEPeQvF6awzjWFA3iq

JWT (JSON Web Token) 和不透明令牌 (Opaque token) 的区别是什么?

主要区别在于这些令牌如何处理和验证授权信息:

不透明令牌 (Opaque token) 是一个不包含任何信息的随机字符串。服务器必须查询其后端数据库以检索与此令牌关联的任何授权数据。这使得不透明令牌完全依赖于授权服务器进行验证和解释。

JWT 是一个自包含的令牌,携带所有必要的信息。

以下是一个 JWT 的示例,它是一个 base64 编码的字符串:

eyJhbGciOiJIUzI1NiIs.eyJzdWIiOiIxMjM0NTY3O.SflKxwRJSMeKKF2QT4f

它包含三个用点分隔的部分:

  1. Header - 包含关于令牌类型和用于签名的算法的信息。例如,{"alg": "HS256", "typ": "JWT"}
  2. Payload - 包含声明 (claims)——关于用户或授权的信息,如用户 ID、过期时间和范围。任何人都可以解码它以查看声明,因为它是编码的但不是加密的。
  3. Signature - 通过使用指定的算法结合头部、负载和一个密钥生成的签名。此签名用于验证令牌的完整性并确保其未被篡改。

这种结构允许 JWT 在不查询数据库的情况下进行验证和使用。

有关 JWT 的详细信息,请参阅 JSON Web Token (JWT)

并查看 Opaque token vs JWT 以更深入地了解它们的区别。

如何验证不透明令牌 (Opaque token)

在简单系统中,不透明令牌 (Opaque token) 的验证通常由服务器直接处理,服务器使用不透明令牌作为键查询数据库以检索关联的授权信息。

在引入 OAuth 2.0 的多方系统中,多个资源服务器(参见: 资源服务器 (Resource server) )可能需要验证相同的不透明令牌。OAuth 2.0 提供了一种标准化的令牌内省机制用于此验证:

有关令牌内省的详细信息,请参阅 令牌内省 (Token introspection)

不透明令牌 (Opaque token) 在 OIDC 中如何使用?

在 OIDC ( OpenID Connect (OIDC) ) 的上下文中,不透明令牌在不同场景中具有特定用途:

用户资料检索

默认情况下,当客户端请求访问令牌而未指定资源并包含 openid 范围时,授权服务器会颁发一个不透明的访问令牌。此令牌主要用于从 OIDC /oidc/userinfo 端点(参见: 用户信息端点 (Userinfo endpoint) )检索用户资料信息。

刷新令牌交换

刷新令牌 (Refresh tokens)(参见: 刷新令牌 (Refresh token) )通常作为不透明令牌颁发,因为它们仅在客户端和授权服务器之间交换。当当前访问令牌过期时,客户端可以使用不透明刷新令牌获取新的访问令牌,而无需重新认证用户。

不透明令牌 (Opaque token) 的优缺点是什么?

优点

  • 安全性:不透明令牌非常适合处理敏感数据,如刷新令牌。由于内容完全随机且无意义,即使有人截获令牌,他们也无法提取任何有用的信息。这使得它们在高安全性场景中尤其有价值,如银行交易或处理敏感用户数据。

  • 可撤销性:服务器可以随时立即使不透明令牌失效。这在需要快速移除用户访问时特别有用。与 JWT 在过期前仍然有效不同,不透明令牌可以立即撤销(参见: JWT 的限制 )。

  • 大小:不透明令牌通常比 JWT 短得多。较小的大小减少了网络带宽使用和存储需求。在频繁传输令牌的系统中,这种优势尤其明显,如移动应用程序或物联网设备。

  • 简单性:不透明令牌的实现非常简单。你生成一个随机字符串并存储其关联的数据。无需像处理 JWT 那样处理复杂的加密或签名验证。这种简单性使它们非常适合内部系统认证。

缺点

  • 有状态:每个不透明令牌都需要在服务器端存储。这在分布式系统中增加了复杂性,因为令牌数据必须在多个服务器之间同步。例如,如果你有多个认证服务器,它们都需要访问相同的令牌数据库或缓存系统以正确验证令牌。

  • 性能:令牌验证总是需要数据库查询或 API 调用。在高流量系统中,这些额外的数据库查询可能会造成性能瓶颈。例如,如果你的系统每秒处理数千个请求,每个请求都需要令牌验证,那么额外的数据库负载就会变得显著。

  • 互操作性:不同的系统可能以不同的方式实现不透明令牌。这可能在与第三方服务或不同授权服务器合作时造成集成挑战。虽然像 OAuth 2.0 令牌内省这样的标准有所帮助,但当系统使用不同的令牌格式或验证方法时,你可能仍会遇到兼容性问题。

另请参阅