无状态服务器如何工作?

时间:2010-12-21 03:08:28

标签: java spring gwt spring-security jetty

我试着理解这一点。通常每次用户登录系统时,服务器端都会创建会话,而用户客户端则有cookie。当人们谈论无状态服务器端,有状态客户端时,它们意味着什么?服务器端无需使用会话跟踪用户?仅在客户端使用cookie来检查用户?意思是如果我更换服务器,用户将不会注意到它仍然可以恢复使用该服务?

如何配置spring-security来执行此操作?

2 个答案:

答案 0 :(得分:37)

跨服务器跟踪用户对于真正的无状态服务器端来说很棘手。大部分时间都是sorta无状态服务器,其中登录是例外。但是,无状态服务器的重要性在于它使聚类变得非常简单,因此您可以水平扩展。

在Java中,您可以使用cookie来存储凭据或使用分布式哈希来使其无状态。通常,人们接受使用像memcache这样的东西并说它们是无状态的,因为状态存储在web服务器之外。这允许用户使用服务器场中的任何Web服务器并仍然可以安全地进行身份验证。在Java中,我们有很多可以与spring一起使用的分布式哈希实现,因此您不必使用memcache来执行此操作。

另一种选择是使用cookie来存储称为HMAC的加密安全散列票证。使用cookie可以避免使用Session,因此Web服务器是无状态的。使用HMAC,您可以签署一个数据块,这些数据不能由第三方伪造或创建,并保证来自您。这不需要外部服务器资源(缓存)来验证用户,因此它可以更好地扩展,但是您必须注意一些安全问题。仅供参考,Google使用此技术进行横向扩展。一个HMAC不像SHA1或其他cyrpto-hashes。它们需要一个必须位于服务器场中每台服务器上的密钥。这也必须使用对称加密密钥进行保护,以确保在有人获得该文件的情况下将其安全地存储在服务器上。此外,HMAC信息以明文形式存储,因此您可以将用户名或电子邮件放入cookie中,任何人都可以使用实际的加密哈希值。如果有人要获得该cookie,他们可以伪装成该用户。这就是为什么HMAC通常仅在一定时间内有效。之后他们就会过期,所以如果有人确实得到了他们,他们就无法永远访问该帐户。

所以HMAC有这个弱点,你应该小心你使用它们的应用程序。对于Paypal使用这个方案是一个非常糟糕的主意,因为我所要做的就是获取你的安全cookie,然后转移你所有的资金对我来说。最重要的是一切都是你的应用程序真正无国籍。

最后一个选项是将您的java会话存储在分布式哈希中。 Php和其他平台会将其会话转储到数据库中,穷人会分配缓存,或者将它们转储到内存缓存中。使用Java,您可以做同样的事情。您也可以将会话对象放入分布式缓存中。这个选项已经不再受欢迎,因为人们认为“现在很酷,我可以将我想要的东西转移到我的会话中,它将是无国籍的。”但是,与所有分布式缓存一样,传输速度,复制时间和有效负载大小都存在限制。这适用于Java或Memcache。保持你的会话小,这很好。将所有内容都放入会话中,然后您可以直接使用单个服务器来解决问题。实际上,它可能比你刚刚使服务器有状态更糟糕,因为有时网格计算比单个服务器更差。

更新:以下是可用于执行此操作的Java分布式缓存库列表:

http://www.manageability.org/blog/stuff/distributed-cache-java

答案 1 :(得分:17)

无状态服务是一种不在应用程序服务器上存储任何数据的服务。它读取或写入数据到数据库,返回一个值(或不返回),之后,任何关于任务本身的信息都被遗忘。

有状态服务用于执行事务,这是一系列依赖于前面任务结果的任务。最简单的示例是在网上商店发送订单,您可以在购物车中收集产品,当您退房时,您在一个页面上输入您的帐户数据,存储它,然后输入您的帐单地址,存储它,然后确认您的订单并完成交易。每个步骤都取决于前一步骤的成功结果,并且需要保留数据,直到完成这些步骤中的最后一个步骤或取消交易,在这种情况下必须进行回滚以将帐户余额恢复到该方式这是在你签出之前。

在大多数情况下,您可以双向实现事务,但如果您要使用无状态服务,则客户端应用程序必须处理正确的顺序和完成任务,或者您必须找到其他方式正确存储事务信息并管理回滚。那就是你所谓的有状态客户端

然而,所有这些都非常普遍,在每种情况下都必须考虑安全性和/或会话处理。您可以很好地使用会话信息来验证无状态服务调用 - 您只需要单独验证每个调用,例如通过将会话ID或用户ID或其他安全令牌附加到业务数据。