JWT的原理介绍

136 阅读2分钟

JSON Web Token(JWT)是现代Web开发中广泛使用的开放标准(RFC 7519),用于安全地在各方之间传输声明信息。以下是其核心原理的深度解析:


一、结构解剖(三部分通过.连接)

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.           // Header
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.  // Payload
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c      // Signature
  1. Header(头部)

    • 算法声明:指定签名算法(如HS256、RS512)
    • Token类型:固定为JWT
    {
      "alg": "HS256",
      "typ": "JWT"
    }
    
  2. Payload(载荷)

    • 注册声明(预定义字段):
      • iss (签发者)
      • exp (过期时间戳)
      • sub (主题)
    • 公共声明(自定义字段):
      {
        "userId": "5f4dcc3b5aa765d61d8327deb882cf99",
        "roles": ["admin", "editor"]
      }
      
    • 私有声明(双方约定字段)
  3. Signature(签名)

    • 生成公式:
      HMACSHA256(
        base64UrlEncode(header) + "." +
        base64UrlEncode(payload),
        secret-key
      )
      
    • 验证原理:服务端重新计算签名并与传输的签名比对

二、工作流程(OAuth 2.0示例)

  1. 客户端提交凭证 → 认证服务
  2. 服务端验证通过后生成JWT → 返回给客户端
  3. 客户端存储JWT(localStorage/Cookie)
  4. 后续请求携带JWT(Authorization头)
  5. 服务端解密验证 → 授权访问资源

三、核心优势

  1. 无状态认证:服务端无需保存会话状态
  2. 跨域支持:适用于微服务架构
  3. 信息自包含:减少数据库查询次数
  4. 标准化格式:多语言兼容(Java/Python/Node.js等)

四、安全机制

  1. 防篡改:签名保证内容完整性
  2. 时效控制:通过exp字段设置有效期
  3. 算法验证:强制校验头部声明的算法
  4. 密钥保护:HS256需要保密密钥,RS256使用公私钥体系

五、典型应用场景

  1. 单点登录(SSO)系统
  2. RESTful API身份验证
  3. 移动应用授权
  4. 服务间安全通信

六、安全实践建议

  1. 必须使用HTTPS传输
  2. 敏感数据不要存Payload(Payload仅Base64编码)
  3. 设置合理的过期时间(建议≤1小时)
  4. 使用强加密算法(推荐RS256)
  5. 实现Token黑名单机制(用于即时吊销)

七、与Session对比

特性JWTSession
存储位置客户端服务端
扩展性适合分布式系统需要共享存储
安全性依赖签名算法依赖Cookie安全
性能开销每次请求需要验证签名需要查询会话存储
失效控制依赖过期时间可即时销毁