JWT全称为JSON Web Token,是一种基于JSON的开放标准,用于在各方之间安全地传输信息,常被用于前后端分离项目的用户身份认证场景。一个标准的JWT由三部分组成,分别是头部、载荷和签名,三部分之间用点号分隔。

JWT的基本结构
JWT的三部分结构各自有不同的作用:
- 头部(Header):通常包含令牌的类型和使用的签名算法,比如HS256(HMAC SHA256)算法。
- 载荷(Payload):存放实际需要传递的数据,比如用户ID、用户名、过期时间等,注意不要存放敏感信息。
- 签名(Signature):使用头部指定的算法,结合密钥对编码后的头部和载荷进行签名,用于验证Token是否被篡改。
Node.js环境生成JWT Token
在Node.js中生成JWT需要使用jsonwebtoken库,首先需要通过npm安装该依赖:
npm install jsonwebtoken
生成Token的核心代码如下,这里使用HS256算法,设置Token有效期为1小时:
const jwt = require('jsonwebtoken');
// 定义密钥,实际开发中需要存放在环境变量中,不要硬编码
const secretKey = 'your_secret_key_here';
// 生成Token的函数
function generateToken(userInfo) {
// 载荷数据,包含用户ID和用户名,设置过期时间为1小时
const payload = {
userId: userInfo.id,
username: userInfo.username,
exp: Math.floor(Date.now() / 1000) + 60 * 60 // 过期时间戳,单位秒
};
// 生成Token,使用HS256算法
const token = jwt.sign(payload, secretKey, { algorithm: 'HS256' });
return token;
}
// 示例调用
const user = { id: 1001, username: 'testUser' };
const token = generateToken(user);
console.log('生成的Token:', token);
Node.js环境验证JWT Token
验证Token同样使用jsonwebtoken库,验证过程会检查Token的格式、签名是否正确,以及是否过期:
const jwt = require('jsonwebtoken');
const secretKey = 'your_secret_key_here';
// 验证Token的函数
function verifyToken(token) {
try {
// 验证Token,返回解码后的载荷数据
const decoded = jwt.verify(token, secretKey, { algorithms: ['HS256'] });
return {
valid: true,
expired: false,
data: decoded
};
} catch (err) {
// 处理验证错误
if (err.name === 'TokenExpiredError') {
return {
valid: false,
expired: true,
msg: 'Token已过期'
};
} else if (err.name === 'JsonWebTokenError') {
return {
valid: false,
expired: false,
msg: 'Token无效'
};
} else {
return {
valid: false,
expired: false,
msg: 'Token验证失败'
};
}
}
}
// 示例调用
const verifyResult = verifyToken(token);
if (verifyResult.valid) {
console.log('Token验证通过,用户信息:', verifyResult.data);
} else {
console.log('Token验证失败:', verifyResult.msg);
}
前端存储与使用Token
前端获取到Token后,通常有两种存储方式:
- localStorage:存储方便,但是容易受到XSS攻击,适合对安全性要求不高的场景。
- HttpOnly Cookie:无法通过JS脚本读取,能有效防止XSS攻击,但是需要后端配合设置Cookie。
前端在请求需要认证的接口时,通常将Token放在请求头的Authorization字段中:
// 使用fetch发送携带Token的请求
fetch('https://ipipp.com/api/user/info', {
method: 'GET',
headers: {
'Authorization': `Bearer ${token}`
}
})
.then(response => response.json())
.then(data => console.log('请求结果:', data))
.catch(err => console.error('请求错误:', err));
常见注意事项
- 密钥一定要妥善保管,不要泄露到客户端,也不要硬编码在代码中,建议存放在环境变量里。
- 不要将密码、身份证号等敏感信息放在JWT的载荷中,因为载荷部分只是经过Base64编码,不是加密,任何人都可以解码查看内容。
- 验证Token时一定要指定允许的签名算法,避免攻击者使用空算法绕过验证。
- 如果需要让Token失效,比如用户退出登录,需要后端维护一个黑名单,验证时先检查Token是否在黑名单中,因为JWT本身是无状态的,一旦签发在过期前都是有效的。
JWTToken验证JavaScriptNode.js修改时间:2026-07-20 23:18:26