JWT 到底是什么?

2025-05-26

JWT 到底是什么?

在本文中,我们将学习 JWT 令牌的基础知识以及如何利用它来验证双方之间的通信,所有这些都使用原始的 NodeJS 和 javascript。

JWT 是 JSON Web Token 的缩写,它是一种紧凑的 URL 安全方式,用于在双方之间传输声明。JWT 中的声明被编码为 JSON 对象,并使用 JSON Web 签名 (JWS) 进行数字签名。~ IETF

呃!什么?

简单来说,JWT token 是我们在进行网络请求时在 header 或者 url 中传递的字符串,用于安全传递数据,确保数据没有被篡改。

例如:www.example.com/private/? token=xxxxx.yyyyy.zzzzz

你可能想知道令牌格式是什么!JWT 令牌由三部分组成,三部分用点分隔

( . )


header.payload.signature
Enter fullscreen mode Exit fullscreen mode

让我们详细了解 JWT 令牌的不同部分。

1. 标头
标头通常由两部分组成:令牌的类型(即 JWT)和正在使用的哈希算法,例如 HMAC SHA256 或 RSA。

{
   "alg": "HS256",
   "typ": "JWT"
}
Enter fullscreen mode Exit fullscreen mode

然后,将此 JSON 经过 Base64Url 编码,形成 JWT 的第一部分。

'use strict';

var header = { "alg": "HS256", "typ": "JWT" };
var enc_header = Buffer.from(JSON.stringify(header)).toString('base64');
// ► "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
Enter fullscreen mode Exit fullscreen mode

2. 有效载荷

令牌的第二部分是有效负载,其中包含声明。声明是预定义的键及其值。声明分为三种类型:注册声明、公共声明和私有声明。

  • 注册声明:这些是一组预定义的密钥,非强制但建议使用。其中包括iss(颁发者)、exp(到期时间)等。

  • 公开声明: JWT 用户可随意定义。但为了避免冲突,应在 IANA JSON Web Token 注册表中定义,或将其定义为包含抗冲突命名空间的 URI。

  • 私人声明:这些是自定义键值对,用于在同意使用它们的各方之间共享信息,既不是注册声明也不是公开声明。

{
   "exp": "2019-02-14",
   "message": "roses are red"
}
Enter fullscreen mode Exit fullscreen mode

然后对有效负载进行 Base64Url 编码以形成 JSON Web Token 的第二部分。

'use strict';

var payload = { "exp": "2019-02-14", "message": "roses are red" };
var enc_payload = Buffer.from(JSON.stringify(payload)).toString('base64');
// ► eyJleHAiOiIyMDE5LTAyLTE0IiwibmFtZSI6IkpvaG4gRG9lIn0
Enter fullscreen mode Exit fullscreen mode

3.签名

要创建签名部分,您需要获取已编码的标头、已编码的有效负载、密钥以及标头中指定的算法,然后对其进行签名。NodeJS 自带了功能强大的Crypto 库,开箱即用,我们将在示例中使用它,这对我们来说真是太好了。

'use strict';
const crypto = require('crypto');
var jwt_secret = "secret";
// enc_header and enc_payload are computed earlier
var signature = crypto.createHmac('sha256', jwt_secret).update(enc_header +"."+ enc_payload).digest('base64');
// ► 6C46KAaZGp6RjbSqGllfdQF7g8vXCp02NTSrz-PzeoI
Enter fullscreen mode Exit fullscreen mode

签名用于验证 JWT 的发送者是否是其声称的那个人,并确保消息在传输过程中未被更改。

最终的 JWT 令牌如下所示

var token = `${enc_header}.${enc_payload}.${signature}`;
// ► eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOiIyMDE5LTAyLTE0IiwibWVzc2FnZSI6InJvc2VzIGFyZSByZWQifQ.0u-mkgLo5479CPjJJ4mXCwn2RW4dFT12fiYiopRWsZw
Enter fullscreen mode Exit fullscreen mode

这里需要记住的重要一点是,JWT 令牌用于身份验证而不是加密,因此即使不知道密钥,某人也可以读取您的标头和有效负载数据。

但是在收到令牌后,您可以使用您的密钥再次对标头和有效负载进行签名,并将其与收到的签名进行比较,以检测令牌或消息的篡改。

一个好的开始是访问jwt.io 上的在线 JWT 调试器,并使用我们刚刚生成的令牌进行操作。

嗨!我是@Siwalik!如果你喜欢这篇文章,请在推特上关注我,了解我最新的科技探索和业余项目!🙌

文章来源:https://dev.to/siwalikm/what-the-heck-is-jwt-anyway--47hg
PREV
Webpack 基础介绍 简介 Webpack 是什么?Webpack 有什么用?安装 Webpack 配置文件 运行 Webpack Webpack DevServer 总结
NEXT
利用 JavaScript 的超能力掌握全栈