JWT 认证机制实战:Token 设计与安全最佳实践
JWT 认证机制实战:Token 设计与安全最佳实践

JWT 认证机制实战:Token 设计与安全最佳实践

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 })
})

🔒 安全最佳实践

  1. 使用强密钥:至少 256 位随机字符串
  2. 设置短过期时间:Access token 不超过 1 小时
  3. 不在 Payload 存敏感信息:Payload 是 Base64 编码,可解码
  4. 使用 HTTPS:防止 token 被窃听
  5. 实现 token 黑名单:退出登录时失效 token
  6. 验证 iss、aud 声明:防止 token 被滥用

总结:JWT 是无状态认证的优秀方案,但需要注意安全风险。使用 Access + Refresh Token 策略、遵循安全最佳实践,能构建安全可靠的认证系统。


本文整理自 JWT RFC 7519 及认证安全实战指南

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注