【问题标题】:Should I put user info in JWT token or, just the user's ID and then select the info from the DB?我应该将用户信息放入 JWT 令牌中,还是只输入用户的 ID,然后从数据库中选择信息?
【发布时间】:2019-01-16 05:02:24
【问题描述】:

由于可以更改用户信息,而不是由用户更改 - 而是由某个管理员或其他人更改,因此令牌用户信息(有效负载)不会更新为数据库中包含的信息。

但我想尽可能少地执行数据库请求,所以我考虑将用户信息存储在他们的令牌中。

我认为这是错误的,我最好只存储他们的唯一 ID,即 MongoDB 中的索引和时间戳 - 这样用户就不会一遍又一遍地拥有相同的令牌 - 他必须从服务器完成登录。

但是我需要对 DB 进行查询,我想尽可能少。

我应该只用用户 ID 查询数据库吗?

【问题讨论】:

    标签: node.js mongodb performance jwt token


    【解决方案1】:

    如果您愿意与使用令牌的用户公开共享用户 ID,那么我会将其包含在 JWT 中。但是,您不应在令牌中包含用户可能在您的系统中滥用的任何信息。 - 例如可能暴露下划线实现细节的 ID。

    根据经验,如果您不向用户提供您存储在 JWT 中的数据,则不要将其作为 JWT 存储在 JWT 中,因为用户只能解码 Base64。

    另外,根据您在客户端存储 JWT 的方式,我会限制您存储的 sensitive data 的数量,因为客户端上运行的任何 JavaScript 都可以访问它。

    https://auth0.com/docs/security/store-tokens#web-storage-disadvantages

    网络存储可通过同一域上的 JavaScript 访问,因此您网站上运行的任何 JavaScript 都可以访问网络存储,因此容易受到跨站脚本 (XSS) 攻击。

    【讨论】:

    • 当你说“滥用你的系统”时,就像用户输入的注入一样?无论如何,我都会验证用户的输入。你是什​​么意思“不给用户数据”?最终我会返回用户的信息。
    • 从攻击者的角度想一想,我可以使用 xxx 数据做什么?您可能将它用于 id 枚举等......因此您公开了实现细节。我已经看到人们在 JWT 中存储了一些非常疯狂的东西,所以我要小心。还取决于您存储 JWT 的位置以及将其用作会话 cookie 或本地存储。然后你可能想开始加密数据。
    • 我不明白你。用户只会收到一些 bla bla,他没有解密令牌中内容的密钥..
    • 更新了答案以包含更多信息和链接 bla bla bla
    • @Raz >“他没有解密令牌中内容的密钥”:仅当您使用加密的 JWT aks JWE 时才如此,JWT 的通常形式是签名的 JWT aka JWS,即刚刚编码,所有人都可以阅读(见jwt.io
    【解决方案2】:

    我建议你只发送 userId,也许是令牌的创建和到期日期

    【讨论】:

      【解决方案3】:

      存储一个 ID 可能是一个更好的主意,因为用户数据可以按照您所说的那样进行修改。 JWT 中的大负载也会导致几乎每个网络请求都通过网络发送额外的字节。 在大多数情况下,您不需要完整的用户数据,并且 ID 在大多数情况下会很好。 所以我建议在 JWT 中存储 ID(也可以是其他字段)而不是所有用户的数据。

      【讨论】:

        猜你喜欢
        • 2018-12-29
        • 2016-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-24
        • 2016-08-07
        • 1970-01-01
        • 2023-03-15
        相关资源
        最近更新 更多