【问题标题】:Create "session" - Jwt + db - Good practices创建“会话” - Jwt + db - 良好实践
【发布时间】:2022-01-02 11:26:45
【问题描述】:

我正在从头开始设计一个 api,我有一些关于用户注册/登录的新手问题。

你可以找到我的会话创建请求图->here

首先,这样的设计你觉得可以吗?

其次,我想知道处理从同一代理打开多个会话的用户的最佳方法是什么。我应该关闭最后一个会话并在图表上创建一个新会话或类似的,从数据库中获取最后一个打开的会话并从中创建新令牌吗?

对不起,如果所有这些对你们大多数人来说都是显而易见的,但我无法在网上找到正确的答案。

祝新年快乐!

【问题讨论】:

    标签: api rest session jwt


    【解决方案1】:

    在查看您的设计后,我怀疑您对会话(服务器端会话)和 JWT 之间的区别存在混淆。 This answer 对于理解最重要的区别非常有用。

    不过,我给你一个小总结:

    服务器端会话用于实现有状态身份验证协议,因为会话的状态存储在服务器上。另一方面,JWT 用于实现 stateless 身份验证协议,因为“会话”的状态(注意引号)不是存储在服务器上,而是存储在客户端(例如,浏览器)。两种方法都有其优点和缺点(例如上面提到的答案中提到的那些)。

    也就是说,使用 JWT,您无法运行设计的这些流程(除非您将 JWT 存储在服务器上):

    现在,如果您正在考虑将 JWT 存储在服务器上,让我告诉您,您可能会丢失一些 advantages of the stateless approach

    我制作了这张图来说明使用 JWT 的最简单方法(您可以添加 刷新令牌 机制,但这是另一回事):

    请注意,在第 2 步中获得的同一个 JWT 被发送到 2 个不同的应用服务器,它们不需要存储“会话”的状态来验证 JWT,因为 JWT 包含所有必要的信息。唯一的条件是 3 个服务器具有相同的密钥。就是这样。

    如果您想使用服务器端会话来实现上述功能,则必须同步应用程序服务器,以便它们始终具有相同的会话状态,这可能是一项复杂的任务。这展示了 JWT 最强大的优势之一:高可扩展性。

    其次,我想知道与这样的用户打交道的最佳方式是什么 从同一个代理打开多个会话。我应该最后关闭吗 会话并在图表上创建一个新的或类似的,获取最后一个打开 来自数据库的会话并从中创建新令牌?

    基本上,在使用 JWT 时,您不必担心您提到的这些事情。用户应该能够请求任意数量的 JWT,只要 JWT 的过期时间短,这不是问题。而已。但是,有时需要使 JWT 无效,例如 changing passwords

    【讨论】:

    • 非常感谢您的解释。事实上,我曾经对我试图设计的两种逻辑感到困惑。 1 - 处理用户身份验证。 2 - 跟踪用户身份验证。这两个机制被同时调用,但它们之间没有真正的联系。我现在对 JWT 以及它的设计目的有了更好的了解,感谢您!
    • 请记住,JWT 从来都不是会话存储机制,在我看来,它不应该用于存储会话。事实上,这不仅仅是我的意见——cryto.net/~joepie91/blog/2016/06/13/stop-using-jwt-for-sessions 应用服务器 1 和 2 无论如何都应该通过网关访问,而这个网关是处理会话的理想场所。处理分布式会话存储并不像您描述的那么难。
    • @CorentinTRUFFAUT 我很高兴这些信息很有用。如果您愿意,可以将答案标记为已接受或投赞成票。
    • @MichalTrojanowski 你能告诉我我在哪里说过 JWT 被用作会话存储机制吗?我怀疑这种混淆是在“他们不需要存储“会话”的状态来验证 JWT 的,因为 JWT 包含所有必要的信息”这句话中引入的,但如果你注意到了,我把“会话”这个词在引号中,我只是出于教学原因(类比)在那里使用这个词。另一方面,在处理分布式会话存储方面,复杂性在很大程度上取决于应用程序的架构(以及您是否可以控制它)。
    • 我的意思是 JWT 不应该用于用户会话的概念。 (是否将其放在引号中并不重要;))。 JWT 的有效期是有效的,这与用户是否在操作您的应用程序(即她是否有活动会话)无关。如果您确实为此目的使用 JWT,您很快就会遇到一个非常常见的问题 - 如何注销用户?
    猜你喜欢
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 2011-01-24
    • 1970-01-01
    • 2019-01-18
    • 2011-03-09
    • 2015-06-09
    相关资源
    最近更新 更多