Tomcat,从HTTPS迁移到HTTP时保持会话

我有一个在Tomcat 6.0.29上运行的Java应用程序,前面有Apache 2.2.3。 登录页面使用HTTPS,而大多数页面使用HTTP。

如果用户尝试访问受登录保护的页面(HTTP),则会将其重定向到登录页面(HTTPS),登录,然后重定向回原始请求的页面。 这很好用,因为JSESSIONID cookie设置为非安全,并用于HTTP和HTTPS。

但是,如果用户在登录页面(HTTPS)启动,则JSESSIONID cookie设置为Secure,因此在重定向到HTTP下的页面时,登录后会话不可用,强制新会话并再次重定向到登录页面。 这次它可以工作,因为这次JSESSIONID cookie被设置为非安全。

如何避免用户首次登录登录页面时必须登录两次?

(更新:为清晰起见) 从登录Http get / post开始使用https并在用户的登录会话中使用https。

仅在没有登录用户时使用Http。

有一个原因是cookie不允许跨越协议边界 – 它是一个攻击向量! (*见下面的更新)

怎么做这个非常糟糕的主意

如果你真的坚持,请将重定向中的jsessionId编码为http url(或者始终在url中编码jsession id)。 当Tomcat获得http重定向时,tomcat应该找到会话并继续。

为什么你不应该这样做

说真的,任何在同一页面上混合使用https和http内容的网站只会打开各种有趣(和简单)的攻击。

如果会话的其余部分是明文,则从https继续保持登录“安全”毫无意义。 那么用户名/密码(可能只是密码)受到保护的是什么?

使用常见的中间人攻击,攻击者只需复制会话ID并使用它来获得乐趣。 由于大多数站点不会使保持活动的会话过期,因此MIM实际上具有完全访问权限,就好像他们有密码一样。

如果您认为https在性能方面很昂贵,请查看此处或仅搜索。 将https性能提高到可接受的最简单方法是确保服务器在连接上设置keep-alive。

  • 更新1:有关更多信息,请参阅会话劫持或Http Cookie被盗

  • 更新2:请参阅Firesheep Firefox插件 ,了解如何快速轻松地完成此操作。