
JWT和Session认证方式的不同JWTJSON Web Token和Session是两种常见的用户认证方式它们有一些关键的不同点存储位置Session用户登录后服务器会在自己的存储如内存、数据库或文件系统中创建一个Session对象并将与之关联的Session ID发送到客户端通常是通过Cookie。客户端之后的每次请求都会带上这个Session ID服务器会用这个ID查找对应的Session数据来验证用户身份。JWT用户登录后服务器会生成一个包含用户信息和签名的JWT并将其发送给客户端。客户端之后的每次请求都会将这个JWT放在请求头中发送给服务器服务器会验证JWT的签名和内容来确认用户身份。状态存储Session是服务器端的状态存储机制服务器需要维护Session的状态。JWT是无状态的服务器不需要存储任何关于用户会话的信息所有的信息都包含在JWT中。可扩展性和跨域Session不易于跨多个服务器或多个应用共享除非使用如Redis等共享存储解决方案。JWT因为JWT是自包含的它很容易在分布式系统中使用也适用于跨域认证。安全性Session如果Session ID被盗用攻击者可以伪装成合法用户。另外如果服务器端的Session数据被篡改可能导致安全问题。JWTJWT的签名机制可以确保其完整性和发送者的身份但如果JWT被盗用或泄露攻击者同样可以伪装成合法用户直到JWT过期。底层原理Session底层原理当用户登录时服务器会创建一个唯一的Session ID并将其与用户信息关联存储在服务器上。同时服务器会将这个Session ID发送给客户端通常保存在浏览器的Cookie中。每当客户端发送请求时都会自动附带这个Cookie服务器通过查找对应的Session ID来验证用户身份。JWT底层原理JWT是由服务器在用户登录后根据用户信息和服务器端的密钥生成的一个令牌。这个令牌包含三部分头部、负载和签名。头部和负载是JSON对象被Base64编码后拼接在一起并使用服务器的密钥进行签名。客户端在之后的每次请求中都会将这个JWT放在HTTP请求的头部发送给服务器。服务器会验证JWT的签名和内容以此来确认用户的身份。通俗解释可以把Session想象成你去游乐园玩进门时工作人员给你一个手环这个手环就是你的“身份证”你可以用它来玩各种项目但手环的信息是游乐园记录的。而JWT则像是你自己带的一个小本本上面写着你的名字和游乐园的章你可以用这个小本本去玩各种项目游乐园的工作人员会检查你的小本本上的信息和章来确认你的身份。PHP实例代码Session认证方式的PHP示例?php // 启动Session session_start(); // 假设用户登录成功设置Session变量 $_SESSION[user_id] 123; $_SESSION[username] Alice; // 检查用户是否已登录 if (isset($_SESSION[user_id])) { echo 已登录用户ID: . $_SESSION[user_id]; } else { echo 用户未登录; } ?JWT认证方式的PHP示例使用firebase/php-jwt库?php require_once vendor/autoload.php; // 引入JWT库 use \Firebase\JWT\JWT; $key your_secret_key; // 密钥用于签名和验证JWT // 用户登录成功后生成JWT $payload array( user_id 123, username Alice ); $jwt JWT::encode($payload, $key); echo JWT Token: . $jwt . \n; // 验证JWT通常在每次请求时执行 try { $decoded JWT::decode($jwt, $key, array(HS256)); echo 已验证用户ID . $decoded-user_id . , Username . $decoded-username; } catch (Exception $e) { echo JWT验证失败: . $e-getMessage(); } ?在这个JWT示例中我们首先引入了JWT库并设置了用于签名和验证JWT的密钥。在用户登录成功后我们生成了一个包含用户信息的JWT。然后在每次客户端请求时我们都会尝试解码和验证这个JWT来确认用户的身份。如果JWT无效或已过期解码过程将抛出异常。