개발이야기/PHP

[PHP] JWT(JSON WEB TOKEN) 토큰 사용법, 예제

후린개발자 2023. 5. 4.
반응형

JSON Web Token (JWT)은 인증 및 권한 부여를 위한 인증 프로토콜 중 하나입니다. JWT는 인터넷에서 데이터를 안전하게 전송하기 위해 사용되는 간단하고 강력한 방법 중 하나입니다. 
JWT는 일반적으로 사용자 인증 및 클라이언트 - 서버 통신에서 사용됩니다. JWT는 토큰 자체에 사용자 정보를 포함시키므로, 클라이언트에서 서버로 이 정보를 계속 전달할 필요가 없습니다. 
서버는 JWT가 포함하는 정보를 디코딩하여 사용자를 인증하고 권한을 부여할 수 있습니다.

 

jwt class

class jwt{
	protected $alg;
	function __construct(){
		   //사용할 알고리즘
		   $this->alg = "sha256";
	}

	function hashing(array $data){
		   // 토큰의 헤더
		   $header = json_encode(array(
				  "alg"=>$this->alg,
				  "typ"=>"JWT"
		   ));
		   $payload = json_encode($data);
		   $signature = hash($this->alg, $header.$payload);
		   return base64_encode($header.".".$payload.".".$signature);
	}

	function dehashing($token){
		   // 토큰 만들때의 구분자 . 으로 나누기
		   $parted = explode(".", base64_decode($token));

		   $signature = $parted[2];

		   // 위에서 토큰 만들때와 같은 방식으로 시그니처 만들고 비교
		   if(hash($this->alg, $parted[0].$parted[1]) == $signature){
				//  echo "good";
		   }else{
				  //echo("잘못된 signature 입니다");
		   }
		   $payload = json_decode($parted[1],true);
		   return $payload;
	}
}

 

로그인 정보 저장 (JWT를 사용하여 해싱하고, 쿠키로 저장하는 기능)

// 쿠키변수 생성
function set_cookie($cookie_name, $value, $expire){
	setcookie(md5($cookie_name), base64_encode($value), time() + $expire, '/');
}
// 쿠키변수값 얻음
function get_cookie($cookie_name){
	$cookie = md5($cookie_name);
	if (array_key_exists($cookie, $_COOKIE))
		return base64_decode($_COOKIE[$cookie]);
	else
		return "";
}
$user_id='user1';
$user_nm='홍길동';
$city='서울특별시';

$jwt = new jwt();
$login_token = $jwt->hashing(array(
				 "user_id"=> $user_id,
				 "user_nm"=> $user_nm,
				 "city"=> $city
));

//Cookie 저장 : 1달
set_cookie("token", $login_token, 2592000);

 

JWT 정보 가져오기 (저장된 JWT를 가져와 디코딩한 후, 사용자 정보를 출력하고 상수로 정의)

$get_login_token = get_cookie("token");

$jwt_data = $jwt->dehashing($get_login_token);

echo $jwt_data["user_id"]."<br>";
echo $jwt_data["user_nm"]."<br>";
echo $jwt_data["city"]."<br>";

define('SESSION_USER_ID',   $jwt_data["user_id"]);
define('SESSION_USER_NM',   $jwt_data["user_nm"]);
define('SESSION_CITY',    $jwt_data["city"]);


echo SESSION_USER_ID."<br>";
echo SESSION_USER_NM."<br>";
echo SESSION_CITY."<br>";

SESSION_USER_ID, SESSION_USER_NM, SESSION_CITY 상수를 사용하여 사용자 정보를 간편하게 접근할 수 있습니다.

반응형

댓글

💲 추천 글