真的有必要在 JWT 中内置有效负载吗?

Posted

技术标签:

【中文标题】真的有必要在 JWT 中内置有效负载吗?【英文标题】:Is really necessary to have a payload built into JWT? 【发布时间】:2020-06-27 17:32:25 【问题描述】:

每个描述 JWT 用法的示例代码都在谈论一个有效负载,通常是用户信息,例如名称和角色。

我想知道当没有额外的安全性并且只会让前端加载一个专门用于解码 JWT 的库时,在 JWT 中编码该信息有什么意义。

我要问的是,是否有理由进行这种编码,而不是在答案中与 JWT 一起发送用户数据(或您需要传递的任何有效负载)。

目前我正在发送:(这是 ExpressJs 代码)

const jwt = jwtUtils.buildToken(user);
res.json( jwt );

其中jwt 包含带有用户信息的有效负载。

但如果我改为这样做:

const user = userModel.get(userId);
const jwt = jwtUtils.buildToken();
res.json( jwt, user );

这样我不需要解码 JWT 来访问我的用户数据,我只需保存 JWT 以便能够在身份验证后的每个进一步请求中发送它并直接访问用户数据。

我错过了什么?

【问题讨论】:

【参考方案1】:

没有人强迫您将整个用户信息放入您的令牌中,通常建议将令牌的有效负载限制在最低限度。

根据RFC719 section 4.1,所有声明都标记为可选。

但是您缺少的一件事是后端通常需要识别发送传入请求的用户,例如仅授予对允许用户访问的资源或用于记录目的等的访问权限。有时在后端也需要用户角色。您在后端用于授权目的的每条信息都应该是令牌本身的一部分,因为签名确保这些信息不会被操纵。

因此,在大多数应用程序中,将有效负载限制为仅一个用户 ID 以及通常还包括到期时间戳就足够了。

例如:


  "exp": "1516239022",
  "id": 1

其他信息,例如用户名,通常只在前端使用,对于后端来说通常没有意义。

【讨论】:

太棒了!所以我在非编码字段上发送前端所需数据的想法是可以的。我可以将 JWT 保存在前端以供进一步请求,但我不需要在前端对其进行解码,因为所有显示信息都可以一起发送 @FLC 只要它与安全性无关,应该没问题,您不需要在前端解码令牌。

以上是关于真的有必要在 JWT 中内置有效负载吗?的主要内容,如果未能解决你的问题,请参考以下文章

没有任何 JS 访问令牌的 JWT 有效负载加密

在验证之前使用 JWT 有效负载

Flask JWT 令牌/有效负载 - 返回用户 Json

IRQBalance真的有效么?

加密 JWT 有效负载

如果您可以解码 JWT,它们的安全性如何?