无尘阁日记

无尘阁日记

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)**信息:

  • 注册声明(如 issexpsubaud

  • 公共声明(如用户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);  }});

八、推荐书籍与论文