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

时间:2020-03-16 15:28:55

标签: jwt

每个描述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 个答案:

答案 0 :(得分:0)

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

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

但是您缺少的一件事是,后端通常需要识别发送请求的用户,例如授予对仅允许用户访问的资源或用于日志记录目的的访问等。在后端,有时还需要用户角色。出于授权目的,您在后端使用的所有信息都应该是令牌本身的一部分,因为签名可以确保不对这些信息进行操作。

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

例如:

{
  "exp": "1516239022",
  "id": 1
}

其他信息(例如用户名)通常仅在朋友处使用,而对于后端却毫无意义。