📜  JSON 网络令牌 |智威汤逊

📅  最后修改于: 2022-05-13 01:56:21.311000             🧑  作者: Mango

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

句法 :

因此,以上所有这些组件共同构成了 JWT。现在让我们看看我们的实际令牌是什么样子的:

智威汤逊示例:

header:

{
  "alg" : "HS256",

  "typ" : "JWT"
}

Payload:

{
  "id" : 123456789,

  "name" : "Joseph"
}

Secret: GeeksForGeeks

JSON 网络令牌