JWT(JSON Web Token)是一种用于在网络应用之间传递信息的开放标准(RFC 7519)。它以一种紧凑且自包含的方式传递信息,通常用于在用户和服务之间进行身份验证和授权。
JWT 由三个部分组成,通过点号 . 分隔开来:
Header(头部): 包含令牌的类型(JWT)和所使用的签名算法。示例:
json
{
"alg": "HS256",
"typ": "JWT"
}
Payload(负载): 包含有关声明的信息,例如用户身份、角色、权限等。示例:
json
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
Signature(签名): 由头部、负载和密钥生成的签名,用于验证令牌的完整性和来源。签名的目的是确保令牌没有被篡改。
生成签名的过程如下:
将编码后的头部和负载使用点号连接起来:base64UrlEncode(header) + "." + base64UrlEncode(payload)
使用指定的算法和密钥对连接后的字符串进行签名:HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secretKey)
JWT 认证的原理如下:
认证过程:
用户提供用户名和密码进行登录。
服务器验证用户凭据,如果正确则生成 JWT,并将其返回给客户端。
客户端在后续请求的 Authorization 头中带上 JWT。
服务器使用密钥验证 JWT 的签名,如果签名有效,则认为用户已成功认证。
授权过程:
服务器在处理请求时,解析 JWT 并读取负载中的声明。
服务器根据声明中的信息(例如用户角色、权限等)来决定是否授权该请求。
优点:
跨平台:JWT 是文本形式,易于在不同平台之间传递。
自包含性:JWT 包含所有必要的信息,不需要频繁查询数据库。
无状态:服务器不需要在会话中保存用户状态,每个请求都包含了认证信息。
扩展性:可以添加自定义声明来存储应用程序特定的信息。
注意事项:
JWT 是基于签名的,所以密钥的保管和安全性至关重要。
JWT 的内容是可以被解码的,但只有服务器持有的密钥能够对其进行签名和验证。
一旦签发,JWT 无法撤销,除非等到其过期时间。