无状态服务器如何工作?

2022-09-01 12:53:54

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

如何配置弹簧安全性来执行此操作?


答案 1

跨服务器跟踪用户对于真正的无状态服务器端来说很棘手。大多数时候,事情是无状态服务器,登录是例外。但是,无状态服务器的主要优点是它使群集变得非常简单,因此您可以水平扩展。

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

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

因此,HMAC有这个弱点,您应该小心在哪些应用程序中使用它们。对于PayPal来说,使用此方案将是一个非常糟糕的主意,因为我所要做的就是获得您的安全cookie,然后将所有资金转移给我。最大的好处是一切都是你的应用程序是真正的无状态。

最后一个选项是将 Java 会话存储在分布式哈希中。Php和其他平台会把他们的会话转储到数据库中,穷人分布式缓存,或者把他们转储到memcache中。使用Java,你可以做同样的事情。您也可以将会话对象放入分布式缓存中。这个选项已经失宠了,因为人们认为“很酷,现在我可以把任何我想要的东西倾倒到我的会话中,它将是无状态的。但是,与所有分布式缓存一样,传输速度、复制时间和有效负载大小都有限制。对于Java或Memcache来说,情况确实如此。保持您的会话较小,这很有效。将所有内容放入会话中,然后直接返回到单个服务器的扩展问题。实际上,这可能比您刚刚使服务器具有状态更糟糕,因为有时网格计算比单个服务器更糟糕。

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

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


答案 2

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

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

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

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


推荐