Skip to content

JWT

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用环境间安全地将信息作为 JSON 对象传输。这种信息通常被称为“声明”,它们被封装在 JWT 中,可以在各方之间传递而不需要担心被篡改或阅读。

JWT 的基本结构

JWT 由三部分组成,分别是 Header(头部)、Payload(载荷)和 Signature(签名),这三部分用点号.连接在一起形成一个完整的 JWT 字符串。

  1. Header:包含令牌的类型(即 JWT)和所使用的签名算法(如 HMAC SHA256 或 RSA)。例如:

    json
    {
      "alg": "HS256",
      "typ": "JWT"
    }
  2. Payload:包含声明(claims)。声明是关于实体(通常是用户)和其他数据的声明。声明分为三种类型:注册声明、公共声明和私有声明。

    • 注册声明:提供了一组预定义的声明,比如iss(issuer)、exp(expiration time)、sub(subject)、aud(audience)等。
    • 公共声明:可以随意定义,但为了避免冲突应遵循 IANA JSON Web Token Registry 的规定。
    • 私有声明:双方同意定义的声明,既不是注册声明也不是公共声明。

    示例 payload:

    json
    {
      "sub": "1234567890",
      "name": "John Doe",
      "admin": true
    }
  3. Signature:为了验证消息在传输过程中没有被更改,并且对于使用私钥签名的情况,还可以确保发送者就是声称的那个实体。签名是通过以下方式创建的:

    plaintext
    HMACSHA256(
      base64UrlEncode(header) + "." +
      base64UrlEncode(payload),
      secret)

使用场景

  • 认证:这是最常见的用途之一。一旦用户登录,后续每个请求都会包含 JWT,允许用户访问该令牌允许的服务和资源。
  • 信息交换:由于 JWT 可以被签名,例如使用公钥/私钥对,因此你可以确保发件人是他们所说的那个人。此外,由于签名是使用头和有效负载计算得出的,您还可以验证内容是否未被篡改。

JWT 的优点

  • 自包含性:所有必要的信息都在令牌内,减少了数据库查询的需求。
  • 跨域支持:非常适合单页应用程序(SPA)以及跨域资源共享(CORS)的问题。
  • 效率高:由于其紧凑的结构,JWT 非常适合在 HTTP 头部进行传输。

安全注意事项

尽管 JWT 提供了多种安全特性,但在实际应用中仍需注意:

  • 保护好密钥:如果使用的是对称加密,则必须严格保密密钥;如果是非对称加密,则需要妥善保管私钥。
  • 设置合理的过期时间:避免长期有效的令牌,减少令牌泄露的风险。
  • 不要在 JWT 中存储敏感信息:即使进行了加密处理,也尽量避免在 JWT 中直接存储敏感数据。

JWT 是一个强大的工具,可以帮助开发者构建更加安全和高效的 Web 服务。理解如何正确生成、验证和使用 JWT 对于开发高质量的应用程序至关重要。

Released under the MIT License.