JWT原理

177 阅读2分钟

什么是JWT

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在各方之间安全传输信息。它是基于JSON的轻量级令牌,适合分布式系统和微服务架构。

核心思想

  • 通过服务端生成令牌,有客户端储存并跟随请求发送(通常在请求头里),由服务端验证令牌的有效性。
  • 无需在服务端存储会话信息(无状态)

结构

JWT由三部分组成,用.分隔:Header.Payload.Signature

  • Header(头部):
    包含令牌类型(typ: "JWT")和签名算法(如alg: "HS256")。如:
{
  "alg": "HS256",
  "typ": "JWT"
}
  • Payload(负载):
    • 存放自定义的一些值,如userId、角色等。
    • 一些声明、如:标准声明(iss【签发者】、exp【过期时间】、sub【主题】等)、公共声明、私有声明。
  • Signature(签名):
    • HeaderPayload的签名,防止数据篡改。
    • 生成方式:HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

值的⚠️注意的是,像Header、Payload里面只是简单的使用了Base64加密,所以它们是明文的,可以被解析和读取的,所以禁止存放敏感信息。

JWT的工作流程

  1. 用户登录:客户端发送凭据(如用户名/密码)到服务器。
  2. 生成JWT:服务器验证凭据,生成JWT并返回给客户端。
  3. 客户端存储:客户端(通常是浏览器)将JWT保存到localStorageCookie中。
  4. 携带JWT请求:客户端在后续请求的Authorization头中附加JWT(如Bearer <token>)。
  5. 服务器验证:服务器检查签名和声明(如过期时间),返回数据或拒绝请求。

JWT的优点与缺点

  • 优点
    • 无状态,适合分布式系统。
    • 跨域支持,适合前后端分离和微服务。
    • 信息自包含,减少数据库查询。
  • 缺点
    • 令牌一旦签发,无法中途废止(需结合黑名单或短有效期解决)。
    • 负载过大可能影响性能(因需随请求发送)。
    • 需妥善保管密钥,防止泄露。