JWT 认证机制实战:Token 设计与安全最佳实践
JWT(JSON Web Token)是无状态的认证方案。本文深入讲解 JWT 结构、生成验证和安全实践。
📦 JWT 结构
Header.Payload.Signature
// 示例
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
🔐 生成和验证 JWT
const jwt = require('jsonwebtoken')
// 生成 token
const token = jwt.sign(
{ userId: 123, role: 'admin' },
process.env.JWT_SECRET,
{ expiresIn: '1h' }
)
// 验证 token
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET)
console.log(decoded.userId) // 123
} catch (err) {
console.log('Invalid token')
}
⚡ Access Token + Refresh Token 策略
// 短生命周期 access token(15分钟)
const accessToken = jwt.sign({ userId: 123 }, SECRET, { expiresIn: '15m' })
// 长生命周期 refresh token(7天)
const refreshToken = jwt.sign({ userId: 123 }, REFRESH_SECRET, { expiresIn: '7d' })
// 使用 refresh token 刷新 access token
app.post('/refresh', (req, res) => {
const { refreshToken } = req.body
const decoded = jwt.verify(refreshToken, REFRESH_SECRET)
const newAccessToken = jwt.sign({ userId: decoded.userId }, SECRET, { expiresIn: '15m' })
res.json({ accessToken: newAccessToken })
})
🔒 安全最佳实践
- 使用强密钥:至少 256 位随机字符串
- 设置短过期时间:Access token 不超过 1 小时
- 不在 Payload 存敏感信息:Payload 是 Base64 编码,可解码
- 使用 HTTPS:防止 token 被窃听
- 实现 token 黑名单:退出登录时失效 token
- 验证 iss、aud 声明:防止 token 被滥用
总结:JWT 是无状态认证的优秀方案,但需要注意安全风险。使用 Access + Refresh Token 策略、遵循安全最佳实践,能构建安全可靠的认证系统。
本文整理自 JWT RFC 7519 及认证安全实战指南