개발 지식

개발 지식

PHP PHP에서 JWT 토큰 직접 구현하기 (라이브러리 없이)

페이지 정보

profile_image
영삼이
0건 176회 25-03-28 23:11

본문

✅ PHP에서 JWT 토큰 직접 구현하기 (라이브러리 없이)

**JWT(JSON Web Token)**는 사용자 인증 및 권한 확인에 자주 사용되는 토큰 기반 인증 방식입니다. PHP에서는 firebase/php-jwt 같은 라이브러리를 많이 쓰지만, 내부 구조를 이해하고 싶다면 직접 만들어보는 것이 좋습니다. 이 글에서는 라이브러리 없이 순수 PHP로 JWT 토큰을 생성하고 검증하는 과정을 소개합니다.


🧱 JWT 구조

header.payload.signature

각 파트는 Base64URL로 인코딩되며:

  1. Header: 알고리즘, 타입 정보

  2. Payload: 사용자 정보, 만료 시간 등

  3. Signature: 비밀키로 서명


🔧 Base64URL 인코딩/디코딩 함수

[code=php]
function base64url_encode(string $data): string {
    return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
}

function base64url_decode(string $data): string {
    return base64_decode(strtr($data, '-_', '+/'));
}
[/code]

🚀 JWT 생성 함수

[code=php]
function create_jwt(array $payload, string $secret): string {
    $header = ['alg' => 'HS256', 'typ' => 'JWT'];
    $header_encoded = base64url_encode(json_encode($header));
    $payload_encoded = base64url_encode(json_encode($payload));

    $signature = hash_hmac('sha256', "$header_encoded.$payload_encoded", $secret, true);
    $signature_encoded = base64url_encode($signature);

    return "$header_encoded.$payload_encoded.$signature_encoded";
}
[/code]

🔍 JWT 검증 함수

[code=php]
function verify_jwt(string $jwt, string $secret): ?array {
    [$header_b64, $payload_b64, $signature_b64] = explode('.', $jwt);

    $signature_check = base64url_encode(
        hash_hmac('sha256', "$header_b64.$payload_b64", $secret, true)
    );

    if (!hash_equals($signature_check, $signature_b64)) {
        return null; // 위조된 토큰
    }

    $payload = json_decode(base64url_decode($payload_b64), true);

    if (isset($payload['exp']) && time() >= $payload['exp']) {
        return null; // 만료된 토큰
    }

    return $payload;
}
[/code]

✅ 사용 예시

[code=php]
$secret = 'my-secret-key';

$token = create_jwt([
    'user_id' => 123,
    'role' => 'admin',
    'exp' => time() + 3600
], $secret);

echo "JWT: " . $token . PHP_EOL;

$data = verify_jwt($token, $secret);

if ($data) {
    echo "인증 성공: 사용자 ID = " . $data['user_id'];
} else {
    echo "JWT 유효하지 않음";
}
[/code]

⚠️ 보안 주의사항

  • HS256 외에 RS256 같은 공개키 기반 알고리즘도 있음

  • exp, iat, nbf 필드로 토큰 유효성 관리 권장

  • HTTPS에서만 사용 (중간 탈취 방지)

  • 토큰 저장 위치(Cookie vs. LocalStorage) 신중히 결정


🧠 요약

  • JWT는 Base64URL + HMAC 기반의 서명 토큰

  • PHP로 직접 구현 가능하며 내부 원리 이해에 유익

  • 실 서비스에서는 검증된 라이브러리 사용 권장


댓글목록

등록된 댓글이 없습니다.