会话 – 可扩展Web应用程序的无状态登录/身份验证机制?

我正在尝试了解在为任意数量的Web服务器上运行的应用程序创建身份验证机制时所需的选项.到目前为止,我只有使用(web-)服务器端会话管理认证方面的小型网站的经验.但是,一旦我想在PaaS环境中添加更多的Web服务器(或“Web实例”),这种方法显然会成为一个问题;绑定到特定机器的身份验证状态来自于我的理解,而不是使用负载平衡(afaik粘性会话/粘性负载平衡是应该避免的).我正在寻找一个解决方案,让我可以动态地扩展Web服务器/实例的数量,而无需考虑身份验证机制.

我认为实现这一点的唯一方法是从我的Web服务器中获取会话/身份验证状态.这就是我所说的“无国籍”的意思.当然,这个状态必须暂时保存在某个地方,所以必须有一些不是无状态的东西.

我可以使用数据库服务器来管理所有的auth会话.可以在每个http请求上从我所有的Web服务器访问数据库服务器,以请求用户的身份验证状态.但是由于数据库服务器比Web服务器更难扩展(这将是我的假设,而没有任何经验),我只是将问题从Web服务器移动到数据库服务器.除此之外,我不认为这是表现的最佳解决方案.

而不是数据库服务器,我可以使用像memcached或redis这样的缓存服务器来管理会话以进行身份​​验证.我认为这会最大限度地降低可伸缩性问题,因为单个缓存服务器可以以一种高效的方式管理大量的会话(或者这个时候我错了吗?).但是我有时会读这样的东西,就像“关于缓存的一个重要的一点是,它的行为就像一个缓存应该是:你刚刚存储的数据可能会失踪.那么这将是一个问题.我不希望用户每2个小时登录一次.我的问题是:如果缓存有足够的内存,为什么缓存中的数据会丢失?缓存服务器中的250MB内存不足以同时管理超过一百万个会话,而不必摆脱数据(使用简单的键值对将会话ID映射到用户ID或其他方式时)?

第三种解决方案可能是将auth sesson状态存储在由服务器签名并且不能被客户端操纵的cookie中.但是如果我没有错,服务器端无法强制执行某个用户的注销…

总结我的要求:

>我想在负载均衡器的上下方向扩展Web服务器
验证系统应该处理它
>用户应该被允许登录至少几天
像例如在stackoverflow.com上
>如果有的话,服务器端应该能够关闭用户
理由这样做

我对最佳做法感兴趣我认为有一大堆网站
面对同样的问题并找到解决办法.

解决方法

This github project一个很好的开始的地方.执行在玩!框架,但它是我认为你以后的一个很好的解释.也有助于克服应用程序中固有的CSRF.

服务器在登录后发回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.

相关文章

vue阻止冒泡事件 阻止点击事件的执行 <div @click=&a...
尝试过使用网友说的API接口获取 找到的都是失效了 暂时就使用...
后台我拿的数据是这样的格式: [ {id:1 , parentId: 0, name:...
JAVA下载文件防重复点击,防止多次下载请求,Cookie方式快速简...
Mip是什么意思以及作用有哪些