본문 바로가기

웹 해킹

JWT/PHP 로그인

JWT와 쿠키/세션에 관한글을 먼저 작성하려했지만

JWT를 구현하는글을 먼저 작성해보려한다. (아직 이론정리가 잘 되지않음)

설치 과정 요약

  1. 설치 파일 다운로드: php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
    의 명령어를 실행하여 composer-setup.php 파일을 다운로드.
  2. 설치 스크립트 실행: php composer-setup.php --install-dir=/usr/local/bin 명령어를 실행하여 설치 파일을 실행.
  3. 설치 파일 이동: mv composer.phar /usr/local/bin/composer 명령어로 Composer 바이너리를 /usr/local/bin/ 디렉토리로 이동.
  4. 설치 확인: composer -v 명령어를 실행하여 Composer가 정상적으로 설치되었는지 확인
  5. WEB ROOT에서 composer require firebase/php-jwt 명령어 입력.
  6. 정상적으로 되었다면 vendor, coposer.json, composer.lock가 생김.

1. jwt값을 넘겨주고 받아오는과정 구현.

<?php
session_start();
use \Firebase\JWT\JWT;
$userId = $_SESSION['userId'];
$key = "jdleaf";
$payload = array(
    "userid" => $userId,
    "exp" => time() + 3600
);


$jwt = JWT::encode($payload, $key, 'HS256');
echo $jwt;

?>

기존에 세션에 등록되어있는 ID 먼저 넘겨보기로 하였다.

결과는 보란듯이 실패.

ini_set('display_errors', 1);
error_reporting(E_ALL);

에러 확인코드를 작성후

음 대충 캐치를 못한다는것 같다. 경로문제인가 싶었다.

require __DIR__ . '/vendor/autoload.php';

검색해보니 위를 등록해주지않으면 외부 라이브러리를 불러오지 못한다고한다. 다시시도.

또다시 보이는 에러.

이번에는 버전 호환성문제로 파악된다.

php가 8.0 이상이여야하는데 7.4버전인게 문제가 되는것같다.

해결방법은 1차적으로 php 업그레이드를 해보려하였다.

 

-- 도커 내부쉘 접속 및 버전확인

php를 업그레이드 해보려 하였으나 8.0이상은 찾을수없다 > 실패

docker버전문제인가 싶어 docker를 업그레이드 해보려 하였으나 > 실패

 

dockerfile을 새로 작성해야 하나 생각중 jwt버전을 낮춰보기로 하였다.

우선 기존에 설치된 jwt를 모두 지워주었다.

이후 5.0버전으로 재설치.

student@segfault:~/webDev/webApp$ composer require firebase/php-jwt 5.0.0

이후 정상적으로 인코딩 된 값이 넘어오는걸 확인하였다

 

값이 넘어오는걸 확인하였으니 이걸 토대로 로그인시 cookie에 jwt를 담아 보내주고

기존 세션으로 로그인을 유지하였던것을 jwt값의 여부로 로그인을 유지하도록 만들어주었다.

use \Firebase\JWT\JWT;

function login5($userId, $userPwd)
{ //Hash 식별인증분리
    define('DB_SERVER', 'localhost');
    define('DB_USERNAME', 'admin');
    define('DB_PASSWORD', 'student1234');
    define('DB_NAME', 'test');
    $db_conn = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_NAME);
    $hashpwd = hash("md5", $userPwd);
    $sql = "select * from test_table where name='" . $userId . "'";
    $result = mysqli_query($db_conn, $sql);
    $row = mysqli_fetch_array($result);
    //echo $hashpwd."".$row["pass"];
    if ($row["pass"] == $hashpwd) {

        require __DIR__ . '/vendor/autoload.php';
        $key = "jdleaf";
        $payload = array(
            "userid" => $userId,
            "exp" => time() + 3600
        );


        $jwt = JWT::encode($payload, $key, 'HS256');
        setcookie('jwt', $jwt, time() + 3600, '/', '192.168.157.130', false, true);
        return $userId;
    } else {
        return 0;
    }
}

<loginfunc.php>

 

<?php
    // session_start();
    // if(!$_SESSION['userId']){
    //     header("location:login.php"); // 리다이렉트 문구
    //     exit; // 로그인 되어있지 않을시 페이지 노출X
    // }
// require __DIR__.'/vendor/autoload.php';
// use Firebase\JWT\JWT;
// use Firebase\JWT\Key;

// JWT 쿠키 확인
$jwt = $_COOKIE['jwt'] ?? null;
if($jwt===null){
    header("location:login.php");
    exit;
}
echo $jwt;
// 에러 메시지 출력
error_reporting( E_ALL );
ini_set( "display_errors", 1 );

?>

<index.php>

 

이 과정에서 jwt값은 제대로 set되지만 쿠키를 받아오지 못하는일이 생겨 index로 못넘어가는 경우가 생겼는데.

setcookie('jwt', $jwt, time() + 3600, '/', '192.168.157.130', false, true);

부분을

setcookie('jwt', $jwt, time() + 3600, '/', '192.168.157.130', true, true);

로 작성하게되면 HTTPS에서만 쿠키가 전송되도록 설정되기때문에 발생했던 작은 헤프닝이 있었다.

 

정상적으로 작동 확인

'웹 해킹' 카테고리의 다른 글

쿠키, 세션 그리고 JWT  (0) 2025.05.19
게시판 CRUD, 페이징, 검색  (1) 2025.05.13
Hash와 로그인 식별/인증  (0) 2025.04.22
PHP / DB연동 데이터 삽입 및 불러오기  (0) 2025.04.16
NAT 네트워크  (0) 2025.04.10