JSON Web Token(JWT)

发布时间 2023-04-07 16:42:03作者: ikn0w1T

JSON Web Token(JWT)

什么是JWT

JSON Web Token(JWT)是一种用于身份验证和授权的开放标准(RFC 7519),它定义了一种紧凑、自包含的方式,用于在网络上传输信息。JWT 由三部分组成,分别是头部(Header)、载荷(Payload)和签名(Signature)。

  • 头部(Header):Header部分通常由两部分信息组成:令牌的类型(这里是JWT)和使用的加密算法(比如HMAC SHA256或RSA)。

  • 载荷(Payload):Payload部分包含了一些声明信息,比如用户的ID、角色、过期时间等等。Payload部分是可以自定义的,但建议不要在Payload中放置敏感信息。

  • 签名(Signature):Signature部分是对Header和Payload部分的签名,可以确保令牌没有被篡改。

下面是一个JWT令牌的示例:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJleHAiOjE1MTYyMzkwMjJ9.
4v1sxC4W4jEbP7lI4vA-ItQn8-kwxg1A-GACFVHd_9M

它是一个很长的字符串,中间用点(.)分隔成三个部分。注意,JWT 内部是没有换行的,这里只是为了便于展示,将它写成了几行。

JWT 的三个部分依次如下。

Header(头部)
Payload(负载)
Signature(签名)

写成一行,就是下面的样子。

Header.Payload.Signature

上述JWT令牌包含三部分:

Header部分是一个JSON对象,包含令牌的类型(JWT)和使用的加密算法(HMAC SHA256):

{
  "alg": "HS256",
  "typ": "JWT"
}

Payload部分也是一个JSON对象,包含了一些声明信息,比如用户的ID、角色、过期时间等等:

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022,
  "exp": 1516239022 + 3600
}

Signature部分是对Header和Payload部分的签名,确保令牌没有被篡改。

签名的公式如下:

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
)

其中,HMACSHA256表示使用HMAC SHA256加密算法,base64UrlEncode表示将字符串用Base64编码并且替换掉其中的"+"、"/"和"="为"-""_"和""。

secret是用于加密的密钥,该密钥只有服务端知道,用于验证JWT令牌的合法性。

算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。

JWT 通常用于在不同的应用程序之间传输身份验证信息,例如将用户登录信息传递给服务器。使用 JWT 的优点包括:无状态、跨平台、可靠性高、易于扩展、支持多种签名算法等。

JWT 的安全问题

JWT 是一种开放的标准,具有一定的安全风险。以下是一些常见的 JWT 安全问题:

1.JWT 的盗用

一旦 JWT 被窃取,攻击者就可以使用这个令牌来伪装成合法用户并访问受保护的资源。因此,在使用 JWT 时需要采取措施保护其机密性,例如使用 HTTPS 协议传输、使用适当的加密算法等。

2.JWT 的伪造

JWT 使用签名来验证其完整性和真实性,但如果签名算法被攻击者破解,则可以使用伪造的 JWT 访问受保护的资源。因此,在选择签名算法时需要谨慎,选择可靠的加密算法。

3.JWT 的过期

JWT 包含一个过期时间(exp),用于指定 JWT 的有效期限。如果过期时间设置过长或者过短,都会导致安全问题。过期时间设置过长,可能导致 JWT 被盗用后长时间有效,从而增加安全风险;过期时间设置过短,则可能导致用户频繁需要重新登录,影响用户体验。

4.JWT 的存储

如果 JWT 存储在客户端的 cookie 中,可能会受到跨站点脚本(XSS)攻击的威胁。攻击者可以通过注入恶意代码来窃取 JWT。因此,在存储 JWT 时,需要采用安全的存储方案,例如使用 HTTP-only cookie、localStorage、sessionStorage 等。

5.JWT 的大小

由于 JWT 包含的信息越多,其大小也会越大,从而影响JWT 的传输效率和性能。因此,在设计 JWT 时,需要权衡安全性和效率,并尽量减小 JWT 的大小。

如何保证JWT安全

为了保证 JWT 的安全性,我们可以采取以下措施:

使用适当的加密算法

在选择签名算法时,需要选择可靠的加密算法,例如 HMAC-SHA256、RSA-SHA256、ECDSA 等。同时,需要注意密钥的管理和保护,例如使用密钥轮换、密钥分离、密钥加密等。

设置适当的过期时间

在设置 JWT 的过期时间时,需要考虑安全和用户体验的平衡。一般来说,过期时间应该设置为比较短的时间,例如 15 分钟到 1 小时,但也要根据具体的应用场景和业务需求来设置过期时间。

使用 HTTPS 协议传输

使用 HTTPS 协议传输可以保证 JWT 的机密性和完整性,防止 JWT 被窃取或篡改。因此,在使用 JWT 时,应该尽可能使用 HTTPS 协议传输。

使用 HTTP-only cookie 存储可以防止 XSS 攻击窃取 JWT。HTTP-only cookie 只能通过 HTTP 协议传输,不能通过 JavaScript 访问。因此,在存储 JWT 时,应该尽可能使用 HTTP-only cookie。

实施访问控制

实施访问控制可以限制 JWT 的使用范围,防止 JWT 被滥用。例如,在 JWT 的载荷中添加用户的访问权限信息,服务器可以根据这些信息来判断用户是否有权访问受保护的资源。

总结

JSON Web Token(JWT)是一种用于身份验证和授权的开放标准,具有无状态、跨平台、可靠性高、易于扩展、支持多种签名算法等优点。然而,JWT 也存在一些安全问题,例如盗用、伪造、过期、存储和大小等问题。为了保证 JWT 的安全性,我们需要选择适当的加密算法、设置适当的过期时间、使用 HTTPS 协议传输、使用 HTTP-only cookie 存储和实施访问控制等措施。