PHP 와 JWT (JSON Web Tokens)를 이용한 예제

프로그래밍/PHP|2021. 5. 17. 16:04
반응형

해당 예제는 CentOS 7 또는 8 에서 사용이 가능합니다.

관련 패키지와 환경 설정을 진행합니다.

 

1. Composer 설치

 

# yum -y update

# yum -y install php-cli php-zip wget unzip

# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

# HASH="$(wget -q -O - https://composer.github.io/installer.sig)" 

# php -r "if (hash_file('SHA384', 'composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

 

# php composer-setup.php --install-dir=/usr/local/bin --filename=composer

 

여기에서 아래와 같은 에러 메세지가 출력될 경우 패키지를 추가로 설치하고 진행하면 됩니다.

php 를 소스 컴파일 하신 경우 해당 옵션 (--disable-json) 을 제거하고 재컴파일 해야 합니다.

 

(에러)

Some settings on your machine make Composer unable to work properly.
Make sure that you fix the issues listed below and run this script again:

The json extension is missing.
Install it or recompile php without --disable-json

 

(해결)
# yum install php-json

 

composer 가 잘 설치되었는지 명령어로 확인해봅니다.

사용할 수 있는 옵션이 출력 될경우 정상 설치된 것입니다.

 

# composer

 

확인이 되었으면 설치 프로그램을 삭제 합니다.

 

# php -r "unlink('composer-setup.php');"

 

 

2. PHP-JWT 설치

 

composer require firebase/php-jwt

 

 

3. 테스트

 

# vi first.php

<?php
require_once './vendor/autoload.php';
use Firebase\JWT\JWT;
$secret_key = "this-is-the-secret";

// 데이터 입력
$id = "sysdocu";
$email = "sysdocu@sysdocu.tistory.com";
$addr = "seoul";
$phone = "010-1111-2222";
 
$data = array(
    'id' => $id,
    'email' => $email,
    'addr' => $addr,
    'phone' => $phone
);
 
$jwt = JWT::encode($data, $secret_key);
echo "encoded jwt: " . $jwt . "<br>";
 
//$decoded = JWT::decode($jwt, $secret_key, array('HS256'));
//print_r($decoded);
?>


생성한 php 파일을 웹브라우저로 불러오면 출력되는 결과는 아래와 같습니다.

encoded jwt 값을 자세히 보시면 hearderpayloadsignature 값 모두 출력되는 것을 볼 수 있습니다. (점으로 구분) 

 

encoded jwt: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6InN5c2RvY3UiLCJlbWFpbCI6InN5c2RvY3VAc3lzZG9jdS50aXN0b3J5LmNvbSIsImFkZHIiOiJzZW91bCIsInBob25lIjoiMDEwLTExMTEtMjIyMiJ9.xmYK1C0pnguCpC8qFUaJYYoLNnhkQ6kGiBxba_aM1gc

 

내용을 받을 php 를 만듭니다.

 

# vi second.php

 

<?php
require_once './vendor/autoload.php';
use Firebase\JWT\JWT;
$secret_key = "this-is-the-secret";

// URL 에서 jwt 인자값을 가져온다.
$jwt = isset($_GET['jwt']) ? $_GET['jwt'] : null;
if (isset($jwt)) {

    // validate jwt 로그인된 상태 
    try {
        $decoded = JWT::decode($jwt, $secret_key, array('HS256'));
        $decoded_array = (array)$decoded;
        $result = array(
            'code' => 200,
            'status' => 'success',
            'jwt_payload' => $decoded_array
        );
    } catch (\Exception $e) {
        $result = array(
            'code' => 0,
            'status' => 'error',
            'message' => $e->getMessage().' Invalid JWT - Authentication failed!'
        );
    }

} else {
    $result = array(
        'code' => 0,
        'status' => 'error',
        'message' => 'JWT parameter missing!'
    );
}
echo json_encode($result);
?>

 

그리고 브라우저에서 first.php 의 결과 코드를 활용해 second.php 로 접속해 봅니다.

 

http://{도메인}/second.php?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6InN5c2RvY3UiLCJlbWFpbCI6InN5c2RvY3VAc3lzZG9jdS50aXN0b3J5LmNvbSIsImFkZHIiOiJzZW91bCIsInBob25lIjoiMDEwLTExMTEtMjIyMiJ9.xmYK1C0pnguCpC8qFUaJYYoLNnhkQ6kGiBxba_aM1gc

 

 

[결과]

{"code":200,"status":"success","jwt_payload":{"id":"sysdocu","email":"sysdocu@sysdocu.tistory.com","addr":"seoul","phone":"010-1111-2222"}}

 

 

데이터가 잘 확인되었습니다.

필요에 따라 이 샘플 코드를 이용해 세션 파일을 만드는 등 추가 작업을 진행하면 됩니다.

 

 

상세 설명은 아래 URL 에서 확인 가능합니다.

[출처1 - 환경 설치 부분] https://phoenixnap.com/kb/how-to-install-and-use-php-composer-on-centos-7

[출처2 - 테스트 부분] https://trytoso.tistory.com/1024

https://heartgamer.wordpress.com/2015/08/26/json-web-tokenjwt%EB%A5%BC-node-js%EC%99%80-php%EC%97%90%EC%84%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0/

 

 

 

반응형

댓글()