公司动态

JWT的“exp”声明有什么作用?底层原理是什么?

📅 2026/8/28 13:37:51
JWT的“exp”声明有什么作用?底层原理是什么?
JWT的“exp”声明用于指定JWT的过期时间。这个声明告诉接收者在什么时间之后这个JWT就不应该再被接受了因为它已经“过期”了。这是一个重要的安全特性因为它可以防止旧的或者被盗用的JWT被无限期地使用。想象一下你去电影院看电影你的电影票上有一个时间告诉你这个电影票在什么时间之前可以使用。过了这个时间电影票就无效了你不能再用它来进场看电影了。JWT的“exp”声明就像是这个电影票上的时间它告诉计算机系统这个JWT在什么时间之后就不能再被使用了。底层原理“exp”声明是一个Unix时间戳表示JWT的过期时间。Unix时间戳是从1970年1月1日UTC开始计算的秒数。当接收者收到一个JWT时它会检查“exp”声明的值。如果当前时间超过了“exp”声明的值那么接收者就会拒绝这个JWT因为它已经过期了。PHP实例代码下面是一个使用PHP的JWT库来生成一个包含“exp”声明的JWT的示例代码?php require vendor/autoload.php; // 引入JWT库确保已经通过Composer安装了firebase/php-jwt库 use \Firebase\JWT\JWT; $key your_secret_key; // 密钥用于签名和验证JWT // 生成JWT的Payload部分并设置exp声明 $payload array( sub user123, // 用户ID或其他标识 exp time() 3600 // 设置JWT的过期时间为1小时后 ); // 使用密钥对Payload进行签名生成JWT $jwt JWT::encode($payload, $key); echo 生成的JWT: . $jwt . \n; // 模拟验证过程检查JWT是否过期 $decoded JWT::decode($jwt, $key, array(HS256)); // 这里会抛出异常如果JWT已过期 echo JWT验证成功Payload数据\n; print_r($decoded); ?在这个示例中我们首先创建了一个包含“sub”和“exp”声明的Payload。其中“exp”被设置为当前时间加上3600秒1小时意味着这个JWT将在1小时后过期。然后我们使用JWT库对这个Payload进行签名生成了一个JWT。最后我们模拟了JWT的验证过程。如果JWT没有过期JWT::decode方法会成功解码JWT并返回Payload数据。如果JWT已经过期这个方法会抛出一个异常。请注意为了运行此代码你需要先安装JWT库你可以通过Composer来安装composer require firebase/php-jwt。在实际应用中你应该在try-catch块中调用JWT::decode方法来处理可能的异常比如JWT过期、签名无效等情况。这样你可以优雅地处理这些错误情况而不是让整个应用崩溃。