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
让我们详细了解 JWT 令牌的不同部分。
1. 标头
标头通常由两部分组成:令牌的类型(即 JWT)和正在使用的哈希算法,例如 HMAC SHA256 或 RSA。
{
"alg": "HS256",
"typ": "JWT"
}
然后,将此 JSON 经过 Base64Url 编码,形成 JWT 的第一部分。
'use strict';
var header = { "alg": "HS256", "typ": "JWT" };
var enc_header = Buffer.from(JSON.stringify(header)).toString('base64');
// ► "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
2. 有效载荷
令牌的第二部分是有效负载,其中包含声明。声明是预定义的键及其值。声明分为三种类型:注册声明、公共声明和私有声明。
-
注册声明:这些是一组预定义的密钥,非强制但建议使用。其中包括iss(颁发者)、exp(到期时间)等。
-
公开声明: JWT 用户可随意定义。但为了避免冲突,应在 IANA JSON Web Token 注册表中定义,或将其定义为包含抗冲突命名空间的 URI。
-
私人声明:这些是自定义键值对,用于在同意使用它们的各方之间共享信息,既不是注册声明也不是公开声明。
{
"exp": "2019-02-14",
"message": "roses are red"
}
然后对有效负载进行 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
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
签名用于验证 JWT 的发送者是否是其声称的那个人,并确保消息在传输过程中未被更改。
最终的 JWT 令牌如下所示
var token = `${enc_header}.${enc_payload}.${signature}`;
// ► eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOiIyMDE5LTAyLTE0IiwibWVzc2FnZSI6InJvc2VzIGFyZSByZWQifQ.0u-mkgLo5479CPjJJ4mXCwn2RW4dFT12fiYiopRWsZw
这里需要记住的重要一点是,JWT 令牌用于身份验证而不是加密,因此即使不知道密钥,某人也可以读取您的标头和有效负载数据。
但是在收到令牌后,您可以使用您的密钥再次对标头和有效负载进行签名,并将其与收到的签名进行比较,以检测令牌或消息的篡改。
一个好的开始是访问jwt.io 上的在线 JWT 调试器,并使用我们刚刚生成的令牌进行操作。
嗨!我是@Siwalik!如果你喜欢这篇文章,请在推特上关注我,了解我最新的科技探索和业余项目!🙌
文章来源:https://dev.to/siwalikm/what-the-heck-is-jwt-anyway--47hg