我们的团队目前在Angular端或服务器端进行Oauth2身份验证(使用第三方身份提供程序)(我们可能在服务器端有一个中间层,如代理层,它可以进行身份验证等)。然后将呼叫转发到附加有承载令牌的实际REST API)。
从我在Web上的研究来看,主要出于安全目的,在服务器端而不是前端**生成和存储访问令牌似乎更好。
方法1我更倾向于服务器端Oauth2身份验证,我们在代理服务器端生成访问令牌,并将其Map到试图成功登录的给定用户ID,作为令牌存储机制的一部分。(或者)Spring本身有很多内置的东西,其中用户会话已经Map到访问令牌等,作为一些IN内存会话存储的一部分,并无缝地处理访问令牌到期。我们可以在一开始就使用它。
问题:-这种方法是否存在任何安全漏洞,我们从服务器传递给客户端/浏览器的唯一内容是一个cookie,其中只有用户ID信息,并且在后续的来回调用中使用。然后代理服务器获取该用户的相应访问令牌,并将带有该访问令牌的API调用发送到请求。
方法二:
在angular/前端完成所有Oauth2身份验证。随着PKCE的引入,我们可能会在Auth Code Grant类型之上使用它。一旦访问令牌从身份提供者发送,我们计划将其存储在前端的cookie中,并将其附加到后端服务器的后续调用中。与方法1相比,这在实现上不太复杂。它有一种无状态的方法,我们并不真正热衷于这种方法,也不是必须的。
问题:这种方法是否存在安全漏洞。我知道,如果我们计划将访问令牌存储为您的浏览器/系统端本地存储的一部分,则可能会受到CSS攻击。但是,如果我们不将访问令牌存储在任何地方,而只是将其作为cookie的一部分发送到后端服务器,从我所读到的内容来看,我们最终可能会受到CSRF攻击。我仍然需要获得更多关于CSRF攻击的知识,但方法1也是如此。
1条答案
按热度按时间8ehkhllq1#
根据Spring Security团队的最新建议,您应该在服务器上使用“机密”OAuth2客户端,而不是在浏览器中使用“公共”客户端。
我使用的一个选项是在Angular应用程序和Spring资源服务器之间使用
spring-boot-starter-oauth2-client
和TokenRelay=
过滤器配置spring-cloud-gateway
。我在那里写了一个教程(你可以试试here)。OAuth2客户端的Spring实现处理OAuth2流(如何从授权服务器获取令牌),令牌刷新和令牌存储(默认情况下在会话中)。
TokenRelay
过滤器在将请求从前端转发到资源服务器之前,将会话cookie替换为包含会话中访问令牌的Authorization
标头。