>  기사  >  백엔드 개발  > 

WBOY
WBOY원래의
2023-07-24 19:21:311624검색

JWT(JSON 웹 토큰) 블랙리스트를 사용하여 PHP 보안 검증 구현

인터넷이 발전하면서 웹 애플리케이션의 보안이 더욱 중요해졌습니다. PHP 애플리케이션에 대한 보안 검증을 구현할 때 JWT(JSON Web Token)를 보안 검증 솔루션으로 사용할 수 있습니다. JWT의 보안을 강화하기 위해 블랙리스트를 사용하여 만료된 토큰을 관리할 수 있습니다.

JWT는 인증 및 승인을 위한 개방형 표준(RFC 7519)입니다. 헤더, 페이로드, 서명의 세 부분으로 구성됩니다. Header에는 알고리즘과 Token 유형 정보가 포함되고, Payload에는 사용자 데이터 정보가 포함되며, Signature는 Header, Payload 및 Secret Key 서명을 기반으로 생성됩니다.

JWT를 이용한 인증 과정은 다음과 같습니다.

  1. 사용자는 사용자 이름과 비밀번호를 사용하여 로그인합니다.
  2. 서버는 사용자의 사용자 이름과 비밀번호를 확인하고 JWT를 생성합니다.
  3. 서버는 JWT를 클라이언트에 보냅니다.
  4. 클라이언트는 JWT를 쿠키 또는 로컬 저장소에 저장합니다.
  5. 클라이언트가 요청을 보내면 요청 헤더에 JWT를 가져옵니다.
  6. 서버는 요청을 받은 후 JWT의 유효성을 확인합니다. 확인이 통과되면 계속해서 요청을 처리합니다.

그러나 JWT가 오랫동안 유효한 경우 토큰이 유출되면 공격자는 항상 토큰을 사용하여 불법적인 작업을 수행할 수 있습니다. 이 문제를 해결하기 위해 블랙리스트를 사용하여 만료된 토큰을 관리할 수 있습니다. 사용자가 로그아웃하거나 비밀번호를 변경하면 해당 토큰이 블랙리스트에 추가됩니다.

다음은 JWT 블랙리스트를 사용하여 PHP 보안 검증을 구현하는 코드 예제입니다.

// 定义 JWT 的 Secret Key
$secretKey = "your_secret_key";

// 生成 JWT
function generateJWT($userId) {
    global $secretKey;

    $header = json_encode(['typ' => 'JWT', 'alg' => 'HS256']);
    $payload = json_encode(['userId' => $userId]);

    $base64UrlHeader = base64UrlEncode($header);
    $base64UrlPayload = base64UrlEncode($payload);

    $signature = hash_hmac('sha256', $base64UrlHeader . "." . $base64UrlPayload, $secretKey, true);
    $base64UrlSignature = base64UrlEncode($signature);

    return $base64UrlHeader . "." . $base64UrlPayload . "." . $base64UrlSignature;
}

// 验证 JWT 是否有效
function validateJWT($jwt) {
    global $secretKey;

    list($base64UrlHeader, $base64UrlPayload, $base64UrlSignature) = explode('.', $jwt);

    $signature = base64UrlDecode($base64UrlSignature);
    $expectedSignature = hash_hmac('sha256', $base64UrlHeader . "." . $base64UrlPayload, $secretKey, true);

    if ($signature !== $expectedSignature) {
        return false;
    }

    $payload = json_decode(base64UrlDecode($base64UrlPayload), true);

    // 在 Blacklist 中查找当前 Token 是否存在
    if (isTokenBlacklisted($jwt)) {
        return false;
    }

    return $payload['userId'];
}

// 将字符串进行 Base64Url 编码
function base64UrlEncode($data) {
    $base64 = base64_encode($data);
    if ($base64 === false) {
        return false;
    }

    // 替换特殊字符
    $base64Url = strtr($base64, '+/', '-_');

    // 删除 = 字符
    $base64Url = rtrim($base64Url, '=');

    return $base64Url;
}

// 将 Base64Url 编码的字符串解码
function base64UrlDecode($base64Url) {
    // 添加 = 字符
    $base64 = str_pad(strtr($base64Url, '-_', '+/'), strlen($base64Url) % 4, '=', STR_PAD_RIGHT);

    return base64_decode($base64);
}

// 将 Token 加入 Blacklist
function blacklistToken($jwt) {
    // 在数据库或缓存中将 Token 标记为失效
}

// 判断 Token 是否在 Blacklist 中
function isTokenBlacklisted($jwt) {
    // 在数据库或缓存中查询 Token 是否存在
}

위 코드 예제를 사용하면 PHP 애플리케이션에서 JWT 보안 검증 및 블랙리스트 관리를 쉽게 구현할 수 있습니다. JWT와 블랙리스트를 사용하면 인증 보안을 강화하고 웹 애플리케이션 보호를 강화할 수 있습니다.

요약:
이 글에서는 JWT와 블랙리스트를 활용하여 PHP 보안 검증을 구현하는 방법을 소개합니다. JWT를 통해 사용자 정보를 안전하게 전송할 수 있으며, 만료된 토큰을 블랙리스트로 관리하여 인증 보안을 강화할 수 있습니다. 실제 개발에서는 특정 시나리오의 보안 요구 사항을 충족하기 위해 실제 요구 사항에 따라 코드를 최적화하고 확장할 수 있습니다.

참조 링크:
[1] JSON 웹 토큰(JWT) - https://jwt.io/
[2] RFC 7519 - https://tools.ietf.org/html/rfc7519

위 내용은 의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:다음 기사: