我在服务器端有一个Sping Boot 应用程序,在客户端有一个Angular App。我正在使用JWT,但我希望能够-对于特定的功能-在两个POST请求之间保留状态(将对象保存为会话属性)。老实说,我是Spring/Angular的新手,我选择这个方案是因为我需要尽快运行我的应用程序。我现在才意识到JWT是完全无状态的。我找到了一些关于如何使用JDBC在Sping Boot 应用程序上启用Http Sessions的文档,数据库和它的表正在创建中,但我仍然会在每个请求上获得一个新的sessionID。在WebSecurity配置中,我将SessionCreationPolicy更改为ALWAYS,并将SessionFixation更改为“NONE”,但它仍然不起作用。从客户端应用程序中,我只发送JWT令牌(如果SessionID可以从Angular发送到服务器,则为idk)。
考虑到我一直在阅读这方面的时间和时间,我猜这是不可能实现的,JWT和Sessions不能结合在一起。但我只是想在放弃之前确定一下。你能就这个主题给我介绍一下吗?
1条答案
按热度按时间inkz8wg91#
我对这个主题做了一些研究,发现了一些东西。我警告你,似乎有相互矛盾的意见,但我希望这能帮助你。
在Medium上的this article中,关于JWT和Session Cookie方法之间的差异。下面是一个小摘录:
**结合两种方法?**一些程序员试图将基于Session Cookie和基于JWT的方法结合起来,并使用一种用于身份验证,另一种用于查找授权资源。基于会话或基于JWT的方法本身是完整的,可以有效地单独管理会话管理,并且 * 将它们组合在一起没有明显的优势(除非有特定的用例可以解决)*。
Devops上的This other article声明:
...通常,* JWT * 基于性能胜出:它们可以实现更快的授权,并与外部应用程序具有更好的互操作性。但他们需要更多的开发人员投资来解决其安全复杂性,并确保正确的护栏到位,以防止漏洞。
另一方面,* 会话令牌 * 可以实现更多控制,但会引入一些延迟。虽然它们提供了更强的保证,即每个单独的请求都得到了授权,并且更容易安全地实现,但它们在服务器端数据库验证上的瓶颈带来了延迟开销,这可能会破坏高度响应的应用程序的用户体验。
虽然这个框架对于总结JWT和会话令牌是很有帮助的,但是它福尔斯了安全性与性能的矛盾,好像两者是相互排斥的。但是,增长和安全领域的前瞻性领导者都认识到,最好的解决方案可以利用安全性来优化用户体验,并加速产品的采用和增长。使用会话管理实现这一点的最佳方法之一是将JWT和会话令牌组合成一个强大的混合体。
结合JWT和会话令牌
到目前为止,公司有几种不同的方式将会话令牌和JWT结合起来。
最简单的方法之一是在用户启动会话时返回session_token和JWT。
session_token是一个静态值,它适用于会话的生存期(存储在服务器端),而JWT有自己的、较短的过期时间。
在这种设置中,过期的JWT可以传递给会话API,以便检索新的JWT,并且服务器确保在传递回新的JWT之前底层会话仍然是活动的。如果用户注销,访问权限的撤销将在您为JWT设置的任何令牌期限内发生。换句话说,只有在JWT过期或在授予对特别敏感的操作的访问权之前,才调用服务器。
通过这种方式配置,这种会话管理方法可以大大降低性能开销,同时还可以保护您和您的最终用户免受基于过时信息授权操作的风险。JWT和会话令牌一起被利用来优化安全性和性能,而不是折衷。
最后,我向你转发了一个项目教程的这一部分,它实现了一个短暂的cookie来存储客户端服务器(react应用程序)和后端服务器(Sping Boot 应用程序)之间安全所需的一些参数。
它不实现会话,但如果我正确理解您的用例,我认为可以帮助您。