PHP的JWT是干什么的?底层原理是什么?

JWT(JSON Web Token)是一种用于安全地在各方之间传输信息的开放标准(RFC 7519),通常用于在网络应用间安全地传递声明。其主要用途包括身份验证(Authentication)和声明传递(Assertion)。以下是关于JWT的详细说明:

功能和用途:

JWT 可以在用户和服务器之间安全传输信息,允许通过声明(claim)方式传递认证信息和其他声明数据,这些声明是经过数字签名或加密的。常见的使用场景包括单点登录(SSO)、安全的API交互等。

结构:

JWT 由三部分组成,使用点号.分隔:

  1. Header(头部):通常包含两部分信息:令牌的类型(typ)和所使用的签名算法(alg)。

    json
    { "alg": "HS256", "typ": "JWT" }

    Header 会经过 Base64 编码形成 JWT 的第一部分。

  2. Payload(负载):包含称为声明的数据。声明分为三种类型:

    • Registered claims:预定义的声明,如 iss(Issuer)、exp(Expiration Time)、sub(Subject)等。
    • Public claims:自定义声明,不建议重复已有的声明。
    • Private claims:自定义声明,用于在合同中共享信息。

Payload 也会通过 Base64 编码成 JWT 的第二部分。

  1. Signature(签名):使用指定的算法(如 HMAC SHA256 或 RSA)对 Header 和 Payload 进行签名,确保数据在传输过程中没有被篡改。签名的生成依赖于 Header 中指定的算法、密钥和待签名数据。

工作原理:

  1. 创建 JWT

    • 创建 Header(指定算法和类型)和 Payload(包含要传输的声明数据)。
    • 使用 Header 中指定的算法和密钥对 Header 和 Payload 进行签名,生成签名。
    • 将编码后的 Header、Payload 和 Signature 三部分以点号分隔连接起来,形成 JWT。
  2. 验证和解析 JWT

    • 接收到 JWT 后,通过分割 JWT 可以得到 Header、Payload 和 Signature。
    • 使用相同的算法、密钥对 Header 和 Payload 进行签名,得到计算出的 Signature。
    • 比较计算出的 Signature 和 JWT 中的 Signature 是否一致,以验证 JWT 是否有效和未被篡改。
    • 解析 Payload 中的声明数据,获取其中的信息用于业务逻辑。

应用注意事项:

  • 安全性:选择合适的算法和密钥长度,确保签名的安全性和不可伪造性。
  • 传输方式:尽量通过安全的传输协议(如 HTTPS)传输 JWT,防止被中间人攻击截取或篡改。
  • 有效期管理:通过声明中的 exp(Expiration Time)声明来管理 JWT 的有效期,及时刷新或重新生成 JWT。

JWT 的设计使得它成为一个灵活和安全的身份验证和声明传递解决方案,在现代的分布式应用程序中得到了广泛应用。