JWT : JSON Web Token에서 살펴본 내용을 정리해보면
header : token에 대한 metadata
payload : 사용자에 관한 data (= claims)
signature : 중간에 값이 조작 되었는지 검증하기 위한 값
secret key : signature를 만드는 재료 중 하나로, 이 값을 모르는 이상 signature까지 조작할 수 없다!
크게 중요한 4가지의 개념은 위와 같이 나열해볼 수 있을 거 같다.
이번 POST에서는 JWT를 구현하기 위한 코드를 살펴볼까 한다. 그럼 바로 들어 가보자 👍
[ jwt.php ]
<?php
require __DIR__.'/../../vendor/autoload.php';
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
$key = 'codenamehan10hxx19'; //secret key
$payload = [
"exp" => time() + 15*60,
"iat" => time(),
"user" => "hanhxx",
"name" => "han10hxx19"
];
$jwt = JWT::encode($payload, $key, 'HS256');
echo $jwt."<br>";
$split_token = explode('.', $jwt);
foreach($split_token as $value) {
echo $value." => ".base64_decode($value)."<br>";
}
$decoded = JWT::decode($jwt, new Key($key, 'HS256'));
var_dump($decoded);
?>
Firebase\JWT\JWT를 사용하면 encode & decode 등
jwt를 다루는 과정에서 필요한 기능을 손쉽게 활용할 수 있다.
$key = 'codenamehan10hxx19'; //secret key
$payload = [
"exp" => time() + 15*60,
"iat" => time(),
"user" => "hanhxx",
"name" => "han10hxx19"
]
사용할 secret key와 payload를 작성한 다음, JWT의 encode 함수를 이용해 토큰을 생성한다.
$jwt = JWT::encode($payload, $key, 'HS256');
encode 함수에 payload, secret key, hash function algorithm을 넣어 실행하면
header는 따로 작성하지 않더라도
아래와 같이 기본적으로 header가 포함된다.
header {
"alg": "HS256",
"typ": "JWT"
}
encode 함수 결과를 출력해보면
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2OTk3NzE1NzAsImlhdCI6MTY5OTc3MDY3MCwidXNlciI6Imhhbmh4eCIsIm5hbWUiOiJoYW4xMGh4eDE5In0.qA9OOYZmwUuW5dVF6ZKJoHglseSoA6BJ35VG0sWuBHg
jwt.io에서 봤던 값과 유사한 형태의 토큰을 얻을 수 있다.
토큰이 어떻게 생겼나 궁금하니 dot을 기준으로 각 파트의 값을 출력해보자..!
$split_token = explode('.', $jwt);
foreach($split_token as $value) {
echo $value." => ".base64_decode($value)."<br>";
}
토큰 값과 base64 decode를 실행한 값을 같이 출력해보면
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9 => {"typ":"JWT","alg":"HS256"}
eyJleHAiOjE2OTk3NzE1NzAsImlhdCI6MTY5OTc3MDY3MCwidXNlciI6Imhhbmh4eCIsIm5hbWUiOiJoYW4xMGh4eDE5In0 => {"exp":1699771570,"iat":1699770670,"user":"hanhxx","name":"han10hxx19"}
qA9OOYZmwUuW5dVF6ZKJoHglseSoA6BJ35VG0sWuBHg => �N9�f�K���E钉�x%���IߕF�Ůx
dot으로 구분된 내용이 각각 header, payload, signature 값으로 구성되어 있음을 확인할 수 있다.
$decoded = JWT::decode($jwt, new Key($key, 'HS256'));
var_dump($decoded);
생성했던 토큰을 반대로 decode함수에 넣어보면
object(stdClass)#5 (4) { ["exp"]=> int(1699771570) ["iat"]=> int(1699770670) ["user"]=> string(6) "hanhxx" ["name"]=> string(10) "han10hxx19" }
기본적으로 payload 부분만 반환 된다.
이처럼 library를 사용하면 손쉽게 JWT를 만들어볼 수 있다!
그렇다면 다음으로.. JWT를 이용한 로그인 구현을 도전해보자..! 😎
Last updated