我们正在考虑实现无状态,即使用 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
很晚才回复...
使用资源服务器实现无状态(使用访问令牌保护的 REST API)。无会话使可扩展性更加容易,并且对 CSRF 攻击不敏感(一旦选择“无状态”会话管理,您就可以禁用该攻击。
但是,OAuth2 资源服务器只能从 OAuth2 客户端查询,并且不再建议将 Web 或移动应用程序配置为“公共”OAuth2 客户端:公共客户端比机密客户端更危险,并且隐藏令牌更安全互联网和移动电话、网络浏览器以及在其上运行的代码。最后,使用带有仅 http 安全 cookie 的会话会更安全。
此类前端(移动和 Web 应用程序)的最佳选择是在服务器上引入中间件(称为 Backend F或 Frontend),配置为 OAuth2 客户端,负责:
当然,这样的 BFF 是有状态的,并且必须针对 CSRF 进行保护。
spring-cloud-gateway
可以通过 spring-boot-starter-oauth2-client
和 TokenRelay=
过滤器轻松配置为 BFF。我在那里写了一个教程,但请注意,它使用了我的另一个启动器(您会在同一个存储库中找到在没有“我的”启动器的情况下编写安全配置的教程)。