JWT : Code

DATE : 2023/11/12

JWT : JSON Web Token에서 살펴본 내용을 정리해보면

  • header : token에 대한 metadata

  • payload : 사용자에 관한 data (= claims)

  • signature : 중간에 값이 조작 되었는지 검증하기 위한 값

  • secret key : signature를 만드는 재료 중 하나로, 이 값을 모르는 이상 signature까지 조작할 수 없다!

크게 중요한 4가지의 개념은 위와 같이 나열해볼 수 있을 거 같다.


[ 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를 만들어볼 수 있다!

Last updated