认识
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)`
工作原理
- 用户登录,Server 验证凭证
- Server 创建 JWT 并返回给 Client
- Client 存储 JWT(通常在 localStorage 或 cookie 中)
- Client 在后续请求的 Authorization 头中携带 JWT
- 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/
安全注意事项
- 在不安全的通道中,不要传输 JWT
- 在 JWT 中,不要将敏感信息存储
- 使用适当的过期时间
- 考虑使用 HTTPS 协议
- 针对高安全性场景,可以考虑使用短期 JWT 配合刷新令牌
性质
- 无状态:Server 不需要存储会话信息
- 跨域 / 跨服务:适合分布式系统和微服务架构
- 灵活性:可以包含自定义数据
- 安全性:使用签名保证数据完整性
- 标准化:广泛支持的各种语言和框架
注意,虽然 JWT 与 Cookie 功能相仿,但是,目前(05/26/2025)JWT 并非 HTTP 或 浏览器 标准,所以浏览器不会自动存储 JWT,需要应用程序(前端代码)主动处理 JWT 的存储和发送。
应用
- 身份认证
- 信息交换
- 单点登录(SSO)
- API 认证
参考
DeepSeek / 介绍 jwt 技术