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

영삼이
본문
✅ PHP에서 JWT 토큰 직접 구현하기 (라이브러리 없이)
**JWT(JSON Web Token)**는 사용자 인증 및 권한 확인에 자주 사용되는 토큰 기반 인증 방식입니다. PHP에서는 firebase/php-jwt
같은 라이브러리를 많이 쓰지만, 내부 구조를 이해하고 싶다면 직접 만들어보는 것이 좋습니다. 이 글에서는 라이브러리 없이 순수 PHP로 JWT 토큰을 생성하고 검증하는 과정을 소개합니다.
🧱 JWT 구조
header.payload.signature
각 파트는 Base64URL로 인코딩되며:
-
Header: 알고리즘, 타입 정보
-
Payload: 사용자 정보, 만료 시간 등
-
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로 직접 구현 가능하며 내부 원리 이해에 유익
-
실 서비스에서는 검증된 라이브러리 사용 권장
- 이전글Laravel 없이 PSR-15 미들웨어 구현하기 25.03.28
- 다음글PHP에서 리플렉션(Reflection)의 고급 활용법 25.03.28
댓글목록
등록된 댓글이 없습니다.