JSON Web Token (JWT) 概述
JSON Web Token (JWT) 是一种开放标准(RFC 7519),用于在网络应用环境间安全地将信息作为JSON对象传输。它通常被用来在客户端和服务器之间传递声明,例如用户的身份验证信息,使得服务端可以在不需要存储会话状态的情况下识别用户。
JWT 的结构
JWT由三部分组成,每部分通过点(.
)分隔:
- Header(头部)
- Payload(载荷)
- Signature(签名)
格式如下:
xxxxx.yyyyy.zzzzz
- Header:描述了令牌的基本元数据,比如令牌的类型(即JWT)以及所使用的签名算法。
- Payload:包含声明(claims)。声明是关于实体(通常是用户)和其他数据的声明。
- Signature:确保JWT未被篡改。它是使用Header中指定的算法对Header和Payload进行签名的结果。
各部分详解
Header
Header通常由两部分组成:令牌的类型(即JWT
)和使用的签名算法(如HMAC SHA256或RSA)。
json
{
"alg": "HS256",
"typ": "JWT"
}
这个JSON会被Base64Url编码以形成JWT的第一部分。
Payload
Payload包含了声明(claims)。Claims是一些关于实体(通常是用户)和其他数据的声明。Claim有三种类型:注册声明、公共声明和私有声明。
- 注册声明 :预定义的,不是强制的,但推荐使用。如:
iss
(发行人)、exp
(过期时间)、sub
(主题)、aud
(受众)等。 - 公共声明:可以随意定义,但为了避免冲突应该在IANA JSON Web Token Registry中定义或者使用一个URI来定义它们。
- 私有声明:自定义声明,用于在同意使用它们的各方之间共享信息,并且既不是注册声明也不是公共声明。
示例Payload:
json
{
"sub": "1234567890",
"name": "John Doe",
"admin": true,
"iat": 1516239022
}
同样,这个JSON也会被Base64Url编码成为JWT的第二部分。
Signature
为了生成签名部分,你需要:
- 使用Header中指定的算法(如HMAC SHA256)。
- 将Base64Url编码后的Header、Payload与密钥(secret)组合起来进行签名。
例如,使用HMAC SHA256算法,签名计算如下:
text
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
使用场景
- 身份验证:这是最常见的场景之一。用户登录后,每个后续请求都将包括JWT,允许用户访问该令牌允许的服务和资源。
- 信息交换:由于JWT可以签名(例如使用公钥/私钥对),你可以确保发送者是谁,并能验证其是否被篡改。
优点
- 无状态:因为所有的必要信息都在token里,所以服务器不需要保存会话信息。
- 跨域支持:非常适合于分布式系统,尤其是微服务架构。
- 性能高效:减少了数据库查询次数,提高了响应速度。
缺点
- 安全性考虑:如果密钥泄露,攻击者可以伪造任何JWT。因此,保护好你的密钥非常重要。
- 一旦颁发,除非过期或者手动撤销,否则无法强制使token失效。这可能需要额外的机制来处理token的撤销问题。
通过理解JWT的工作原理及其优缺点,开发者可以根据具体需求选择最适合的身份验证解决方案。JWT因其灵活性和易用性,在现代Web应用程序开发中得到了广泛的应用。