Spring Security OIDC 和 JWT 代替会话

问题描述 投票:0回答:1

我们正在考虑实现无状态,即使用 JWT 代替会话。但 OIDC 和 Spring Security 似乎有点棘手。一些博客文章,例如Spring Lemon[1],建议对 Spring 的几个 OIDC 类进行子类化,并在用户经过身份验证后使用过滤器来发布签名的 JWT,但它们基于

.oauth2ResourceServer()
在安全配置中作为可配置类使用之前的旧版本。

现在我们的用户使用OIDC进行认证,但我们也提供了API,因此我们也有API用户。在撰写本文时,我们正在重写应用程序以变得更加 RESTful。更多的逻辑会放在前端,后端只提供几个API。为了进一步简化模型,我们的想法是为 API 和 OIDC 用户使用 JWT 而不是会话。

最好的方法是什么?仍然为最终用户使用会话(并且仅对 API 用户使用 JWT),还是尝试使用 JWT 为所有用户构建无状态应用程序?春天柠檬是正确的选择吗?我们是否还应该在配置类中使用

oauth2ResourceServer
来验证 JWT?

[1] Spring 柠檬:https://dzone.com/articles/spring-security-5-oauth-20-login-and-signup-in-stas

spring spring-security jwt openid-connect spring-security-oauth2
1个回答
0
投票

很晚才回复...

使用资源服务器实现无状态(使用访问令牌保护的 REST API)。无会话使可扩展性更加容易,并且对 CSRF 攻击不敏感(一旦选择“无状态”会话管理,您就可以禁用该攻击。

但是,OAuth2 资源服务器只能从 OAuth2 客户端查询,并且不再建议将 Web 或移动应用程序配置为“公共”OAuth2 客户端:公共客户端比机密客户端更危险,并且隐藏令牌更安全互联网和移动电话、网络浏览器以及在其上运行的代码。最后,使用带有仅 http 安全 cookie 的会话会更安全。

此类前端(移动和 Web 应用程序)的最佳选择是在服务器上引入中间件(称为 Backend FFrontend),配置为 OAuth2 客户端,负责:

  • 处理authorization_code流程(登录)
  • 在会话中存储令牌
  • 在将请求转发到资源服务器之前,用访问令牌替换会话 cookie。

当然,这样的 BFF 是有状态的,并且必须针对 CSRF 进行保护。

spring-cloud-gateway
可以通过
spring-boot-starter-oauth2-client
TokenRelay=
过滤器轻松配置为 BFF。我在那里写了一个教程,但请注意,它使用了我的另一个启动器(您会在同一个存储库中找到在没有“我的”启动器的情况下编写安全配置的教程)。

© www.soinside.com 2019 - 2024. All rights reserved.