Spring boot JWT + HTTP Session:可能吗?

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

我在服务器端有一个 Spring Boot 应用程序,在客户端有一个 Angular 应用程序。我正在使用 JWT,但我希望能够 - 对于特定功能 - 保留两个 POST 请求之间的状态(将对象保存为会话属性)。老实说,我是 Spring/Angular 的新手,我只是选择这个方案,因为我需要尽快运行我的应用程序。我现在才意识到 JWT 是完全无状态的。我找到了一些关于如何使用 JDBC 在 Spring boot 应用程序上启用 Http 会话的文档,以及正在创建数据库及其表,但我仍然在每个请求上获得一个新的 sessionID。在 WebSecurity 配置中,我将 SessionCreationPolicy 更改为 ALWAYS,将 SessionFixation 更改为“NONE”,但它仍然不起作用。从客户端应用程序,我仅发送 JWT 令牌(如果 SessionID 可以从 Angular 发送到服务器,则不知道)。

考虑到我花了好几个小时阅读这方面的内容,我想这是不可能实现的,JWT 和 Sessions 不能结合起来......但是,好吧,我只是想在放弃之前确定一下。如果有人能给我一些关于这个话题的指导,我将不胜感激。谢谢你。

spring http session jwt boot
1个回答
0
投票

我对这个主题做了一些研究,并发现了一些东西。我警告您,似乎存在相互矛盾的观点,但我希望这可以帮助您。
在 Medium 上的这篇文章中,介绍了 JWT 和 Session Cookie 方法之间的差异。这是一小段摘录:

结合两种方法? 一些程序员尝试将基于 Session Cookie 的方法和基于 JWT 的方法结合起来,使用一种方法进行身份验证,另一种方法用于查找授权资源。 基于会话或基于 JWT 的方法本身是完整的,可以单独有效地管理会话管理,并且将它们组合在一起没有明显的优势(除非有一个可以解决的特定用例)

另一篇关于 DevOps 的文章指出:

... 一般来说,JWT 基于性能而胜出:它们可以实现更快的授权以及与外部应用程序的更多互操作性。但他们需要更多的开发人员投资来解决安全复杂性,并确保采取正确的防护措施来防止漏洞。

另一方面,会话令牌可以实现更多控制,但会带来一些延迟。虽然它们提供了更有力的保证,即每个单独的请求都得到授权并且更容易安全地实现,但它们在服务器端数据库验证上的瓶颈带来了延迟开销,这可能会破坏高响应应用程序的用户体验。

虽然这个框架对于总结 JWT 和会话令牌很有帮助,但它陷入了安全性与性能的陷阱,就好像两者是相互排斥的。 但增长和安全领域具有前瞻性思维的领导者都认识到,最好的解决方案利用安全性来优化用户体验并加速产品采用和增长。通过会话管理实现这一点的最佳方法之一是将 JWT 和会话令牌组合成一个强大的混合体。

结合 JWT 和会话令牌
迄今为止,公司有几种不同的方式将会话令牌和 JWT 结合起来。
最简单的方法之一是在用户启动会话时返回 session_token 和 JWT。

session_token 是一个静态值,有利于会话的生命周期(存储在服务器端),而 JWT 有其自己的较短生命周期。

在此设置中,可以将过期的 JWT 传递到会话 API,以便检索新的 JWT,并且服务器在传回新的 JWT 之前确保底层会话仍然处于活动状态。如果用户注销,则访问权限的撤销将在您为 JWT 设置的任何令牌期限内发生。换句话说,您仅在 JWT 过期时或在授予对特别敏感操作的访问权限之前调用服务器。

通过这种方式配置,这种会话管理方法极大地降低了性能开销,同时还保护您和您的最终用户免受基于过时信息授权操作的风险。 JWT 和会话令牌不是权衡,而是结合使用来优化安全性和性能。

最后,我将您本教程链接到一个项目,该项目实现了一个短期cookie,用于存储客户端服务器(React应用程序)和后端服务器(Spring Boot应用程序)之间安全所需的一些参数。
它没有实现会话,但如果我正确理解您的用例,我认为可以帮助您。

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