「JWT」- JSON Web Token

认识

JWT (JSON Web Token) 是一种开放标准 (RFC 7519),用于在网络应用环境间安全地传递声明(claims)。它是一种紧凑的、URL 安全的表示方式,用于在双方之间传输信息。JWT 是现代 Web 开发中广泛使用的身份验证和授权机制,特别适合 RESTful API 和无状态服务架构。简而言之,JWT 是个字符串,形如`xxxxx.yyyyy.zzzzz`格式,其中包含用户信息,三个部分可分别通过 base64 解码来查看内容,类似于 Cookie 的功能。

定位:身份验证;授权;

组成

结构成分

JWT 由三部分组成,用点号(.)分隔。完整的 JWT 看起来像 `xxxxx.yyyyy.zzzzz` 形式。

Header (头部)

  • 包含令牌类型和使用的哈希算法
  • 例如:`{“alg”: “HS256”, “typ”: “JWT”}`

Payload (负载)

  • 包含声明(claims),即要传递的数据
  • 有三种类型的声明:
– 注册声明(预定义):例如 iss(签发者)、exp(过期时间)、sub(主题)、……

– 公共声明

– 私有声明
  • 例如:`{“sub”: “1234567890”, “name”: “John Doe”, “admin”: true}`

Signature (签名)

  • 对前两部分的签名,用于验证消息未被篡改
  • 例如:`HMACSHA256(base64UrlEncode(header) + “.” + base64UrlEncode(payload), secret)`

工作原理

  1. 用户登录,Server 验证凭证
  2. Server 创建 JWT 并返回给 Client
  3. Client 存储 JWT(通常在 localStorage 或 cookie 中)
  4. Client 在后续请求的 Authorization 头中携带 JWT
  5. Server 验证 JWT 并处理请求

构建

按照组成部分,来构建 JWT 即可。

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) {
    console.error('Invalid token');
  } else {
    console.log('Decoded token:', decoded);
  }
});

JSON Web Token (JWT) Debugger | https://jwt.io/

安全注意事项

  1. 在不安全的通道中,不要传输 JWT
  2. 在 JWT 中,不要将敏感信息存储
  3. 使用适当的过期时间
  4. 考虑使用 HTTPS 协议
  5. 针对高安全性场景,可以考虑使用短期 JWT 配合刷新令牌

性质

  1. 无状态:Server 不需要存储会话信息
  2. 跨域 / 跨服务:适合分布式系统和微服务架构
  3. 灵活性:可以包含自定义数据
  4. 安全性:使用签名保证数据完整性
  5. 标准化:广泛支持的各种语言和框架

注意,虽然 JWT 与 Cookie 功能相仿,但是,目前(05/26/2025)JWT 并非 HTTP 或 浏览器 标准,所以浏览器不会自动存储 JWT,需要应用程序(前端代码)主动处理 JWT 的存储和发送。

应用

  1. 身份认证
  2. 信息交换
  3. 单点登录(SSO)
  4. API 认证

参考

DeepSeek / 介绍 jwt 技术