考察点分析

该题目主要考察以下核心能力维度:

  1. 安全机制理解:JWT的安全实现原理及防篡改机制
  2. 密码学应用能力:对称加密(HMAC)与非对称加密(RSA)在签名中的差异
  3. 系统设计思维:短期Token与Refresh Token组合方案的设计权衡

具体技术评估点:

  • JWT三段式结构编码规范
  • 数字签名对报文完整性的保障机制
  • 不同签名算法的密钥管理策略
  • 无状态认证场景下的会话安全控制
  • Token时效性与用户体验的平衡

技术解析

关键知识点

JWT结构 > 数字签名算法 > Token时效策略

原理剖析

JWT采用Base64URL编码的JSON结构,包含:

  1. Header:声明算法类型(alg)和令牌类型(typ)
  // Header示例
{ "alg": "HS256", "typ": "JWT" }
  
  1. Payload:携带业务数据(claims)如用户ID、过期时间(exp)
  2. Signature:对前两部分的签名,通过HMAC或RSA算法确保数据完整性

签名生成逻辑:

  HMAC_SHA256(base64(header) + "." + base64(payload), secret)
  

验证时服务端重新计算签名,与令牌中的签名比对。任何对Header/Payload的修改都会导致签名不匹配。

密钥差异

  • HMAC:对称加密,服务端存储密钥,计算效率高
  • RSA:非对称加密,私钥签名公钥验签,适合微服务架构

常见误区

  • 误将敏感数据存放在未加密的Payload中
  • 混淆JWT加密(JWE)与签名(JWS)的区别
  • 认为Refresh Token不需要服务端存储(实际需要持久化存储)

问题解答

JWT通过三段式结构实现无状态认证。Header声明算法,Payload携带业务数据,Signature通过HMAC或RSA确保数据完整性。以HMAC为例,服务端用密钥生成签名,任何对令牌的篡改都会导致签名验证失败。RSA方案通过私钥签名公钥验证,更适合多系统协作场景。

短期Access Token(如15分钟)降低泄露风险,配合长期Refresh Token(如7天)实现平滑续期。Refresh Token需持久化存储并严格保护,当Access Token过期时,用户凭Refresh Token获取新Access Token。这种设计在保持无状态优势的同时,兼顾安全性与用户体验。


解决方案

编码示例

  // 生成JWT
const crypto = require('crypto');

function sign(payload, secret) {
  const header = Buffer.from(JSON.stringify({ alg: 'HS256', typ: 'JWT' })).toString('base64url');
  const payloadEncoded = Buffer.from(JSON.stringify(payload)).toString('base64url');
  const signature = crypto.createHmac('sha256', secret)
    .update(`${header}.${payloadEncoded}`)
    .digest('base64url');
  return `${header}.${payloadEncoded}.${signature}`;
}

// 验证示例
function verify(token, secret) {
  const [headerB64, payloadB64, signature] = token.split('.');
  const expectedSig = crypto.createHmac('sha256', secret)
    .update(`${headerB64}.${payloadB64}`)
    .digest('base64url');
  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expectedSig)
  );
}
  

可扩展性建议

  • 密钥轮转:HMAC场景使用密钥版本号,RSA场景定期更换密钥对
  • 分布式验证:通过JWKS端点发布公钥,适用于微服务架构
  • 性能优化:签名验证耗时较高时,采用本地缓存验证结果

深度追问

  1. 如何防范JWT重放攻击?

    • 加入jti唯一标识符与短期有效性窗口
  2. Refresh Token泄露如何处理?

    • 服务端维护吊销列表(黑名单)
  3. 为什么JWT默认不加密?

    • JWS标准仅保证完整性,加密需使用JWE规范

Last updated 06 Mar 2025, 13:07 +0800 . history