我希望几个相关网络应用的客户端拥有自己的身份验证状态。这提高了可伸缩性,因为不需要群集节点之间的会话复制。它使得Java Servlets和PHP等不同服务器技术的集成变得更加容易。
我的计划如下:
所有想要使用会话的服务器只需知道cookie机制和解密密钥。另见:Session state in the client tier
这种方法可以吗?是否可以将它集成到servlet容器/应用程序服务器中,以便它对应用程序透明?例如,servlet应该能够使用HttpServletRequest#getRemoteUser()。这可能吗?或者我是否需要像Spring Security这样的容器级别以上的东西?是否有任何现有的客户端会话管理库?
答案 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流量