我试图理解这个问题。通常情况下,每当用户登录系统时,服务器端都会创建一个session,而用户的客户端则有一个cookie。当人们谈论无状态的服务器端、有状态的客户端时,他们是什么意思呢?服务器端不需要使用session来追踪用户吗?只需在客户端使用cookie来检查用户?这意味着如果我更改服务器,用户将不会注意到并且仍然可以继续使用该服务。
如何配置spring-security以实现此目的?
我试图理解这个问题。通常情况下,每当用户登录系统时,服务器端都会创建一个session,而用户的客户端则有一个cookie。当人们谈论无状态的服务器端、有状态的客户端时,他们是什么意思呢?服务器端不需要使用session来追踪用户吗?只需在客户端使用cookie来检查用户?这意味着如果我更改服务器,用户将不会注意到并且仍然可以继续使用该服务。
如何配置spring-security以实现此目的?
在真正无状态的服务器端跟踪用户是很棘手的。大多数情况下,服务器端都是半无状态的,只有登录例外。但是,无状态服务器的好处是使得集群非常简单,可以进行水平扩展。
在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都是正确的。保持会话小,这样效果很好。将所有内容都放入会话中,您会遇到与单个服务器相同的扩展问题。而且实际上可能比使服务器有状态更糟糕,因为有时网格计算比单个服务器更糟糕。