微服务身份验证最佳实践和安全性(OAuth 2.0 和 OpenIdConnect)
Microservices Authentication best practices and security (OAuth 2.0 and OpenIdConnect)
有几种方法可以在微服务中构建身份验证。然而,非常流行的是将 JWT 令牌和 OAuth 协议与 OpenID Connect 身份层一起使用。
在 this tutorial 解释如何实现时有一个提示:
Pass by reference when tokens have to leave your network, and then convert them to by-value tokens as they enters your space. Do this conversion in your API gateway.
但是我不清楚背后的原因是什么。我怀疑这可能是由于某些安全方面的好处(不让客户有可能阅读任何特定信息)。因为在 JWT 令牌本身中,它可能是关于 roles/permission 的信息。但为此目的令牌也可以被加密。
另一个原因可能是 JWT token 太大,为了避免每次使用这种方法时都携带此 token。 (或者如果 JWT 令牌存储在 cookie 中,它有大小限制)。
我还没有看到任何关于 JWT 令牌身份验证被泄露的信息,将其保存在客户端(在浏览器中)是一种不好的做法。
另一方面,我看到 Ping Identity 也在使用 通过引用传递 方法。你能帮我理解背后的原因吗?
它们都是有效的选项,并且一如既往,您想要应用它们的确切场景将决定最合适的。通常情况下,每个选项都有其优点和缺点,您已经提到了一些,所以我会尽力在讨论中添加一些新内容。
主要区别在于内容,按值将包含实际值,而引用只是一个随机的位序列。如果您想在令牌中表示敏感信息,这可能会使比例偏向参考令牌。
确实,如果您使用 JWT,您可以对它们进行加密以确保机密性,但这会显着增加复杂性,并且可用库中对 JWT 加密的支持很可能不如给定的签名支持加密没有类似的广泛使用。
关于大小,我认为这不应该是决定因素。是的,如果您使用按值令牌,您需要将它们保持足够小,以免在通道上造成显着开销,但您不应该仅仅因为这个限制而选择一个与另一个。
有一件事你没有提到,但我认为这很重要引用令牌似乎更适合授权服务器和资源服务器属于同一实体的情况。确实已经有一个 standard to cover token introspection 这样外部资源服务器可以以可互操作的方式查询有关引用令牌的信息。然而,当两个参与者都在同一安全边界内时,参考令牌应该更容易扩展和实施,这仍然是事实。
文章中的建议也很有趣,你可以减少外部网络的开销,并且不会出现信息泄露问题,然后在一个中心位置升级到按价值代币,这意味着它背后的所有其他服务可能仍然可以从令牌本身中已有所需信息的简单性中获益。
总而言之,如果信息泄露对您来说是个问题,您可能会选择参考令牌,以免承担 JWT 加密的成本;否则,你还不如让生活变得简单并使用价值代币。
我认为使用参考令牌(不透明令牌)而不是按值 (JWT) 的主要好处(本文想要传达的 - 除了信息披露)是能够在访问令牌时控制访问令牌分布在网络之外。
换句话说,如果我们在网络外发布访问令牌作为 JWT,那么在紧急情况下(当用户停用/终止、丢失手机等时)很难撤销访问。但是引用令牌很容易被撤销,因为它是 AS 边界内的指针。
关于此的更详细解释可用 here。
有几种方法可以在微服务中构建身份验证。然而,非常流行的是将 JWT 令牌和 OAuth 协议与 OpenID Connect 身份层一起使用。
在 this tutorial 解释如何实现时有一个提示:
Pass by reference when tokens have to leave your network, and then convert them to by-value tokens as they enters your space. Do this conversion in your API gateway.
但是我不清楚背后的原因是什么。我怀疑这可能是由于某些安全方面的好处(不让客户有可能阅读任何特定信息)。因为在 JWT 令牌本身中,它可能是关于 roles/permission 的信息。但为此目的令牌也可以被加密。
另一个原因可能是 JWT token 太大,为了避免每次使用这种方法时都携带此 token。 (或者如果 JWT 令牌存储在 cookie 中,它有大小限制)。
我还没有看到任何关于 JWT 令牌身份验证被泄露的信息,将其保存在客户端(在浏览器中)是一种不好的做法。
另一方面,我看到 Ping Identity 也在使用 通过引用传递 方法。你能帮我理解背后的原因吗?
它们都是有效的选项,并且一如既往,您想要应用它们的确切场景将决定最合适的。通常情况下,每个选项都有其优点和缺点,您已经提到了一些,所以我会尽力在讨论中添加一些新内容。
主要区别在于内容,按值将包含实际值,而引用只是一个随机的位序列。如果您想在令牌中表示敏感信息,这可能会使比例偏向参考令牌。
确实,如果您使用 JWT,您可以对它们进行加密以确保机密性,但这会显着增加复杂性,并且可用库中对 JWT 加密的支持很可能不如给定的签名支持加密没有类似的广泛使用。
关于大小,我认为这不应该是决定因素。是的,如果您使用按值令牌,您需要将它们保持足够小,以免在通道上造成显着开销,但您不应该仅仅因为这个限制而选择一个与另一个。
有一件事你没有提到,但我认为这很重要引用令牌似乎更适合授权服务器和资源服务器属于同一实体的情况。确实已经有一个 standard to cover token introspection 这样外部资源服务器可以以可互操作的方式查询有关引用令牌的信息。然而,当两个参与者都在同一安全边界内时,参考令牌应该更容易扩展和实施,这仍然是事实。
文章中的建议也很有趣,你可以减少外部网络的开销,并且不会出现信息泄露问题,然后在一个中心位置升级到按价值代币,这意味着它背后的所有其他服务可能仍然可以从令牌本身中已有所需信息的简单性中获益。
总而言之,如果信息泄露对您来说是个问题,您可能会选择参考令牌,以免承担 JWT 加密的成本;否则,你还不如让生活变得简单并使用价值代币。
我认为使用参考令牌(不透明令牌)而不是按值 (JWT) 的主要好处(本文想要传达的 - 除了信息披露)是能够在访问令牌时控制访问令牌分布在网络之外。
换句话说,如果我们在网络外发布访问令牌作为 JWT,那么在紧急情况下(当用户停用/终止、丢失手机等时)很难撤销访问。但是引用令牌很容易被撤销,因为它是 AS 边界内的指针。
关于此的更详细解释可用 here。