JSON Web Token(JWT)
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 存储
使用 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 存储和实施访问控制等措施。
本文来自博客园,作者:ikn0w1T,转载请注明原文链接:https://www.cnblogs.com/ikn0w1T/p/17296676.html