无状态服务器如何工作?

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

如何配置spring-security来做到这一点?

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

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

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

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

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

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

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

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

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

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

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