基础概念

定义:一种紧凑的、URL 安全的令牌,用于在各方之间传递经过加密的数据,主要用于认证和授权

结构:由三部分组成:HeaderPayloadSignature,中间用点(.)分隔

  • 完整的 JWT:xxxxx.yyyyy.zzzzz
  • Header
    • 令牌类型和所使用的签名算法
    • 比如:{ "alg": "HS256", "typ": "JWT" }
      • alg:签名算法,例如 HMAC SHA256 (HS256) 或 RSA
      • typ:令牌类型,这里是 JWT
  • Payload
    • 要传递的实际数据
    • 三种类型
      • 注册声明(Registered claims):预定义的声明,如 iss(发行者)、exp(过期时间)、sub(主题)、aud(受众)
      • 公共声明(Public claims):可以自定义,使用 JWT 官方注册或开放标准的声明
      • 私有声明(Private claims):自定义的声明,用于在双方之间传递的信息
  • Signature
    • 用于验证消息的真实性和防止篡改
    • 通过 Header、Payload 和密钥生成

工作原理

  1. 用户登录:用户使用用户名和密码登录
  2. 服务器验证:服务器验证用户身份
  3. 生成 JWT:验证成功后,服务器生成一个 JWT,并返回给客户端
  4. 客户端存储:客户端(如浏览器)存储 JWT,可以是 Local Storage 或 Cookies
  5. 发送请求:客户端在每次请求时,将 JWT 添加到 HTTP 头部,通常是 Authorization: Bearer <token>
  6. 服务器验证 JWT:服务器接收到请求后,验证 JWT 的有效性和完整性
  7. 处理请求:验证通过后,服务器处理请求并返回响应

安全性

  • 签名算法:JWT 使用的签名算法通常是 HMAC SHA256(对称密钥)或 RSA(非对称密钥)
  • 密钥保护:必须保护签名密钥的安全,密钥泄露会导致 JWT 被伪造
  • 过期时间:应设置 exp(过期时间)声明,防止令牌长期有效
  • 加密:JWT 本身是明文的,如果需要传输敏感数据,应使用 JWE(JSON Web Encryption)进行加密

优缺点

优点

  • 自包含:JWT 包含所有需要的信息,减少服务器查询数据库的次数
  • 紧凑性:JWT 使用 JSON 格式,体积小,适合 URL 传输
  • 可扩展性:JWT 可以自定义声明,满足不同需求
  • 无状态:服务器无需存储会话信息,适用于分布式系统

缺点

  • 无法撤销:一旦签发,无法撤销 JWT,只能等待其过期
  • 体积较大:相较于传统会话 ID,JWT 包含的信息更多,体积较大
  • 安全隐患:如果不使用 HTTPS 传输,可能被窃取;如果密钥泄露,可能被伪造