每个描述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即可在身份验证后根据每个进一步的请求发送它,并直接访问用户数据。
我想念什么?
答案 0 :(得分:0)
没有人强迫您将整个用户信息放入令牌中,通常建议将令牌的有效载荷限制为最小。
根据RFC719 section 4.1,所有声明都标记为“可选”。
但是您缺少的一件事是,后端通常需要识别发送请求的用户,例如授予对仅允许用户访问的资源或用于日志记录目的的访问等。在后端,有时还需要用户角色。出于授权目的,您在后端使用的所有信息都应该是令牌本身的一部分,因为签名可以确保不对这些信息进行操作。
因此,在大多数应用程序中,将有效负载仅限制为用户ID和通常还有到期时间戳就足够了。
例如:
{
"exp": "1516239022",
"id": 1
}
其他信息(例如用户名)通常仅在朋友处使用,而对于后端却毫无意义。