我认为实现这一点的唯一方法是从我的Web服务器中获取会话/身份验证状态.这就是我所说的“无国籍”的意思.当然,这个状态必须暂时保存在某个地方,所以必须有一些不是无状态的东西.
我可以使用数据库服务器来管理所有的auth会话.可以在每个http请求上从我所有的Web服务器访问数据库服务器,以请求用户的身份验证状态.但是由于数据库服务器比Web服务器更难扩展(这将是我的假设,而没有任何经验),我只是将问题从Web服务器移动到数据库服务器.除此之外,我不认为这是表现的最佳解决方案.
而不是数据库服务器,我可以使用像memcached或redis这样的缓存服务器来管理会话以进行身份验证.我认为这会最大限度地降低可伸缩性问题,因为单个缓存服务器可以以一种高效的方式管理大量的会话(或者这个时候我错了吗?).但是我有时会读这样的东西,就像“关于缓存的一个重要的一点是,它的行为就像一个缓存应该是:你刚刚存储的数据可能会失踪.那么这将是一个问题.我不希望用户每2个小时登录一次.我的问题是:如果缓存有足够的内存,为什么缓存中的数据会丢失?缓存服务器中的250MB内存不足以同时管理超过一百万个会话,而不必摆脱数据(使用简单的键值对将会话ID映射到用户ID或其他方式时)?
第三种解决方案可能是将auth sesson状态存储在由服务器签名并且不能被客户端操纵的cookie中.但是如果我没有错,服务器端无法强制执行某个用户的注销…
总结我的要求:
>我想在负载均衡器的上下方向扩展Web服务器
验证系统应该处理它
>用户应该被允许登录至少几天
像例如在stackoverflow.com上
>如果有的话,服务器端应该能够关闭用户
理由这样做
我对最佳做法感兴趣我认为有一大堆网站
面对同样的问题并找到解决办法.
解决方法
服务器在登录后发回auth_token(通过https). auth_token保存为一个cookie(只是这样它将被持久化,可以从客户端访问).当auth_token发出请求时,它被放置为保存在cookies中的HTTP头(通过JavaScript).然后,它被服务器请求处理程序拉出,并根据每个请求进行验证.所以它的一个cookie – 但不用作一个cookie.一个“两次烤”的cookie如果你会:)链接详细解释更多.
而另一个答案here on stack overflow我发现解释了一个非常相似的事情. “没有会话的会话”.
然后如果你真的想挖掘它,请查看owasp.org关于CSRF预防,这解释了类似的技术在标题“General Recommendation: Synchronizer Token Pattern”
所有通信应为HTTPS.