JWT(JSON Web Token)的原理与实现
字数 989 2025-11-06 12:41:12
JWT(JSON Web Token)的原理与实现
一、JWT 是什么?
JWT 是一种开放标准(RFC 7519),用于在网络应用间安全传递声明(例如用户身份信息)。它由三部分组成:头部(Header)、载荷(Payload)和签名(Signature),通过点号连接成一个字符串,例如:
xxxxx.yyyyy.zzzzz
二、JWT 的结构详解
-
头部(Header)
- 作用:说明令牌类型和签名算法(如 HMAC SHA256 或 RSA)。
- 示例:
{ "alg": "HS256", // 算法类型 "typ": "JWT" // 令牌类型 } - 处理:将 JSON 对象用 Base64Url 编码形成第一部分。
-
载荷(Payload)
- 作用:携带实际需要传递的声明(例如用户 ID、权限角色)。
- 声明类型:
- 注册声明(标准字段,如
exp过期时间、iss签发者)。 - 公共声明(可自定义,但需避免冲突)。
- 私有声明(业务自定义字段,如
userId)。
- 注册声明(标准字段,如
- 示例:
{ "sub": "1234567890", "name": "John Doe", "admin": true, "iat": 1516239022 // 签发时间 } - 处理:同样通过 Base64Url 编码形成第二部分。
-
签名(Signature)
- 作用:防止数据被篡改,验证消息完整性。
- 生成方式:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret_key ) - 关键:签名需使用服务端保存的密钥(或非对称加密的私钥),客户端无法伪造。
三、JWT 的工作流程
-
登录认证
- 用户提交凭证(如用户名/密码)到服务端。
- 服务端验证通过后,生成 JWT 返回给客户端(通常存于 Cookie 或 LocalStorage)。
-
后续请求验证
- 客户端在请求头(如
Authorization: Bearer <token>)中携带 JWT。 - 服务端验证签名是否有效、令牌是否过期(检查
exp字段)。 - 验证通过后直接使用载荷中的信息处理业务,无需查询数据库。
- 客户端在请求头(如
四、JWT 的优势与风险
-
优势
- 无状态:服务端无需存储会话信息,适合分布式系统。
- 可扩展:载荷可自定义业务字段,减少数据库查询。
-
风险与注意事项
- 令牌一旦签发,在过期前无法强制失效(需结合黑名单或短有效期规避)。
- 敏感信息不应明文存储于载荷(因 Base64 可解码,需加密处理)。
- 密钥泄露会导致令牌可被伪造,需严格保护密钥。
五、代码实现示例(Node.js)
const jwt = require('jsonwebtoken');
// 生成 JWT
const token = jwt.sign(
{ userId: 123, role: 'admin' },
'your-secret-key',
{ expiresIn: '1h' } // 过期时间
);
// 验证 JWT
jwt.verify(token, 'your-secret-key', (err, decoded) => {
if (err) throw new Error('令牌无效');
console.log(decoded.userId); // 输出:123
});
六、总结
JWT 通过签名机制确保数据完整性,适合无状态认证场景,但需注意密钥管理、有效期设置等安全实践。结合具体业务需求,可扩展为刷新令牌(Refresh Token)等模式提升安全性。