在 API 网关级别与单个微服务级别解码 OAuth2 JWT
Decoding OAuth2 JWT at API Gateway level vs at individual microservice level
我使用 Spring Boot 1.5.x + OAuth2 和 JWT 开发了一组微服务(资源服务器)。现在每个微服务都使用 Spring 安全性进行保护,即 JWT 访问令牌在单个资源服务器级别进行验证。 API 网关没有 spring 安全措施,因此它只是将请求路由到适当的服务器并将身份验证 headers 传播到下游服务。
我想知道与仅在 API 网关级别验证 AccessToken 的设置相比,此设置是否有任何缺点。还是只是见仁见智?将安全性保持在 API 网关级别不会破坏松散耦合的原则,因为每个微服务都可以更好地理解给定用户在其自己的上下文中的角色吗?
API 管理层可以对您的 JWT 做一个小检查(提前失败),但是您的微服务是唯一可以真正管理所有安全内容的微服务!
如果您仅在 api 管理上设置安全性,这意味着可以访问您的网络的人将能够在未经身份验证的情况下向您的 API 发送请求。
您将无法记录谁做了什么。最后,如果你需要设置某种ACL,那将是不可能的(当你要求列出订单时,你只能列出你的订单)。
也许你会考虑在 api 管理层解码你的 JWT,然后将带有用户名的 header 推送到你的后端,以防止我上面所说的所有事情,但我认为它这不是一个好的做法。
首先,访问网络意味着我可以成为任何人。那么 JWT 不仅仅是一个用户名。例如,也许您在身份验证层上使用范围。 (范围读取命令/范围修改命令/范围删除命令)。这对于限制应用程序可以执行的操作(在 client_id 级别)或用户接受向应用程序提供的内容( scope share email ...)很有用。
为此,后台的 JWT 是强制性的。
好的,您可以像用户名一样,提取有关 api 管理的数据,并将特定的 header 放入后端调用,但真的吗?为什么要做具体的事情?带有 JWT 的 oauth2 可以为您做到这一点。
好吧,这是一个有趣的问题。在我们的团队中,我们就这个话题进行了很多讨论。基本上你有一些参数会影响这个问题的个人答案。但是您也应该始终在微服务级别解码和验证授予的令牌。因为它们包含用于身份验证的相关信息,在某些情况下甚至用于授权。如果您的微服务 运行 在封闭的环境中(例如在封闭的 Kubernetes 集群中,只有 API-Gateway 对外可用),您可以使用此 "mixed" 解决方案。
真的可以考虑只在API-Gateway验证AccessToken,让其他微服务依赖APIGateway。 API 网关可以将 AccessToken 交换为另一个 AuthToken,仅在微服务上下文中有效。例如,这个新生成的 AuthToken 可以包含更敏感的应用程序绑定信息,因为它不会暴露给客户端。客户仅获得一个所谓的不透明令牌。参见 https://medium.com/tech-tajawal/microservice-authentication-and-authorization-solutions-e0e5e74b248a
我使用 Spring Boot 1.5.x + OAuth2 和 JWT 开发了一组微服务(资源服务器)。现在每个微服务都使用 Spring 安全性进行保护,即 JWT 访问令牌在单个资源服务器级别进行验证。 API 网关没有 spring 安全措施,因此它只是将请求路由到适当的服务器并将身份验证 headers 传播到下游服务。
我想知道与仅在 API 网关级别验证 AccessToken 的设置相比,此设置是否有任何缺点。还是只是见仁见智?将安全性保持在 API 网关级别不会破坏松散耦合的原则,因为每个微服务都可以更好地理解给定用户在其自己的上下文中的角色吗?
API 管理层可以对您的 JWT 做一个小检查(提前失败),但是您的微服务是唯一可以真正管理所有安全内容的微服务!
如果您仅在 api 管理上设置安全性,这意味着可以访问您的网络的人将能够在未经身份验证的情况下向您的 API 发送请求。 您将无法记录谁做了什么。最后,如果你需要设置某种ACL,那将是不可能的(当你要求列出订单时,你只能列出你的订单)。
也许你会考虑在 api 管理层解码你的 JWT,然后将带有用户名的 header 推送到你的后端,以防止我上面所说的所有事情,但我认为它这不是一个好的做法。
首先,访问网络意味着我可以成为任何人。那么 JWT 不仅仅是一个用户名。例如,也许您在身份验证层上使用范围。 (范围读取命令/范围修改命令/范围删除命令)。这对于限制应用程序可以执行的操作(在 client_id 级别)或用户接受向应用程序提供的内容( scope share email ...)很有用。 为此,后台的 JWT 是强制性的。
好的,您可以像用户名一样,提取有关 api 管理的数据,并将特定的 header 放入后端调用,但真的吗?为什么要做具体的事情?带有 JWT 的 oauth2 可以为您做到这一点。
好吧,这是一个有趣的问题。在我们的团队中,我们就这个话题进行了很多讨论。基本上你有一些参数会影响这个问题的个人答案。但是您也应该始终在微服务级别解码和验证授予的令牌。因为它们包含用于身份验证的相关信息,在某些情况下甚至用于授权。如果您的微服务 运行 在封闭的环境中(例如在封闭的 Kubernetes 集群中,只有 API-Gateway 对外可用),您可以使用此 "mixed" 解决方案。
真的可以考虑只在API-Gateway验证AccessToken,让其他微服务依赖APIGateway。 API 网关可以将 AccessToken 交换为另一个 AuthToken,仅在微服务上下文中有效。例如,这个新生成的 AuthToken 可以包含更敏感的应用程序绑定信息,因为它不会暴露给客户端。客户仅获得一个所谓的不透明令牌。参见 https://medium.com/tech-tajawal/microservice-authentication-and-authorization-solutions-e0e5e74b248a