JWT(JSON Web Token)
字数 1652 2025-08-11 08:36:09
JSON Web Token (JWT) 全面解析
1. JWT 概述
JSON Web Token (JWT) 是一种开放标准 (RFC 7519),用于在网络应用环境间安全传递声明信息。它是一种紧凑的、URL安全的表示方式,用于在双方之间传输信息。
2. JWT 结构组成
JWT 由三部分组成,用点号(.)分隔:
Header.Payload.Signature
2.1 Header (头部)
Header 是一个 JSON 对象,描述 JWT 的元数据,通常包含两个属性:
{
"alg": "HS256",
"typ": "JWT"
}
alg:签名算法 (algorithm),默认是 HMAC SHA256 (写成 HS256)typ:令牌类型 (type),固定为 "JWT"
Header 会使用 Base64URL 算法进行编码。
2.2 Payload (负载)
Payload 也是一个 JSON 对象,存放实际需要传递的数据。JWT 规定了7个官方字段(可选):
iss(issuer):签发人exp(expiration time):过期时间sub(subject):主题aud(audience):受众nbf(Not Before):生效时间iat(Issued At):签发时间jti(JWT ID):编号
示例:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
重要注意事项:
- JWT 默认是不加密的,任何人都可以读取 Payload 内容
- 不要将敏感信息放在 Payload 中
- Payload 同样使用 Base64URL 算法编码
2.3 Signature (签名)
Signature 部分是对前两部分的签名,防止数据篡改。生成方式:
- 指定一个密钥 (secret),仅服务器知道
- 使用 Header 中指定的签名算法 (默认 HMAC SHA256)
- 计算公式:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
3. Base64URL 编码
Base64URL 是 Base64 的变种,主要区别:
+替换为-/替换为_=被省略
这些修改是为了避免 URL 中的特殊字符问题。
4. JWT 使用方式
客户端收到 JWT 后,可以存储在:
- Cookie 中(自动发送,但不能跨域)
- localStorage 中
推荐的使用方式是在 HTTP 请求头中添加 Authorization 字段:
Authorization: Bearer <token>
跨域时,也可以将 JWT 放在 POST 请求的数据体中。
5. JWT 特点
-
加密性:
- 默认不加密,但可以加密(生成原始 Token 后可用密钥再加密)
- 不加密时不能存放敏感信息
-
用途:
- 可用于认证
- 可用于信息交换
- 可减少服务器查询数据库次数
-
缺点:
- 服务器不保存 session 状态
- 无法在使用过程中废止某个 token
- 无法更改 token 的权限
- 一旦签发,在到期前始终有效(除非部署额外逻辑)
-
安全性:
- 一旦泄露,任何人都可获得所有权限
- 有效期应设置较短
- 重要权限应再次认证用户
- 不应使用 HTTP 明码传输,应使用 HTTPS
6. 安全最佳实践
- 使用强加密算法(如 HS256 或 RS256)
- 设置合理的短有效期
- 使用 HTTPS 传输
- 不要在 Payload 中存储敏感信息
- 考虑实现 token 刷新机制
- 对于重要操作,实施二次验证
7. JWT 工作流程
- 用户登录,服务器验证凭证
- 服务器生成 JWT 并返回给客户端
- 客户端存储 JWT(通常在 localStorage 或 sessionStorage)
- 客户端在后续请求中携带 JWT(通常在 Authorization 头)
- 服务器验证 JWT 并处理请求
- 如果 JWT 过期,客户端需要重新获取新的 JWT
8. 适用场景
- 无状态认证
- 跨域认证
- 单点登录 (SSO)
- API 认证
- 移动应用认证
9. 不适用场景
- 需要即时撤销 token 权限的场景
- 包含大量敏感信息的传输
- 需要复杂会话管理的系统
通过深入理解 JWT 的结构、原理和使用方式,开发者可以更安全、高效地在各种应用场景中实现认证和信息交换机制。