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);
}
}
구현에 사용한 코드는 스틱코드에서 확인하실 수 있습니다.
위 클래스를 이용해 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 부분의 정보를 가져올 수 있습니다.
관련링크 (출처)
댓글목록
등록된 댓글이 없습니다.