Session 如何避免在Java webapp中使用服务器端会话进行身份验证?

Session 如何避免在Java webapp中使用服务器端会话进行身份验证?,session,authentication,jakarta-ee,web-applications,stateless,Session,Authentication,Jakarta Ee,Web Applications,Stateless,我希望确保对web应用程序中资源的访问安全,因此我使用标准机制对用户进行身份验证,并使用服务器端会话保留身份验证状态 我希望以负载平衡配置跨多个系统部署,但我不希望开始跨我的基础架构同步会话状态。是否有方法(使用JavaEE中的规范驱动工具或常用的LIB,如SpringSecurity)在没有服务器端会话的情况下保留用户的身份验证状态,例如将所需状态推回到客户端?如果是,我是否需要注意其他风险 更新-我根据Java EE webapp规范使用声明式安全性,并通过LDAP存储库进行身份验证。您可

我希望确保对web应用程序中资源的访问安全,因此我使用标准机制对用户进行身份验证,并使用服务器端会话保留身份验证状态

我希望以负载平衡配置跨多个系统部署,但我不希望开始跨我的基础架构同步会话状态。是否有方法(使用JavaEE中的规范驱动工具或常用的LIB,如SpringSecurity)在没有服务器端会话的情况下保留用户的身份验证状态,例如将所需状态推回到客户端?如果是,我是否需要注意其他风险



更新-我根据Java EE webapp规范使用声明式安全性,并通过LDAP存储库进行身份验证。

您可以使用开放式id服务器进行身份验证,从而分离身份验证和应用程序逻辑

我不知道框架解决方案,但以下方法确实有效:

用户成功登录后,您将创建一个安全令牌,并将其值设置为cookie。令牌包含所需的所有信息(用户ID、创建时间等),并使用某种算法进行加密。因此,集群中的所有节点都可以读取令牌、解密令牌并识别用户。然后,通过使用
HttpServletRequestWrapper
创建一个
ServletFilter
拦截所有请求,检查令牌并设置相应的用户凭据,例如
ServletRequest.getRemoteUser()


一种解决问题的方法。但您必须小心,自制的安全性必须经过深思熟虑。

您可以在身份验证后将某种令牌存储在cookie中,并自行管理会话属性。例如,有一个数据库表,其主键是身份验证令牌并存储用户会话数据。。。别忘了执行一项清理非活动“会话”的作业

至于你应该知道什么,请记住cookies是容易访问、窃取、删除、禁用等的。身份验证令牌应该是强的和可验证的(散列用户ip+浏览器+旋转盐+其他一些你可以检查的东西的组合)

将用户身份验证分为两个级别也是明智的。“有cookie”和“刚刚验证cookie”。。。假设“havethecookie”是一种状态,可以在那里停留半个小时(或者更长),允许用户浏览站点。“刚验证”状态用于重要操作,应要求用户再次输入其凭据。此“刚验证状态”的超时时间不应超过几分钟

请记住,我假设您的站点没有保存真正敏感的数据。对于这些情况,我建议使用外部令牌或安全卡加上旋转令牌设备加上生物认证的双向SSL认证:D:D:D。。。我想你明白我的意思了


干杯,

我想我还是有同样的问题。(我现在正在使用LDAP auth)当用户试图访问受保护的资源时,会将其发送到登录表单。它们登录,然后(如果成功)发送到资源。但我认为会话ID随后被用来“记住”用户已登录,需要将会话数据存储在服务器上。如何避免将会话数据存储在服务器上,但仍能记住用户的身份验证状态?