客户端会话

时间:2010-01-25 10:14:04

标签: java security session servlets application-server

我希望几个相关网络应用的客户端拥有自己的身份验证状态。这提高了可伸缩性,因为不需要群集节点之间的会话复制。它使得Java Servlets和PHP等不同服务器技术的集成变得更加容易。

我的计划如下:

  1. 在客户端身份验证后,使用用户名和会话到期时间设置已签名和加密的Cookie。
  2. 当客户端发送请求时,服务器会解密并验证cookie并根据cookie值授予或拒绝访问权限。
  3. 会话过期将通过重置cookie进行更新。
  4. 所有想要使用会话的服务器只需知道cookie机制和解密密钥。另见:Session state in the client tier

    这种方法可以吗?是否可以将它集成到servlet容器/应用程序服务器中,以便它对应用程序透明?例如,servlet应该能够使用HttpServletRequest#getRemoteUser()。这可能吗?或者我是否需要像Spring Security这样的容器级别以上的东西?是否有任何现有的客户端会话管理库?

6 个答案:

答案 0 :(得分:8)

不是个好主意。完全在客户端存储会话到期和用户名等重要数据是太危险的IMO,加密与否。即使这个概念本身在技术上是安全的(我无法深入回答,我也不是加密专家),只需获取加密密钥,就可以在不损害服务器的情况下促成闯入。

掌握密钥的人可以随意生成会话cookie,模仿任何用户任何时间长度,这是经典会话概念旨在防止的。

针对此问题,有更好的可扩展解决方案。例如,为什么不设置所有相关服务器和服务可以轮询的中央会话验证实例?在网上浏览,我100%确定有现成的解决方案满足您的需求。

答案 1 :(得分:3)

  

这提高了可伸缩性,因为不需要在群集节点之间进行会话复制。

首先,即使使用HTTP会话状态复制,使用HTTP Session也不会真正阻止您进行扩展(顺便说一下,某些机制比其他机制更智能,例如WebLogic的in-memory replication没有很大的开销)。第二,你真的需要吗?大多数应用程序(大多数)不需要会话复制。第三,我理解正确:你打算不使用HTTP Session吗?

  

(...)在客户端身份验证后,使用用户名和会话到期时间设置已签名和加密的cookie。

不要这样做!不要在cookie中存储服务器使用的用户名和其他敏感数据,这是一个非常糟糕的主意!实际上你需要承认,在有人弄清楚你的系统如何工作并打破它之前(特别是如果你的cookie是crib攻击的候选者),这只是一个时间问题。实际上,你应该在服务器端的Session中存储数据,而在cookie中只存储一个ID,就像实际工作一样。这样更安全。

  

这种方法可以吗?

否。并且您不需要这可用于可互操作的single-sign on(如果这是您要构建的内容)。只需使用像CASJasig这样的集中式身份验证解决方案,它具有各种技术的库。

答案 2 :(得分:2)

我不同意海报说这种做法不安全。它的变体被用在许多备受推崇的框架中,例如Rails和Play !,正是因为你概述的原因,并且在正确实现时它是完全安全的。

答案 3 :(得分:1)

这并不是Sessions的实施方式。 cookie本身不需要携带会话本身的任何数据,它只是对它的引用。

Cookie保存的内容通常是Session ID,然后将其链接到服务器上的数据。

如果您没有其他服务器访问的中央数据会话服务器,我建议您购买一个:)。

答案 4 :(得分:1)

您可以使用状态服务器来避免群集环境中的数据重复 - 状态服务器是群集中所有节点都知道的服务器,并维护所有用户的会话数据。每次用户执行请求时,它都会向会话服务器发送带有会话ID的cookie;这个应该从状态服务器检索会话。这对于asp.net开发是可行的,但我不确定Java支持这种方法有多么容易。

答案 5 :(得分:0)

正如佩卡所说,不是一个好主意。可以使用敏感会话数据拦截您的cookie。即使使用SSL,通过使用fiddler2,也可以decrypt流量