Skip to main content

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 续期机制
  1. 登录后返回 Access Token(有效期短) + Refresh Token(有效期长)
  2. Access Token 过期时,调用刷新接口用 Refresh Token 换新
🔐 加密算法推荐
  • 对称加密:HS256(最常见)
  • 非对称加密:RS256(适合多系统公私钥分离)

✅ 实践注意事项

项目建议
过期时间不宜设置太长,避免被盗用
密钥保管使用环境变量或配置中心管理
跨域安全建议配合 Cookie + HttpOnly
信息安全Payload 内容不可包含敏感数据

📚 推荐资源