您可以在不使其无状态的情况下将 Spring Security 与 REST 服务一起使用吗?

Posted

技术标签:

【中文标题】您可以在不使其无状态的情况下将 Spring Security 与 REST 服务一起使用吗?【英文标题】:Can you use Spring Security with REST service without making it stateless? 【发布时间】:2018-01-21 19:56:18 【问题描述】:

根据文档, https://docs.spring.io/spring-security/site/docs/3.0.x/reference/technical-overview.html。 我打算在调用一些 REST web 服务的 web 应用程序中使用 Spring Security,是否有必要将 SessionCreationPloicy 设置为 STATELESS 作为这个例子, https://github.com/spring-projects/spring-boot/issues/2755。 Spring Security 存储请求之间的 SecurityContext(Session),但我们知道 REST 是无状态的,不使用 HTTP 会话。

将 Spring Security 与调用 REST Web 服务而不将其设置为无状态的应用程序一起使用会出现什么问题?

【问题讨论】:

我相信您可以使用 Spring Security 来保护对 REST 端点的访问。与端点的交互仍然是无状态的,但您需要进行身份验证才能这样做 HTTP 身份验证是 STATEFUL 而 JWT 身份验证是 STATELESS 【参考方案1】:

REST 服务应设置为无状态以实现性能/可扩展性。如果不将安全链设置为无状态,Spring Security 和 servlet 容器可能会创建一个会话。如果客户端在下一个请求中不使用此会话,则会创建另一个会话。第三个请求第三个会话,依此类推。服务器将跟踪会话,直到它们超时(约 30 分钟)。如果有很多请求,这可能/将成为服务器的负担。

我见过没有设置无状态的示例,它们适用于低流量或会话被重用的情况,但出于上述原因,我建议将 REST 服务显式设置为无状态。

另一个问题可能是 CSRF 保护通常对 REST 禁用。通过允许创建会话,系统可能容易受到 CSRF 攻击。

【讨论】:

以上是关于您可以在不使其无状态的情况下将 Spring Security 与 REST 服务一起使用吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使 main() 异步的情况下将异步对象注册到 get_it 包?

如何在不使用任何付费工具的情况下将 dbf 文件导入 mysql?

如何在不杀死 /health 的情况下将我的 Spring Boot 应用程序默认为 application/xml?

如何在不创建通知的情况下将图标添加到 Android 状态栏?

在不使用 spring-boot 执行器的情况下将来自 spring 应用程序的指标公开给 prometheus

如何在不使项目变灰的情况下禁用 UITabBarItem