JWT是详解
2025-07-11
一、JWT是什么?
JWT(JSON Web Token)是一个开放标准(RFC 7519),用于在网络应用环境间以紧凑、安全的方式传递信息,特别用于用户认证与信息交换。
它的核心理念:
用户登录后,服务端生成 JWT,返回给客户端;
客户端在后续请求中携带 JWT;
服务端通过验证 JWT 来完成用户身份识别(不再存储会话信息,减少服务器压力)。
二、JWT的结构
JWT 是一个由 三部分通过.
连接的字符串组成:
header.payload.signature
1. Header(头部)
用于说明:
签名算法(如 HS256、RS256)
类型(typ: “JWT”)
示例:
{ "alg": "HS256", "typ": "JWT"}
Base64Url 编码后作为第一部分。
2. Payload(有效载荷)
用于存储需要传递的**声明(claims)**信息:
注册声明(如
iss
,exp
,sub
,aud
)公共声明(如用户id,角色)
私有声明(双方约定的字段)
示例:
{ "sub": "1234567890", "name": "John Doe", "admin": true, "exp": 1710000000}
Base64Url 编码后作为第二部分。
3. Signature(签名)
用于防止内容被篡改,保证完整性和可信性:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
secret
是服务端保管的密钥(对称)或私钥(非对称)。签名后进行 Base64Url 编码,作为第三部分。
三、JWT的实现机制
1️⃣ 用户登录
用户通过用户名/密码登录。
2️⃣ 服务端验证后生成 JWT
在 Payload 中包含用户标识、过期时间、角色等。
使用指定算法和密钥进行签名。
返回 JWT 给客户端。
3️⃣ 客户端存储 JWT
通常存储在:
LocalStorage
SessionStorage
Cookie(HttpOnly 可避免 XSS)
4️⃣ 客户端每次请求时携带 JWT
通常放在 HTTP Header 的 Authorization 中:
Authorization: Bearer <token>
5️⃣ 服务端验证 JWT
拆解 JWT 获取 Header、Payload、Signature。
使用密钥验证签名是否合法。
检查
exp
是否过期。根据 Payload 中的信息执行鉴权与业务逻辑。
四、JWT的核心原理
✅ 无状态认证:
JWT 本身携带用户信息,无需服务端保存会话信息,适合分布式、微服务架构。
✅ 基于签名验证完整性:
Header 和 Payload 是公开可见的,但签名保证了它们没有被篡改。
可使用对称密钥(HS256)或非对称密钥(RS256)验证。
✅ Base64Url 编码而非加密:
JWT 并不加密 Payload,任何人可解码查看信息,敏感信息需避免直接放入或采用加密 JWT(JWE)。
✅ 可携带多种信息:
用户身份信息、权限信息、过期时间等均可直接放入 Payload 中携带。
五、JWT的常见应用场景
✅ 用户认证(单点登录、移动端、前后端分离架构)
✅ OAuth2.0 中 Access Token 的实现
✅ 微服务之间身份信息传递
六、常见问题与注意事项
1️⃣ JWT过期后如何处理?
JWT本身无法主动失效(无状态),常通过:
设置合适的
exp
。配合 Refresh Token 实现续签。
对于高安全性场景,可维护黑名单来提前让 JWT 失效。
2️⃣ 是否安全?
签名保证完整性但不保证机密性,不应放敏感信息。
防御 XSS:JWT 放在 HttpOnly Cookie 中。
防御 CSRF:通常通过 Token 验证或使用 SameSite Cookie。
3️⃣ Token刷新机制如何实现?
登录时同时返回短效 Access Token 和长效 Refresh Token。
Access Token 过期后使用 Refresh Token 向服务器申请新的 Token。
七、实际项目中如何实现?
以 Node.js (Express) + jsonwebtoken 库为例:
1️⃣ 安装依赖
npm install jsonwebtoken
2️⃣ 生成 JWT
const jwt = require('jsonwebtoken');const token = jwt.sign( { userId: '12345', role: 'admin' }, // payload 'your_secret_key', // secret { expiresIn: '2h' } // options);console.log(token);
3️⃣ 验证 JWT
jwt.verify(token, 'your_secret_key', (err, decoded) => { if (err) { console.log('Token 验证失败', err); } else { console.log('Token 验证成功', decoded); }});
八、推荐书籍与论文
《OAuth 2 in Action》 – 了解 JWT 在 OAuth2.0 下的最佳实践
发表评论: