Rest 轻量级有状态服务器会话与无状态令牌(需要服务器吊销列表)

Rest 轻量级有状态服务器会话与无状态令牌(需要服务器吊销列表),rest,session,asp.net-web-api,token,stateless,Rest,Session,Asp.net Web Api,Token,Stateless,当我使用服务器有状态会话时,我总是将其用于轻量级目的,例如仅存储用户ID、名称、时区和用户的最后一页点击。对于10000个用户来说,最终可能会达到~3MB。它没有太多内存,很容易与其他服务器保持同步,并且很容易注销/取消会话ID 似乎如果我使用了一个无状态令牌,比如JWT,我需要检查每个服务器请求的令牌,看看它是否在撤销列表中。该撤销列表必须至少有两个字段,即令牌id和令牌最初的有效期(以便最终删除条目,否则撤销列表将一直增长)。另外,出于安全原因,我确信用户需要知道所有登录的会话,因此我仍然需

当我使用服务器有状态会话时,我总是将其用于轻量级目的,例如仅存储用户ID、名称、时区和用户的最后一页点击。对于10000个用户来说,最终可能会达到~3MB。它没有太多内存,很容易与其他服务器保持同步,并且很容易注销/取消会话ID

似乎如果我使用了一个无状态令牌,比如JWT,我需要检查每个服务器请求的令牌,看看它是否在撤销列表中。该撤销列表必须至少有两个字段,即令牌id和令牌最初的有效期(以便最终删除条目,否则撤销列表将一直增长)。另外,出于安全原因,我确信用户需要知道所有登录的会话,因此我仍然需要保留每个活动令牌的详细信息,包括它的用户ID和令牌的最后一次点击页面


那么,使用无状态令牌(需要服务器撤销列表)与轻量级有状态服务器会话相比,有什么好处呢?

真正的无状态服务器有几个好处:

  • 缩放。必须复制状态,无论它有多小,都会限制节点的数量

  • 负载平衡。如果不复制该状态,则必须使用粘性会话(同一用户始终连接到同一实例),这将最终导致负载不均匀

  • 滚动更新。在逐个更新服务器时(例如,如果您执行连续交付),会话复制和粘性会话都会使事情变得更加复杂,可能会阻止滚动更新

  • 不管怎样,我想如果你能为更新安排停机时间,用户数量有限,有状态会话将不会是一个问题,而且可能更容易实现


    这些好处适用于加密令牌,如JWT,其中不需要服务器会话。撤销列表使事情复杂化,但由于它不需要存储在任何特定的服务器上,因此不会产生干扰。

    真正的无状态服务器有几个好处:

  • 缩放。必须复制状态,无论它有多小,都会限制节点的数量

  • 负载平衡。如果不复制该状态,则必须使用粘性会话(同一用户始终连接到同一实例),这将最终导致负载不均匀

  • 滚动更新。在逐个更新服务器时(例如,如果您执行连续交付),会话复制和粘性会话都会使事情变得更加复杂,可能会阻止滚动更新

  • 不管怎样,我想如果你能为更新安排停机时间,用户数量有限,有状态会话将不会是一个问题,而且可能更容易实现


    这些好处适用于加密令牌,如JWT,其中不需要服务器会话。撤销列表使事情复杂化,但由于它不需要存储在任何特定服务器上,因此不会产生干扰。

    是的,但我想问的是一个需要服务器撤销列表的无状态令牌。与轻量级有状态服务器会话相比,这有什么好处?我已经了解了真正无状态服务器的好处,这似乎是一个转移视线的问题——撤销列表不是几乎总是必需的吗?如果是这样的话,那就不是真正的无国籍了,对吧?很公平。我的意思是,我列出的这些优势实际上适用于(加密)基于令牌的解决方案。服务器本身不需要状态的任何解决方案都具有我列出的功能。撤销列表可以很容易地共享,例如通过数据库共享,因此它不需要存储在生成令牌的服务器上。是的,但我想问的是需要服务器撤销列表的无状态令牌。与轻量级有状态服务器会话相比,这有什么好处?我已经了解了真正无状态服务器的好处,这似乎是一个转移视线的问题——撤销列表不是几乎总是必需的吗?如果是这样的话,那就不是真正的无国籍了,对吧?很公平。我的意思是,我列出的这些优势实际上适用于(加密)基于令牌的解决方案。服务器本身不需要状态的任何解决方案都具有我列出的功能。撤销列表可以很容易地共享,例如通过数据库共享,因此它不需要存储在生成令牌的服务器上。