PHP的JWT是干什么的?底层原理是什么?
JWT(JSON Web Token)是一种用于安全地在各方之间传输信息的开放标准(RFC 7519),通常用于在网络应用间安全地传递声明。其主要用途包括身份验证(Authentication)和声明传递(Assertion)。以下是关于JWT的详细说明:
功能和用途:
JWT 可以在用户和服务器之间安全传输信息,允许通过声明(claim)方式传递认证信息和其他声明数据,这些声明是经过数字签名或加密的。常见的使用场景包括单点登录(SSO)、安全的API交互等。
结构:
JWT 由三部分组成,使用点号.
分隔:
Header(头部):通常包含两部分信息:令牌的类型(typ)和所使用的签名算法(alg)。
json{ "alg": "HS256", "typ": "JWT" }
Header 会经过 Base64 编码形成 JWT 的第一部分。
Payload(负载):包含称为声明的数据。声明分为三种类型:
- Registered claims:预定义的声明,如
iss
(Issuer)、exp
(Expiration Time)、sub
(Subject)等。 - Public claims:自定义声明,不建议重复已有的声明。
- Private claims:自定义声明,用于在合同中共享信息。
- Registered claims:预定义的声明,如
Payload 也会通过 Base64 编码成 JWT 的第二部分。
- Signature(签名):使用指定的算法(如 HMAC SHA256 或 RSA)对 Header 和 Payload 进行签名,确保数据在传输过程中没有被篡改。签名的生成依赖于 Header 中指定的算法、密钥和待签名数据。
工作原理:
创建 JWT:
- 创建 Header(指定算法和类型)和 Payload(包含要传输的声明数据)。
- 使用 Header 中指定的算法和密钥对 Header 和 Payload 进行签名,生成签名。
- 将编码后的 Header、Payload 和 Signature 三部分以点号分隔连接起来,形成 JWT。
验证和解析 JWT:
- 接收到 JWT 后,通过分割 JWT 可以得到 Header、Payload 和 Signature。
- 使用相同的算法、密钥对 Header 和 Payload 进行签名,得到计算出的 Signature。
- 比较计算出的 Signature 和 JWT 中的 Signature 是否一致,以验证 JWT 是否有效和未被篡改。
- 解析 Payload 中的声明数据,获取其中的信息用于业务逻辑。
应用注意事项:
- 安全性:选择合适的算法和密钥长度,确保签名的安全性和不可伪造性。
- 传输方式:尽量通过安全的传输协议(如 HTTPS)传输 JWT,防止被中间人攻击截取或篡改。
- 有效期管理:通过声明中的
exp
(Expiration Time)声明来管理 JWT 的有效期,及时刷新或重新生成 JWT。
JWT 的设计使得它成为一个灵活和安全的身份验证和声明传递解决方案,在现代的分布式应用程序中得到了广泛应用。