JWT原理及工作流程详解
JSON Web Token(JWT)是一种开放标准(RFC 7519),用于在各方之间安全传输信息。其核心原理是通过结构化、签名或加密的JSON对象实现无状态身份验证和授权。以下是JWT的工作原理和关键组成部分:
1. JWT结构
JWT由三部分组成,用点号(.
)分隔:
复制
下载
Header.Payload.Signature
例如:xxxxx.yyyyy.zzzzz
(1) 头部(Header)
-
作用:声明令牌类型(
typ: "JWT"
)和签名算法(如HS256
、RS256
)。 -
编码方式:Base64Url编码。
-
示例:
json
{"alg": "HS256","typ": "JWT" }
(2) 载荷(Payload)
-
作用:携带用户身份和权限信息(称为“声明”)。
-
声明类型:
-
注册声明(预定义,如
iss
签发者、exp
过期时间、sub
主题)。 -
公共声明(自定义,需避免冲突)。
-
私有声明(双方协商的声明)。
-
-
编码方式:Base64Url编码。
-
示例:
json
{"sub": "1234567890","name": "John Doe","admin": true,"exp": 1622544000 }
(3) 签名(Signature)
-
作用:验证令牌完整性和真实性,防止篡改。
-
生成方式:将编码后的Header和Payload用
.
连接,使用密钥和指定算法签名。 -
示例(HMAC SHA256算法):
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),secretKey )
2. JWT工作流程
-
用户登录:客户端发送凭证(如用户名/密码)到认证服务器。
-
生成JWT:服务器验证凭证,生成JWT并返回给客户端。
-
客户端存储:客户端保存JWT(通常为LocalStorage或Cookie)。
-
携带JWT请求:客户端在后续请求的
Authorization
头中携带JWT(如Bearer <token>
)。 -
服务端验证:
-
拆分JWT,验证签名有效性(使用相同密钥和算法重新计算签名)。
-
检查声明(如
exp
是否过期、用户权限等)。 -
验证通过后,处理请求。
-
3. 核心特点
-
无状态:服务端无需存储会话信息,适合分布式系统。
-
自包含:所有必要信息都包含在令牌中。
-
安全性:通过签名防止篡改,但需结合HTTPS防止窃听。
-
灵活性:支持对称(HMAC)和非对称(RSA)加密算法。
4. 注意事项
-
敏感信息:载荷仅Base64编码(非加密),避免存储密码等敏感数据。
-
密钥管理:密钥泄露会导致令牌伪造,需严格保护。
-
令牌有效期:设置合理过期时间(
exp
),缩短被窃取后的风险窗口。 -
废止机制:JWT无法直接废止,需借助黑名单或短期有效期。
5. 适用场景
-
跨域认证(如单点登录SSO)。
-
API无状态身份验证。
-
客户端与微服务间的安全通信。
通过上述机制,JWT实现了高效、安全的身份验证,但需结合实际需求权衡其无状态特性和潜在的安全风险。