2011-04-11 91 views
13

Ruby on Rails支持已签名的基于cookie的会话for quite some time,其中几个encrypted implementations从此开始兴起。 PythonPHP也有实现。Jetty/Tomcat加密的基于cookie的会话存储?

对于Java servlet容器Jetty或Tomcat,是否存在这样的野兽?

我们已经收到了在我们的集群环境中的PHP实现基于关系数据库的会话显著的性能提升,而且我有兴趣尝试与我们的Java应用程序之一(目前使用的码头7)类似的东西。我知道有其他方法可以实现这个目标(memcached,synchronized in-memory缓存),但我相信对于我们的特殊需要,这种存储方法的局限性(输出前的会话结束,4K cookie大小之后的无效存储限制,对超级密钥服务器端密钥的依赖)超过了这个特定应用程序的更简单的部署环境。

如果一个实现不存在,有没有人有任何想法,为什么它不会? (例如,Java会话通常大于4K,因此不适用于此存储方法)

回答

9

我们已经实现了Session-In-Cookie并在Tomcat集群中成功使用它,允许在20个节点间共享会话,从而实现零中断部署。我刚刚在这里写了两部分系列的第一部分:http://blog.shinetech.com/2012/12/18/simple-session-sharing-in-tomcat-cluster-using-the-session-in-cookie-pattern/。本部分涉及基本实现,第二部分将介绍安全方面。

+1

经过近两年的时间,你已经回答了我的问题:1)它确实存在,因为你已经实现了它,2)由于该方法的“承诺响应”问题,它至今尚未完成。 – tjdett 2013-01-07 04:10:01

1

我不知道任何一个容器都会将HttpSession序列化为cookie的cookie。您可以通过实现Filter来实现这种功能,该功能可以将会话状态序列化为cookie上的响应到Web客户端,并在请求中对其进行反序列化。您仍然受到任何客户端Cookie限制的约束,您应该仔细考虑您存储在客户端的状态的安全含义和/或您信任呈现Cookie的客户端的安全含义。

+0

序列化问题似乎是[JDBCSessionManager](http://docs.codehaus.org/display/JETTY/Session+Clustering+with+a+Database)和[jetty-session-memcached]( http://code.google.com/p/jetty-session-memcached/)已经处理。我打算试用的应用程序已经使用了前一个实现,并且我唯一遇到的问题是确保存储会话的任何类都存在于容器而不是servlet上下文中。 – tjdett 2011-04-19 06:46:56

+0

至于安全方面的问题,您可否想到以下任何内容: *确保实施将会话过期日期存储在加密的cookie内并在服务器端强制执行,以防止永久重复使用被劫持的cookie。 *避免将此实现用于任何能够“撤消”会话更改会带来风险的应用程序。 *保持加密密钥非常安全! 我想知道我是否缺少任何东西。 – tjdett 2011-04-19 07:00:53

+0

我想你可能会混淆2个想法 - 码头中的会话聚类是关于在2个或更多服务器实例之间共享会话状态;是的,你需要关心连接到HttpSession的对象的序列化。在这种情况下,jsessionid(通常是基于cookie)是任何服务器实例用来定位共享会话的标识符。因此,您可以通过多种方式在服务器之间进行负载平衡。但是,这与将相关会话状态序列化为cookie不同。在这种情况下,您不需要在服务器上进行会话群集。更多.. – philwb 2011-04-19 15:55:14

1

好像这里有两个问题:

  1. 有效的无状态会话管理的在Java/J2EE实现。
  2. 安全会话实现。

关于第一个问题:是的,根据会话图的大小(深度嵌套所有会话变量/对象),Cookie大小限制(实际上是HTTP头限制)是一个重要因素。如果会话图整齐地适合HTTP头部限制(这在一定程度上可以在Web服务器端配置)和/或可以用基于REST的URL查询参数来扩充(以减轻服务器上的一些状态信息) ...然后一个cookie的实现是可能的。这将是程序化与容器管理。

关于第二个问题:保护会话是另一回事。 Java/J2EE系统中臭名昭着的JSESSIONID通用cookie是应用程序服务器上内存或磁盘缓存会话的简单令牌密钥。它只是一个地图键。使用该密钥,任何人都可以窃取或模拟用户会话。这可能是整个容器管理会话设备中最薄弱的环节之一。有可用的商业安全会话产品可以防止通过cookie窃取进行会话劫持,阻止重播攻击(通过捕获重播加密登录会话以获取会话来阻止SSL)和其他攻击媒介。我知道的一个产品可以在不改变代码的情况下(通过安全过滤器)执行此操作。然而,我不知道有任何通用框架或开源措施来堵住这个漏洞,可能是因为它需要超越一般应用程序开发的专业水平。