JSON 网络令牌 |智威汤逊
JSON Web 令牌 (JWT) 是JSON 对象,用于通过 Web 安全地传输信息(在两方之间)。既可用于认证系统,也可用于信息交换。令牌主要由header、payload、signature组成。这三个部分由点 (.) 分隔。 JWT 定义了我们从一方发送到另一方的信息结构,它有两种形式——序列化、反序列化。序列化方法主要用于通过网络传输每个请求和响应的数据。而反序列化方法用于读取和写入数据到 Web 令牌。
反序列化
反序列化形式的 JWT 仅包含标头和有效负载。它们都是纯 JSON 对象。
标题
JWT 中的标头主要用于描述应用于 JWT 的加密操作,例如在其上使用的签名/解密技术。它还可以包含有关我们发送的信息的媒体/内容类型的数据。此信息以 JSON 对象的形式存在,然后此 JSON 对象被编码为 BASE64URL。标头中的加密操作定义了 JWT 是签名/未签名还是加密,然后是使用什么算法技术。 JWT 的简单标头如下所示:
{
"typ":"JWT",
"alg":"HS256"
}
“alg”和“typ”是对象密钥,具有不同的值和不同的功能,例如“typ”为我们提供了此信息包的标头类型,而“alg”则告诉我们使用的加密算法。
注意: HS256 和 RS256 是我们在 JWT 的标头部分中使用的两种主要算法。
一些 JWT 也可以在没有签名或加密的情况下创建。这样的令牌被称为不安全的,其标头应具有分配给的 alg 对象键的值“无”。
{
"alg":"none"
}
有效载荷
有效负载是 JWT 中实际添加所有用户数据的部分。此数据也称为 JWT 的“声明”。此信息可供任何人阅读,因此始终建议不要在此处放置任何机密信息。这部分一般包含用户信息。此信息以 JSON 对象的形式出现,然后此 JSON 对象被编码为 BASE64URL。我们可以在有效负载中添加任意数量的声明,但与标头不同的是,有效负载中没有强制声明。带有有效负载的 JWT 将如下所示:
{
"userId":"b07f85be-45da",
"iss": "https://provider.domain.com/",
"sub": "auth/some-hash-here",
"exp": 153452683
}
上面的 JWT 包含userId、iss、sub 和 exp 。所有这些都扮演着不同的角色,因为 userId 是我们存储的用户的 ID,'iss' 告诉我们发行者,'sub' 代表主题,'exp' 代表到期日期。
序列化
序列化形式的 JWT 表示如下格式的字符串:
[header].[payload].[signature]
所有这三个组件组成了序列化的 JWT。我们已经知道什么是 header 和 payload 以及它们的用途。让我们来谈谈签名。
签名
这是 JWT 的第三部分,用于验证 token 的真实性。 BASE64URL 编码的标头和有效负载通过 dot(.) 连接在一起,然后使用带有密钥的标头中定义的散列算法对其进行散列。然后使用 dot(.) 将此签名附加到标头和有效负载,形成我们的实际令牌header.payload.signature
句法 :
HASHINGALGO( base64UrlEncode(header) + “.” + base64UrlEncode(payload),secret)
因此,以上所有这些组件共同构成了 JWT。现在让我们看看我们的实际令牌是什么样子的:
智威汤逊示例:
header:
{
"alg" : "HS256",
"typ" : "JWT"
}
Payload:
{
"id" : 123456789,
"name" : "Joseph"
}
Secret: GeeksForGeeks
JSON 网络令牌
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MTIzNDU2Nzg5LCJuYW1lIjoiSm9zZXBoIn0.OpOSSw7e485LOP5PrzScxHb7SR6sAOMRckfFwi4rp7o