我应该将用户信息放入 JWT 令牌中,还是只放入用户 ID,然后从数据库中选择信息?

Raz*_*Raz 8 performance token mongodb node.js jwt

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

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

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

但随后我需要对数据库进行查询,并且我想尽可能少地查询。

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

Sum*_*ddy 6

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


Kev*_*ith 5

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

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

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

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

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