【问题标题】:Session vs JWT Token in nodejs with large payload具有大有效负载的nodejs中的会话与JWT令牌
【发布时间】:2019-08-02 18:54:18
【问题描述】:

我正在从事一个 nodejs 项目,并且具有 PHP 背景。前端和后端分别开发以及与 API 调用进行通信给我留下了深刻的印象。

# 问题: 我需要对用户进行身份验证并存储用户的一些数据(服务器中始终需要这些数据),这些用户数据会导致 jwt 有效负载大小和 jwt 令牌增加变大。

所以我使用了 JWT 令牌机制,在成功登录后生成一个令牌并将其发送给客户端,然后客户端将该令牌作为每个 API 调用的标头添加 - 然后在服务器中验证令牌并获取解码的有效负载数据。

这就是过程。但是我有一些在 nodejs 中总是需要的用户数据,所以 JWT 有效负载大小增加,JWT 令牌大小也很大。所以客户端每次总是发送大尺寸的令牌。

我在 php 中使用会话来维护用户数据。 如果我使用会话进行身份验证,它将是有状态的,对吗?

# 疑问:

  1. 有没有办法在服务器中维护已登录的用户数据?
  2. 如果我使用大负载,如何减少 JWT 令牌的长度?

更新:

另外,如果我使用会话,它会使用数据库来存储会话,所以需要一个数据库调用。

如果我使用小型有效负载令牌(例如:userid)进行身份验证,并在身份验证后使用 userid 进行数据库调用以获取详细信息,该怎么办?

在这两种方法中都需要数据库调用吗?哪种方法看起来更好?

【问题讨论】:

    标签: session jwt auth0


    【解决方案1】:

    使用会话会引入服务器状态,但可以让您将用户数据和会话数据保存在服务器上。只有会话 id 必须与客户端共享。

    您不能减少 JWT 令牌的长度。更大的有效负载意味着更大的令牌。从理论上讲,您可以使用某种压缩,但这将是非常高的技术开销,可能不值得。

    在服务器上保存会话将解决您的问题。

    它还使服务器可以完全控制会话。当用户注销时,服务器可以删除会话。当客户端删除他的 JWT 令牌时,您不能绝对确定用户已注销。令牌本身仍然有效。

    使用 JWT 作为会话容器通常是个坏主意。这只是引入了几个安全问题,您必须自己处理。您必须确保第 3 方 JavaScript 不会读取令牌,仅举一个问题。有很多博客文章详细解释了这些问题(搜索“停止使用 JWT 进行会话”),但我只能建议不要将 JWT 用于会话。会话不是一件坏事!

    【讨论】:

    • 感谢您的回答。说真的,我不会在会话中使用 JWT。如果我只使用会话来解决这个问题,它不会是无状态的,对吧?而且它也不适用于像 aws lambda 这样的无服务器环境,对吧?
    • 会话引入状态,这是正确的。无服务器并不意味着无状态。您可以运行无服务器 Web 服务并拥有状态(例如在内存或数据库中)。
    • 如果您不介意,还有一个疑问。所以我可以完全依赖会话来验证所有 API 调用?这种方法也比 jwt 有什么缺点吗?
    • Express 提供了一个会话管理模块。您当然可以使用该库或任何其他库。无服务器不会以任何方式阻碍会话。
    • 另外,如果我使用会话,它会利用数据库来存储会话所以需要一个数据库调用。如果我使用小型有效负载令牌(例如:userid)进行身份验证,并在身份验证后使用 userid 进行数据库调用以获取详细信息,该怎么办?在这两种方法中都需要数据库调用吗?哪种方法看起来更好?
    猜你喜欢
    • 2019-10-29
    • 2018-09-15
    • 2016-01-19
    • 2018-12-19
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    相关资源
    最近更新 更多