[PHP]PHP세션을 이용해 토큰을 만들어보자 (PHP 토큰제작)

Program/오래된 PHP 게시판2





로그인이라던지, 회원가입이라던지 토큰이 필요한 부분이 매우 많습니다.


여기서 할 토큰은 시간제한 토큰입니다.


시간제한 토큰이 뭐냐면


시간이 지나면 토큰값이 만료되서 토큰을 새로 발급받는걸 생각하시면되요. 그런데, 세션을 삭제하면 로그인이나 가입이 안되게 꼼수를 써야합니다.


먼저 페이지 제작을해줍시다..!


페이지 이름은 정해진대로해주세요.


다음 페이지 이름은 login.php로 칭합니다.


외부 접근을 차단하기 위해 여러가지 세션을 추가합니다.


<?SESSION_START():?>
<?php
$_SESSION[token]=date("YmdHis"); //은근슬쩍 토큰생성 (아무에게도 안보여요. 단지 PHPSSID가 보일 뿐이지)
$_SESSION[tokensave]=$_SESSION[token]; //토큰을 다른 세션에 저장
$rand_token=mt_rand(1,9999);
$_SESSION[fake]=$rand_token;//봇 테러 방지를 위한 꼼수
$faketoken=$_SESSION[tokensave]-$_SESSION[fake];
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>로그인 페이지</title>
    </head>
    <body>
        <form action='login_ok.php' method='post'>
            아이디 : <input type='text' name='id'><br>
            비밀번호 : <input type='password' name='pw'> <br>
            <input type='hidden' name='l_token' value='<?php echo $_SESSION[fake]; ?>'>
            <input type='submit' value='로그인'>
            </form>
    </body>
</html>

login.php





다음 페이지 이름은 login_ok.php로 정합니다.


<?SESSION_START();?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>로그인 중..</title>
    </head>
    <body>
        <?php
            $second="300"; //시간초 지정 60 = 1분 저는 넉넉히 5분으로 하겠습니다.
            $time=date("YmdHis") -$_SESSION[tokensave];
            if(!$_SESSION[token] or !$_SESSION[tokensave] or !$_SESSION[fake] or $_POST[l_token]){echo "토큰이 유효하지 않습니다."; exit;}
            if($_SESSION[tokensave]-$_SESSION[fake]==$_POST[l_token]){}else {echo "토큰이 유효하지 않습니다."; exit;}
            if($time<$second){
           
            //세션 인증 작업이 성공될때 로그인 커멘드를 집어넣으세요.
           
            }
           
            else {echo "토큰이 유효하지 않습니다."; exit;}

        ?>
    </body>
</html>



login_ok.php



세션이 허용되는 서버에서는 다 동작합니다만, 필자가 테스트를 안해서 에러뜨는부분이 있을듯 합니다. 자세한 문의는 댓글에해주세요.


아래의 손가락버튼을 눌러주시면 블로그에 매우 큰 도움이됩니다. 히히




Copyright © 이동마이의 컴퓨터 하루 All Rights Reserved.



궁금한게 2015.12.04 02:02 URL EDIT REPLY
궁금한게 있는데요 토큰생성 위주라서 그런지 모르겠지만 로그인페이지에서 입력값을 받았을때
로그인 체크페이지로 넘기는 코드가 안보이는데 제가 잘 모르는건지 아니면 글과 상관 없어서 그런건지 모르겠습니다만 만약에 글과 상관이 없어서가 아니면 어떻게 넘기는 과정이 진행되는건가요..? 으흠;;
Favicon of https://idongmai.wo.tc BlogIcon 한빛가람 | 2015.12.06 01:46 신고 URL EDIT
PHP자체의 세션 기능을 활성화 시켜서 자체적으로 공유되게 한거라 보면 되겠네요..

이 글을 쓸 당시가 2년전이라, 왜 저렇게 작성했는지는 필자도 모르겠습니다만, 아마 세션 공유를 통한 토큰제작인듯싶습니다.

지금 봤을때는, 매우 비효율적인 방식이기도하고..

새로 작성하는게 낫겠군요.

굳이 있다면, <input type='hidden' name='l_token' value='<?php echo $_SESSION[fake]; ?>'>

와 세션 fake를 비교하는게 전부입니다.

클라이언트 쪽에서는, html를 변조해서 서버에 전송이 가능하다보니..
Name(이름)
Password(비밀번호)
Homepage(홈페이지)
Secret(비밀글)