使用 JWT(JSON Web Token) Blacklist 实现 PHP 安全验证

1. 引言

在当今的互联网环境下,保护用户数据的安全是至关重要的。随着越来越多的应用程序和服务使用Web API进行通信,身份验证和授权变得尤为重要。一种常见的身份验证方法是使用JSON Web Token(JWT)。

JWT是一种用于表示、传输和验证声明的开放标准(RFC 7519)。它使用JSON对象作为令牌的格式,可以通过签名(使用HMAC算法)或使用公钥/私钥对来验证其真实性和完整性。

2. JWT基本原理

2.1 令牌的结构

一个JWT由三个部分组成,头部(Header)、载荷(Payload)和签名(Signature)。

头部包含关于令牌的元数据和加密算法的信息。载荷是JWT的主体部分,包含有关用户或实体的声明,例如用户名、角色等。签名是对头部和载荷进行签名以验证其来源和完整性的部分。

// JWT的结构示例

$jwt = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c';

2.2 令牌的验证和传递

JWT的验证非常方便,因为令牌本身包含了所有必要的信息。服务端只需解析JWT,并根据头部中的算法和密钥对载荷进行验证即可。

JWT可以通过HTTP请求的头部、查询参数或表单数据进行传递。常用的传递方式是放在HTTP请求的头部的Authorization字段中,值为"Bearer {JWT}"。

3. JWT黑名单实现

3.1 为什么需要JWT黑名单?

尽管JWT有许多优点,但缺点之一是无法在令牌被签发后主动无效化。一旦签发,令牌将一直有效,直到过期或手动注销。

为了解决这个问题,可以使用JWT黑名单的方法来实现令牌的主动无效化。当用户注销或需要强制用户下线时,将令牌添加到黑名单中,以后的请求将不再接受这个令牌。

3.2 JWT黑名单实现的基本思路

基本思路是在服务端使用缓存、数据库或其他持久化存储来记录已经注销的令牌。当请求到达服务端时,先校验令牌的签名和有效期,然后检查令牌是否存在于黑名单中。

为了提高效率,可以使用Redis等内存数据库来存储令牌的黑名单。每次校验令牌时,先从内存数据库中查询,如果存在则表示令牌已被注销。

3.3 PHP中JWT黑名单的实现示例

下面是一个使用JWT黑名单实现安全验证的示例代码:

// 创建JWT,并添加到黑名单

function createJWT($userId) {

// 创建JWT的代码...

$jwt = '生成的JWT';

// 将JWT添加到黑名单

addToBlacklist($jwt);

}

// 验证JWT

function validateJWT($jwt) {

// 验证JWT的代码...

$isValid = validate($jwt);

// 检查JWT是否在黑名单中

if (isInBlacklist($jwt)) {

$isValid = false;

}

return $isValid;

}

// 将JWT添加到黑名单

function addToBlacklist($jwt) {

// 将JWT存储到缓存或数据库中

// 标记JWT为无效状态

}

// 检查JWT是否在黑名单中

function isInBlacklist($jwt) {

// 从缓存或数据库中查询JWT

// 如果存在则表示JWT已被注销

}

使用上述代码,可以在创建JWT时将其添加到黑名单,然后在验证JWT时检查其是否在黑名单中。这样可以有效地实现JWT的主动无效化。

4. 结论

使用JWT黑名单可以增强JWT的安全性,让服务端有能力主动注销令牌。通过将已注销的令牌添加到黑名单中,可以有效防止令牌被滥用。在实际应用中,可以根据具体的需求和情况选择合适的黑名单存储方式,如缓存、数据库、内存数据库等。

JWT作为一种轻量级的身份验证和授权方案,在当今的Web应用程序中被广泛使用。使用JWT黑名单可以增加令牌的安全性,提供更好的用户保护和控制。

参考资料

1. RFC 7519 - JSON Web Token (JWT): https://tools.ietf.org/html/rfc7519

2. JWT黑名单实现: https://codereviewvideos.com/course/beginners-guide-back-end-json-web-tokens-jwt/video/forgetting-and-blacklisting-tokens

后端开发标签