JWT的优势无状态、可扩展服务器不需要保存任何会话信息因为JWT包含了验证用户所需的所有信息这有利于扩展和维护。跨域认证由于JWT是基于Token的认证方式因此它很容易用于跨域认证非常适合微服务架构或分布式系统。安全性JWT可以通过数字签名来验证信息的发送者并确保信息在传输过程中没有被篡改。JWT的劣势Token长度问题由于JWT包含了用户的一些信息和签名所以它的长度可能会比传统的Session ID要长这可能会导致每次请求时传输更多的数据。一旦颁发无法撤销除非设置Token的过期时间否则在有效期内无法将其撤销。如果Token泄露攻击者可以在Token有效期内伪装成用户。存储敏感信息风险不建议在JWT中存储敏感信息因为JWT可以被解码。尽管有签名机制但存储敏感信息仍然是不安全的。JWT底层原理JWTJSON Web Token是一个开放标准RFC 7519它定义了一种紧凑的、自包含的方式用于在双方之间安全地传输信息作为JSON对象。这些信息可以被验证、信任因为它们是数字签名的。JWT主要由三部分组成Header头部、Payload负载和Signature签名。Header和Payload是JSON对象被Base64编码后拼接在一起然后使用指定的算法和一个密钥进行签名生成Signature。通俗解释可以把JWT想象成一张特殊的“身份证”。这张身份证上有你的姓名、照片和一些基本信息Payload并且这些信息被一个特殊的印章Signature盖过证明这些信息是真实的。这张身份证不需要保存在警察局或任何地方你只需要随身携带它。当你需要证明身份时比如进入某个场所你只需出示这张身份证即可。场所的工作人员可以通过查看你的身份证和上面的印章来确认你的身份。PHP实例代码以下是一个简单的PHP示例展示如何生成和验证JWT?php require_once vendor/autoload.php; // 引入JWT库例如使用firebase/php-jwt use \Firebase\JWT\JWT; $key your_secret_key; // 用于签名和验证JWT的密钥 // 生成JWT $payload array( user_id 123, username JohnDoe ); $jwt JWT::encode($payload, $key); echo JWT: . $jwt . \n; // 验证JWT try { $decoded JWT::decode($jwt, $key, array(HS256)); echo 验证成功用户ID: . $decoded-user_id . , 用户名: . $decoded-username; } catch (Exception $e) { echo JWT验证失败: . $e-getMessage(); } ?在这个示例中我们首先引入了一个JWT库这里以firebase/php-jwt为例。然后我们使用一个密钥来生成JWT其中包含了用户ID和用户名。最后我们尝试使用相同的密钥来解码和验证JWT。如果JWT是有效的我们可以访问其中的负载信息如果无效将会抛出一个异常。