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 的结构详解

  1. 头部(Header)

    • 作用:说明令牌类型和签名算法(如 HMAC SHA256 或 RSA)。
    • 示例:
      {
        "alg": "HS256",  // 算法类型
        "typ": "JWT"     // 令牌类型
      }
      
    • 处理:将 JSON 对象用 Base64Url 编码形成第一部分。
  2. 载荷(Payload)

    • 作用:携带实际需要传递的声明(例如用户 ID、权限角色)。
    • 声明类型:
      • 注册声明(标准字段,如 exp 过期时间、iss 签发者)。
      • 公共声明(可自定义,但需避免冲突)。
      • 私有声明(业务自定义字段,如 userId)。
    • 示例:
      {
        "sub": "1234567890",
        "name": "John Doe",
        "admin": true,
        "iat": 1516239022  // 签发时间
      }
      
    • 处理:同样通过 Base64Url 编码形成第二部分。
  3. 签名(Signature)

    • 作用:防止数据被篡改,验证消息完整性。
    • 生成方式:
      HMACSHA256(
        base64UrlEncode(header) + "." + base64UrlEncode(payload),
        secret_key
      )
      
    • 关键:签名需使用服务端保存的密钥(或非对称加密的私钥),客户端无法伪造。

三、JWT 的工作流程

  1. 登录认证

    • 用户提交凭证(如用户名/密码)到服务端。
    • 服务端验证通过后,生成 JWT 返回给客户端(通常存于 Cookie 或 LocalStorage)。
  2. 后续请求验证

    • 客户端在请求头(如 Authorization: Bearer <token>)中携带 JWT。
    • 服务端验证签名是否有效、令牌是否过期(检查 exp 字段)。
    • 验证通过后直接使用载荷中的信息处理业务,无需查询数据库。

四、JWT 的优势与风险

  1. 优势

    • 无状态:服务端无需存储会话信息,适合分布式系统。
    • 可扩展:载荷可自定义业务字段,减少数据库查询。
  2. 风险与注意事项

    • 令牌一旦签发,在过期前无法强制失效(需结合黑名单或短有效期规避)。
    • 敏感信息不应明文存储于载荷(因 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)等模式提升安全性。

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