无状态服务器是如何工作的?

29

我试图理解这个问题。通常情况下,每当用户登录系统时,服务器端都会创建一个session,而用户的客户端则有一个cookie。当人们谈论无状态的服务器端、有状态的客户端时,他们是什么意思呢?服务器端不需要使用session来追踪用户吗?只需在客户端使用cookie来检查用户?这意味着如果我更改服务器,用户将不会注意到并且仍然可以继续使用该服务。

如何配置spring-security以实现此目的?


4
我建议您在另一个问题中询问有关spring-security配置的内容,因为回答会与解释无状态服务器的答案非常不同。 - Brad Mace
2个回答

38

在真正无状态的服务器端跟踪用户是很棘手的。大多数情况下,服务器端都是半无状态的,只有登录例外。但是,无状态服务器的好处是使得集群非常简单,可以进行水平扩展。

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

另一个选择是使用Cookie存储加密安全哈希门票(HMAC)。使用Cookie可以避免使用Session,因此Web服务器是无状态的。使用HMAC可以签署一块不能被第三方伪造或创建且保证源于您的数据块。这不需要外部服务器资源(缓存)来验证用户,因此可以更好地扩展,但是您必须注意一些安全问题。FYI,Google使用此技术进行水平扩展。一次HMAC不像SHA1或其他加密哈希那样简单。它们需要一个秘密键,每个服务器都必须拥有。还必须使用对称加密密钥来保护它在文件中的安全存储。此外,HMAC的信息是明文存储的,因此虽然您可以将用户名或电子邮件放入Cookie中,但实际的加密哈希可以被任何人访问。如果有人获得了该Cookie,则可以冒充该用户。这就是为什么HMAC通常只在一定时间内有效的原因。之后它们会过期,所以如果有人确实获得了它们,他们也无法永久访问该账户。

因此,HMAC具有此弱点,您应该谨慎选择使用它们的应用程序。如果Paypal使用此方案将是一个很糟糕的想法,因为我只需要获取您的安全Cookie,然后将您的所有资金转移到我的账户。最大的好处是您的应用程序中的所有内容都是真正无状态的。

最后一种选择是将Java会话存储在分布式哈希中。PHP和其他平台会将它们的会话转储到数据库、穷人版分布式缓存或将其转储到Memcache中。对于Java,您也可以做同样的事情。您也可以将会话对象放入分布式缓存中。这种选择已经不再受欢迎,因为人们认为“很酷,现在我可以将任何东西都倾倒到我的会话中,它将是无状态的。” 然而,就像所有分布式缓存一样,传输速度、复制时间和负载大小都有限制。这对Java或Memcache都是正确的。保持会话小,这样效果很好。将所有内容都放入会话中,您会遇到与单个服务器相同的扩展问题。而且实际上可能比使服务器有状态更糟糕,因为有时网格计算比单个服务器更糟糕。
更新:以下是您可以使用的Java分布式缓存库列表:http://www.manageability.org/blog/stuff/distributed-cache-java

@chubbsondubs 谢谢你的解释。我也想正确理解会话、cookie、令牌、HTTP身份验证等概念。请问你是否能提供这些概念的解释或好的资源?如果需要的话,我可以另外提出问题。 我能否开发一个小型的工作演示来理解cookie、会话、HTTP身份验证呢? - yogeshagr

17
一个无状态服务是不在应用服务器上存储任何数据的服务。它从数据库中读取或写入数据,返回一个值(或不返回),然后任何关于任务本身的信息都会被遗忘。
一个有状态服务用于执行事务,即依赖于先前任务结果的一系列任务。最简单的例子是在网店发送订单,在此过程中,您将商品放入购物车中,并在结帐时在一个页面上输入您的账户数据,并存储它,然后输入您的账单地址并存储它,最后确认订单并完成交易。每个步骤都依赖于前面步骤的成功结果,并且需要保留数据,直到这些步骤中的最后一个完成或者事务被取消,在这种情况下,必须进行回滚以将您的帐户余额恢复到结账之前的状态。
在大多数情况下,你可以两种方式实现事务,但是如果你使用无状态服务,则你的客户端应用程序必须负责处理正确的任务顺序和完成,或者你必须找到另一种正确地存储事务信息并管理回滚的方法。那就是所谓的有状态客户端。
然而,所有这些都是相当通用的,并且安全性和/或会话处理必须在每种情况下加以考虑。您可以很好地使用会话信息来验证无状态服务调用——例如,通过将会话ID或用户ID或其他安全令牌附加到业务数据来对每个调用进行验证。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接