访问令牌有多安全?
How safe is an acess token?
我一直在阅读关于 OAuth 2.0 授权代码流程以保护微服务架构中的 API,但我不明白 Auth 服务器颁发的访问令牌应该如何保护 API 托管在另一台服务器上。
相同的访问令牌是否也保存在 API 中,当客户端尝试使用授权服务器颁发的访问令牌访问它时,API 检查是否包含它?如果是这样,是否意味着访问令牌在身份验证过程中同时发送给客户端和受保护的 API?
我希望已经很好地解释了我的问题。提前致谢。
Access token可以理解为政府根据身份证明发给公民的护照。
当您将它带到另一个国家时,他们会查看该文件并信任它,因为他们信任该国家和您,因为您是该文件的持有人以及您的详细信息。
他们相信护照不能被篡改,允许你入境
现在对于访问令牌,简单来说,授权服务器验证用户。验证后,它会向用户发出 JWT 令牌(访问令牌)。此令牌使用私钥签名。它包含您的详细信息,并与签名一起编码。现在您可以将此令牌交给任何获得 public 密钥并信任授权服务器的第三方。现在,当您与该第三方共享访问令牌时,它会使用 public 密钥来验证令牌并检查是否过期。如果有效,它允许您进入。
所以 API 并不真的需要与 auth 服务器对话或保留有关令牌的任何详细信息。它只需要一个 public 密钥来解码令牌。
现在有两件重要的事情。一个是如果您曾经放过您的访问令牌,或者某个不打算获得您的令牌的人得到了它,他可以做任何他想做的事,而 auth 服务器将无法做太多事情。然而,正如您所看到的,这种方法减少了系统特别是微服务的繁琐。
因此,为了解决这个问题,我们限制了访问令牌的过期时间。像护照一样,它会过期。你保留它的时间越短,用户就必须去使用 auth 服务器刷新令牌。每次他这样做时,auth 服务器都会进行更改以验证信用和其他详细信息。如果它们不匹配访问令牌将不会被刷新。
Anunay 很好地类比了 JWT 如何作为可移植、可信的标识符在高层次上工作,但由于 OAuth 支持的不仅仅是 JWT 身份验证,因此可能需要分享更多细节。
令牌内省
在您的问题中,您正确地假设令牌需要某种方式被信任,并且这种方式之一是将令牌存储在私有数据库中,并在出现令牌时进行查找以确定其有效性。通过使用您希望的任何形式发布令牌并编写执行查找的 introspection 端点,您绝对能够使用这样的方法检测有效的 OAuth 服务器。 OAuth 规范是有意抽象的,因此令牌内省的功能行为可以采用多种形式。
这种抽象级别的原因之一是因为虽然存储用于直接查找的标记可能 容易,但这意味着您必须将这些标记的副本存储在一些形成一个私人数据库进行比较。这种存储反过来会使您成为内部和外部不良行为者的蜜罐,他们会试图冒充您的用户。出于这个原因,OAuth 的许多实现更喜欢使用 public/private 密钥加密而不是直接查找来颁发和验证令牌。这个过程与 Anunay 在他的评论中描述的过程非常相似,因为它发布了用私钥签名并用 public 验证的令牌。通过此过程,您不再需要将每个人的令牌保存在私有数据库中,而只需保护分别用于签署和验证令牌的私钥和 public 密钥。
JSON Web 令牌 (JWT) 和减少内省调用的数量
Anunay 的回应特别提到了使用 public/private 密钥加密生成并发布给用户的通用令牌结构,JSON Web 令牌。这些令牌的结构方式包括后端服务可能需要的用户信息,如用户 ID、电子邮件地址,有时还有更多,采用后端可直接读取的原始格式 API。然而,除了这些原始信息之外,JWT 还包括数据的副本,但这个副本是用私钥加密的。为了信任 JWT 令牌,您所要做的就是使用 public 密钥,并通过将 public 密钥应用于原始有效负载来确保私钥编码的有效负载是可验证的。由于 public 密钥很少更改,因此许多后端服务会缓存用于验证的密钥,并选择不在发布服务器上进行令牌内省,因为它们已经可以验证有效负载。这就是您如何优化通过 OAuth 保护的后端服务的吞吐量。
由于 public 密钥只能用于验证有效负载而不能生成它们,因此这些 public 密钥通常由发布令牌的服务器广播,允许任何人 "trust"如果他们愿意,它会发行代币。要了解有关此过程的更多信息,我建议您研究 OpenID Connect。
我一直在阅读关于 OAuth 2.0 授权代码流程以保护微服务架构中的 API,但我不明白 Auth 服务器颁发的访问令牌应该如何保护 API 托管在另一台服务器上。
相同的访问令牌是否也保存在 API 中,当客户端尝试使用授权服务器颁发的访问令牌访问它时,API 检查是否包含它?如果是这样,是否意味着访问令牌在身份验证过程中同时发送给客户端和受保护的 API?
我希望已经很好地解释了我的问题。提前致谢。
Access token可以理解为政府根据身份证明发给公民的护照。 当您将它带到另一个国家时,他们会查看该文件并信任它,因为他们信任该国家和您,因为您是该文件的持有人以及您的详细信息。 他们相信护照不能被篡改,允许你入境
现在对于访问令牌,简单来说,授权服务器验证用户。验证后,它会向用户发出 JWT 令牌(访问令牌)。此令牌使用私钥签名。它包含您的详细信息,并与签名一起编码。现在您可以将此令牌交给任何获得 public 密钥并信任授权服务器的第三方。现在,当您与该第三方共享访问令牌时,它会使用 public 密钥来验证令牌并检查是否过期。如果有效,它允许您进入。 所以 API 并不真的需要与 auth 服务器对话或保留有关令牌的任何详细信息。它只需要一个 public 密钥来解码令牌。
现在有两件重要的事情。一个是如果您曾经放过您的访问令牌,或者某个不打算获得您的令牌的人得到了它,他可以做任何他想做的事,而 auth 服务器将无法做太多事情。然而,正如您所看到的,这种方法减少了系统特别是微服务的繁琐。
因此,为了解决这个问题,我们限制了访问令牌的过期时间。像护照一样,它会过期。你保留它的时间越短,用户就必须去使用 auth 服务器刷新令牌。每次他这样做时,auth 服务器都会进行更改以验证信用和其他详细信息。如果它们不匹配访问令牌将不会被刷新。
Anunay 很好地类比了 JWT 如何作为可移植、可信的标识符在高层次上工作,但由于 OAuth 支持的不仅仅是 JWT 身份验证,因此可能需要分享更多细节。
令牌内省
在您的问题中,您正确地假设令牌需要某种方式被信任,并且这种方式之一是将令牌存储在私有数据库中,并在出现令牌时进行查找以确定其有效性。通过使用您希望的任何形式发布令牌并编写执行查找的 introspection 端点,您绝对能够使用这样的方法检测有效的 OAuth 服务器。 OAuth 规范是有意抽象的,因此令牌内省的功能行为可以采用多种形式。
这种抽象级别的原因之一是因为虽然存储用于直接查找的标记可能 容易,但这意味着您必须将这些标记的副本存储在一些形成一个私人数据库进行比较。这种存储反过来会使您成为内部和外部不良行为者的蜜罐,他们会试图冒充您的用户。出于这个原因,OAuth 的许多实现更喜欢使用 public/private 密钥加密而不是直接查找来颁发和验证令牌。这个过程与 Anunay 在他的评论中描述的过程非常相似,因为它发布了用私钥签名并用 public 验证的令牌。通过此过程,您不再需要将每个人的令牌保存在私有数据库中,而只需保护分别用于签署和验证令牌的私钥和 public 密钥。
JSON Web 令牌 (JWT) 和减少内省调用的数量
Anunay 的回应特别提到了使用 public/private 密钥加密生成并发布给用户的通用令牌结构,JSON Web 令牌。这些令牌的结构方式包括后端服务可能需要的用户信息,如用户 ID、电子邮件地址,有时还有更多,采用后端可直接读取的原始格式 API。然而,除了这些原始信息之外,JWT 还包括数据的副本,但这个副本是用私钥加密的。为了信任 JWT 令牌,您所要做的就是使用 public 密钥,并通过将 public 密钥应用于原始有效负载来确保私钥编码的有效负载是可验证的。由于 public 密钥很少更改,因此许多后端服务会缓存用于验证的密钥,并选择不在发布服务器上进行令牌内省,因为它们已经可以验证有效负载。这就是您如何优化通过 OAuth 保护的后端服务的吞吐量。
由于 public 密钥只能用于验证有效负载而不能生成它们,因此这些 public 密钥通常由发布令牌的服务器广播,允许任何人 "trust"如果他们愿意,它会发行代币。要了解有关此过程的更多信息,我建议您研究 OpenID Connect。