JWT 구현하기 > php

본문 바로가기
사이트 내 전체검색

php

JWT 구현하기

페이지 정보

작성자 서방님 댓글 0건 조회 71회 작성일 22-07-08 13:27

본문

이제 JWT를 만들고 해석하는 함수를 지닌 JWT클래스를 구현해보겠습니다.

class JWT
{
    protected $alg;
    protected $secret_key;

//    생성자
    function __construct()
    {
        //사용할 알고리즘
        $this->alg = 'sha256';

        // 비밀 키
        $this->secret_key = "your secret key";
    }

//    jwt 발급하기
    function hashing(array $data): string
    {
        // 헤더 - 사용할 알고리즘과 타입 명시
        $header = json_encode(array(
            'alg' => $this->alg,
            'typ' => 'JWT'
        ));

        // 페이로드 - 전달할 데이터
        $payload = json_encode($data);

        // 시그니처
        $signature = hash($this->alg, $header . $payload . $this->secret_key);

        return base64_encode($header . '.' . $payload . '.' . $signature);
    }

//    jwt 해석하기
    function dehashing($token)
    {
        // 구분자 . 로 토큰 나누기
        $parted = explode('.', base64_decode($token));

        $signature = $parted[2];

        // 토큰 만들 때처럼 시그니처 생성 후 비교
        if (hash($this->alg, $parted[0] . $parted[1] . $this->secret_key) != $signature) {
            return "시그니쳐 오류";
        }

        // 만료 검사
        $payload = json_decode($parted[1], true);
        if ($payload['exp'] < time()) { // 유효시간이 현재 시간보다 전이면
            return "만료 오류";
        }

        /*
         *
         * 기타 토큰 확인 작업
         *
         */

        return json_decode($parted[1], true);
    }
}

 

구현에 사용한 코드는 스틱코드에서 확인하실 수 있습니다.

[PHP] JWT 구현하기 - Stickode

 

 

 

위 클래스를 이용해 JWT를 만들어보겠습니다.

$jwt = new JWT();

$email = "simple@mail.com";
$email = base64_encode($email); // .이 들어가도 JWT가 분리되지 않기 위한 base64 인코딩

$password = "password..1234";
$password = base64_encode($password); // .이 들어가도 JWT가 분리되지 않기 위한 base64 인코딩


// 유저 정보를 가진 jwt 만들기
$token = $jwt->hashing(array(
    'exp' => time() + (360 * 30), // 만료기간
    'iat' => time(), // 생성일
    'id' => 10,
    'email' => $email,
    'password' => $password
));

var_dump($token);


/*
* 
* (출력 결과)
* eyJhbGciOiJzaGEyNTYiLCJ0eXAiOiJKV1QifS57ImV4cCI6MTYyMTg1MjIxMiwiaWF0Ijox
* NjIxODQxNDEyLCJpZCI6MTAsImVtYWlsIjoiYzJsdGNHeGxRRzFoYVd3dVkyOXQiLCJwYXNz
* d29yZCI6ImNHRnpjM2R2Y21RdUxqRXlNelE9In0uZTg1YmMxY2JjNWYwNmEzZTk5NjAyZTdh
* YWY3ZTEwMmQ5YWQ0YzgxN2Y5ODk3MGM0M2FhZDc3YWMwYTFiYzQ0MA==
*
*/

 

 

결과로 eyJhbGciOiJzaGEyNTYiLCJ0eXAiOiJKV1QifS57ImV4cCI6MTYyMTg1MjIxMiwiaWF0IjoxNjIxODQxNDEyLCJpZCI6MTAsImVtYWlsIjoiYzJsdGNHeGxRRzFoYVd3dVkyOXQiLCJwYXNzd29yZCI6ImNHRnpjM2R2Y21RdUxqRXlNelE9In0uZTg1YmMxY2JjNWYwNmEzZTk5NjAyZTdhYWY3ZTEwMmQ5YWQ0YzgxN2Y5ODk3MGM0M2FhZDc3YWMwYTFiYzQ0MA== 라는 JWT를 얻게 됩니다.

 

 

 

이번엔 JWT를 분석해 담고 있는 정보를 얻어보겠습니다.

// jwt에서 유저 정보 가져오기
$data = $jwt->dehashing($token);

$parted = explode('.', base64_decode($token));

$payload = json_decode($parted[1], true);

var_dump($payload);

echo "<br/><br/>";
echo "email: " . base64_decode($payload['email']);
echo "<br/><br/>";
echo "password: " . base64_decode($payload['password']);


/*
*
* (출력 결과)
* array(5) { ["exp"]=> int(1621852212) ["iat"]=> int(1621841412) ["id"]=> int(10) 
*            ["email"]=> string(20) "c2ltcGxlQG1haWwuY29t"
*            ["password"]=> string(20) "cGFzc3dvcmQuLjEyMzQ=" }
* 
* email: simple@mail.com
*
* password: password..1234
*
*/

 

이렇게 payload 부분의 정보를 가져올 수 있습니다.

댓글목록

등록된 댓글이 없습니다.

회원로그인

접속자집계

오늘
4
어제
58
최대
1,347
전체
153,768
Latest Crypto Fear & Greed Index

그누보드5
Copyright © 서방님.kr All rights reserved.