创建 "session" - Jwt + db - 良好实践

Create "session" - Jwt + db - Good practices

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

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

首先,这样的设计你觉得合适吗?

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

很抱歉,如果所有这些对你们大多数人来说都是显而易见的,但我无法在网上找到合适的答案。

新年快乐!

在检查您的设计后,我怀疑您对会话(服务器端会话)和 JWT 之间的区别感到困惑。 对于理解最重要的区别非常有用。

不过,我给大家做个小总结:

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

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

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

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

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

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

Second, i'm wondering what's the best way to deal with a user that open more than one session from the same agent. Should i close last session and create a new one or like on the diagram, get the last open session from the db and create new tokens from that ?

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