初识JWT
JWT(JSON Web Token)是一种基于 JSON 的开放标准(RFC 7519),用于在网络应用间安全传递声明(claims)。它通常由三部分组成:头部(Header)、载荷(Payload)和签名(Signature),中间用点(.)分隔,形如 header.payload.signature。
JWT的结构
1)头部(Header)
包含两部分:令牌类型(通常是 JWT)和使用的签名算法(如 HMAC SHA256 或 RSA)。
示例:
{
"alg": "HS256",
"typ": "JWT"
}
2)载荷(Payload)
包含声明(claims),即关于实体(通常是用户)和其他数据的声明。声明分为三种:
注册声明(如iss、sub、aud、exp等,非强制但推荐使用)。
公开声明(自定义的键值对,需避免冲突)。
私有声明(在同意使用的各方之间定义的声明)。
示例:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
3)签名(Signature)
为了创建签名部分,需要使用编码后的头部、编码后的载荷、一个秘钥(secret)和头部中指定的签名算法。
示例(使用 HMAC SHA256 算法):
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)
JWT的工作流程
用户认证:用户登录时,服务器验证用户身份后创建 JWT。
返回令牌:服务器将 JWT 返回给客户端(通常通过 HTTP 响应头或 JSON 数据)。
客户端存储:客户端(如浏览器)将 JWT 存储在本地(如 localStorage 或 cookie)。
后续请求:客户端在每次请求时将 JWT 包含在请求头中(如Authorization: Bearer )。
服务器验证:服务器验证 JWT 的签名和有效性,确认用户身份后处理请求。
JWT的应用场景
身份验证:用户登录后颁发 JWT,后续请求通过 JWT 验证身份,无需依赖 session/cookie。
信息交换:JWT 可安全地在各方之间传递信息,因为签名确保数据未被篡改。
单点登录(SSO):多个服务可共享 JWT,实现跨域身份验证。
API 授权:保护 API 接口,只有携带有效 JWT 的请求才能访问受保护资源。
JWT的优缺点
优点
无状态:不依赖服务器存储 session,适合微服务和分布式系统。
跨域支持:可通过各种客户端存储(如 localStorage)在不同域名间传递。
可扩展:载荷部分可自定义声明,灵活携带用户信息。
安全性:签名机制确保数据完整性,使用 HTTPS 可进一步防止令牌拦截。
缺点
令牌体积大:Base64 编码后的 JWT 可能较长,增加请求头大小。
无法主动失效:一旦颁发,除非过期或被列入黑名单,否则一直有效。
敏感信息暴露:载荷部分仅被编码(而非加密),不要存放敏感数据。
性能开销:每次请求都需验证签名,对性能有一定影响。
注意事项
1.不要在载荷中存放敏感信息(如密码),因为载荷只是 Base64 编码,可被轻易解码。
2.妥善保管秘钥:签名秘钥泄露会导致令牌被伪造。
3.处理并发问题:同一用户可能在不同设备登录,需考虑令牌的唯一性和并发控制。