웹 애플리케이션을 개발하면서 보안은 항상 중요한 요소 중 하나입니다. 특히 사용자 인증과 관련된 부분은 더욱 심도 있게 다루어야 합니다. 이번 포스팅에서는 PHP에서 JWT(JSON Web Token) 인증을 구현하는 방법에 대해 살펴보겠습니다. JWT는 클라이언트-서버 간의 정보 전송을 안전하게 할 수 있는 방법으로 널리 사용되고 있습니다.
JWT란?
JWT는 JSON 객체를 사용하여 정보를 안전하게 전송할 수 있는 방법입니다. JWT는 세 부분으로 구성됩니다: 헤더(header), 페이로드(payload), 서명(signature). 이 구조 덕분에 JWT는 자체적으로 인증 정보를 내포할 수 있어, 서버가 추가적인 세션 상태를 유지할 필요가 없습니다.
- 헤더: 토큰의 타입과 해싱 알고리즘을 정의합니다.
- 페이로드: 인증 정보 및 추가적인 사용자 데이터를 담고 있습니다.
- 서명: 헤더와 페이로드를 바탕으로 비밀키를 사용해 생성됩니다.
PHP에서 JWT 구현하기
PHP에서 JWT를 구현하기 위해 firebase/php-jwt 라이브러리를 사용할 것입니다. 이 라이브러리는 JWT를 생성하고 검증하는 데 필요한 기능을 제공해줍니다.
1. Composer로 라이브러리 설치하기
먼저, Composer를 사용하여 라이브러리를 설치합니다.
composer require firebase/php-jwt
2. JWT 생성하기
JWT를 생성하기 위해서는 먼저 사용자 인증 정보를 바탕으로 토큰을 만들어야 합니다. 아래는 JWT를 생성하는 간단한 예제입니다.
use \Firebase\JWT\JWT;
function generateJwt($userId) {
$key = "your_secret_key"; // 비밀키
$payload = [
'iat' => time(), // 토큰 발행 시간
'exp' => time() + (60 * 60), // 만료 시간 (1시간)
'sub' => $userId // 사용자 ID
];
return JWT::encode($payload, $key);
}
위의 generateJwt 함수는 사용자 ID를 입력으로 받아 JWT를 생성합니다. 발행 시간(iat)과 만료 시간(exp)도 함께 설정해 주어야 합니다.
3. JWT 인증하기
이제 클라이언트에서 받은 JWT를 검증하는 방법을 살펴보겠습니다. 아래는 JWT를 검증하는 예제입니다.
function validateJwt($jwt) {
$key = "your_secret_key"; // 비밀키
try {
$decoded = JWT::decode($jwt, $key, ['HS256']);
return $decoded; // 성공적으로 검증된 경우 디코딩된 정보를 반환
} catch (Exception $e) {
return null; // 검증 실패시 null 반환
}
}
validateJwt 함수는 클라이언트가 보낸 JWT를 검증하고, 유효하다면 디코딩된 정보를 반환합니다. 예외 처리를 통해 검증 실패 시 null을 반환하도록 하고 있습니다.
4. 실제 사용 예시
이제 위에서 작성한 함수를 바탕으로 실제로 JWT를 생성하고 검증하는 간단한 웹 애플리케이션의 플로우를 만들어 보겠습니다.
// 사용자 인증 후 JWT 생성
if ($userIsAuthenticated) {
$jwt = generateJwt($userId);
echo json_encode(['token' => $jwt]);
}
// JWT 검증
$headers = apache_request_headers();
if (isset($headers['Authorization'])) {
$jwt = str_replace('Bearer ', '', $headers['Authorization']);
$decoded = validateJwt($jwt);
if ($decoded) {
// 인증 성공
echo "User ID: " . $decoded->sub;
} else {
// 인증 실패
echo "Unauthorized";
}
}
위의 코드는 사용자가 성공적으로 인증된 후 JWT를 생성하여 클라이언트에 전달하고, 클라이언트는 이후 요청 시 Authorization 헤더에 JWT를 포함하여 서버에 요청을 보냅니다. 서버는 이 토큰을 검증하여 인증된 사용자에게만 접근을 허용하는 구조입니다.
마무리
JWT는 사용자 인증을 안전하게 관리할 수 있는 강력한 방법입니다. PHP에서 JWT를 사용하는 것은 비교적 간단하며, firebase/php-jwt 라이브러리를 통해 쉽게 구현할 수 있습니다. 이번 포스팅을 통해 JWT의 기본 개념과 함께 PHP에서 JWT 인증을 구현하는 과정을 살펴보았습니다. 보안을 강화하고 보다 안전한 웹 애플리케이션을 개발하는 데 도움이 되길 바랍니다.