JWT 认证机制详解
JWT(JSON Web Token)是一种用于身份认证和授权的无状态机制,广泛用于前后端分离、移动端、微服务等系统中。
🔐 什么是 JWT?
JWT 是一个以 .
分隔的字符串,包含 3 部分:
Header.Payload.Signature
例如:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJ1c2VySWQiOiIxMjM0NSIsInJvbGUiOiJhZG1pbiJ9.
dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
部分 | 含义 |
---|---|
Header | 加密算法、类型(如 HS256) |
Payload | 用户信息(如 userId、role) |
Signature | 签名值,防止篡改 |
📌 JWT 使用场景
场景 | 说明 |
---|---|
用户登录后返回 Token | 前端保存并在请求中携带 |
前后端分离项目认证 | 每次请求在 header 中传 token |
微服务通信 | 服务之间通过 JWT 识别调用方 |
OAuth 授权 | JWT 可作为 AccessToken 格式 |
🔐 JWT 安全原理
- Payload 是明文的,不能存敏感信息
- Signature 使用密钥对 Header+Payload 进行加密,防止被篡改
- 支持过期时间设置(exp)
caution
不要将密码、银行卡号等敏感信息放在 Payload 中!
🧑💻 示例代码
✅ 生成 Token(Node.js)
const jwt = require('jsonwebtoken');
const token = jwt.sign(
{ userId: '123', role: 'admin' },
'secret123',
{ expiresIn: '1h' }
);
console.log(token);
✅ 验证 Token(Express 中间件)
function authMiddleware(req, res, next) {
const token = req.headers.authorization?.split(" ")[1];
try {
const payload = jwt.verify(token, 'secret123');
req.user = payload;
next();
} catch (err) {
return res.status(401).json({ message: "Token 无效或过期" });
}
}
✅ 前端请求时携带 Token
axios.get("https://api.example.com/user", {
headers: {
Authorization: "Bearer " + token
}
});
✅ Python 使用 PyJWT 生成 Token
import jwt
import datetime
token = jwt.encode(
{"user_id": "123", "exp": datetime.datetime.utcnow() + datetime.timedelta(hours=1)},
"secret123",
algorithm="HS256"
)
print(token)
🧠 JWT 进阶技巧
🔁 Token 续期机制
- 登录后返回 Access Token(有效期短) + Refresh Token(有效期长)
- Access Token 过期时,调用刷新接口用 Refresh Token 换新
🔐 加密算法推荐
- 对称加密:HS256(最常见)
- 非对称加密:RS256(适合多系统公私钥分离)
✅ 实践注意事项
项目 | 建议 |
---|---|
过期时间 | 不宜设置太长,避免被盗用 |
密钥保管 | 使用环境变量或配置中心管理 |
跨域安全 | 建议配合 Cookie + HttpOnly |
信息安全 | Payload 内容不可包含敏感数据 |