Java JSESSION/HTTPSession与应用程序精心编制的会话ID

Java JSESSION/HTTPSession与应用程序精心编制的会话ID,java,spring,servlets,spring-security,shiro,Java,Spring,Servlets,Spring Security,Shiro,在一个基于专有MVC和授权模型的web应用程序中,我们最近迁移到了SpringMVC。 作为这一举措的一部分,我们还将考虑从随每个请求一起传递的本地创建的GUID转移到基于cookie的会话ID 从表面上看,在我们的情况下,这样做似乎是一个很大的缺点,因为标准的JSESSION/HttpSession似乎是所有安全隐患的根源: 会话固定(在现有代码中,会话仅在成功登录后创建,因此我们永远不需要使会话无效) CSRF-会话从来不会作为cookie传递,所以这从来都不是一个风险(天哪,这是一个有问题

在一个基于专有MVC和授权模型的web应用程序中,我们最近迁移到了SpringMVC。 作为这一举措的一部分,我们还将考虑从随每个请求一起传递的本地创建的GUID转移到基于cookie的会话ID

从表面上看,在我们的情况下,这样做似乎是一个很大的缺点,因为标准的JSESSION/HttpSession似乎是所有安全隐患的根源:

  • 会话固定(在现有代码中,会话仅在成功登录后创建,因此我们永远不需要使会话无效)
  • CSRF-会话从来不会作为cookie传递,所以这从来都不是一个风险(天哪,这是一个有问题的问题,因为没有真正的框架或通用解决方案,所以检查了HDIV和CSRFGuard)
  • 测试可用性-QA可以很容易地让具有多个角色的多个用户连接到同一个服务器,这在JSESSION中是不可能的
  • 在各种容器(Weblogic、JBOSS和Websphere)中创建和失效一致的HTTPSession
  • 在HTTP到HTTPS之间移动时,JSession处理不一致

  • 因此,除了“标准化”的明显优势外,关于我为什么要走JSESSION路线,还有什么线索吗?

    关于为什么应该或不应该使用JSESSION,这并不是一个明确的答案,但仍有一些关于您的担忧的评论:

  • 您的应用程序不应依赖于会话是否存在的事实。它应依赖于会话是否根据您对其设置的某些规则(用户已验证、分配给此用户的角色等)有效的事实
  • 只要您注意不要使用GET进行明智的操作,CSRF就不是什么大不了的事情,而且正如您提到的SpringMVC,使用它实现CSRF是非常容易的
  • 没错,如果你只依赖一个浏览器。另外,虽然手动测试在某些情况下仍然是必须的,但许多用例可以从自动化中受益,从而减少从一个角色切换到另一个角色的影响
  • 我从来没有遇到过这样的问题,但是我试着把会议的内容尽量减少
  • 这是一件好事。它可以防止你在没有注意到的情况下离开你的安全连接

  • 现在,无论您选择什么选项,都会有一些缺点。在每个请求中(因此可能在每个GET URL中)都有一个UUID不允许您的用户轻松使用书签。也不允许他们的会话保持活动状态。

    在经过大量讨论分析和测试后,对于我来说,tleast是一个非RESTfull应用程序,具有类似桌面的RIA UI和广泛的安全性考虑,JSESSION不是一个好办法(主要是CSRF)更好的选择是基于主体的内部生成密钥。
    但这确实意味着应用程序将被迫处理超时和会话无效。

    关于remakrs的评论很少(谢谢):2)不是真的,CSRF比beleived危险得多,可以很容易地在POST(和Spring MVC)4)Websphere中使用,例如,除非调用HttpSession.getSession,否则不会创建会话,这与weblogic的behavioru不同。但总的来说,我没有听到任何关于避免JSSession的“大不”的声音,谢谢。我很想知道,你发现HDIV和CSRFGuard不足以提供CSRF保护吗?HDIV支持是不够的。它看起来像一个有趣的软件包,我希望我能使用它。但是我在基于文档实现它时遇到了问题,当我需要帮助时,没有响应。你可以在那里的论坛上查看movement.CSRFGuard看起来是一个很好的解决方案,但是它在CSRF的空间里太偏僻了。我已经有了ProparitySession ID,我用JSESSION替换了它,以查看我有CSRF问题,所以现在我可以添加一个新的包来生成。。。代理会话ID。。我最好(我就是这么做的)将JSESSION排除在我的解决方案之外,它在一些RIA解决方案中根本不可用,就像我的情况一样。