1

PHP 로그인 인증 - Session

PHP 로그인 인증 - Session

노아의 블로그

    목차
반응형

자 저번시간에는 Cookie를 통해서 login.php에서 로그인을 하면, index.php에서도 로그인 정보가 뜰 수 있도록 하였는데요.

결정적으로 치명적인 약점이 존재했습니다. 바로 쿠키를 변조해서 index.php에서 다른사람의 아이디로 로그인이 가능한건데요 

이를 막기위해서 Session을 사용한다고 말씀드렸죠.

세션은 클라이언트에서 관리하는 쿠키와는 달리 서버에서 관리합니다.

따라서 클라이언트는 변조하기가 어렵죠.

 

세션은 SessionId(식별자)만 쿠키로 보내놓고 다음 요청시 이 쿠키를 받아서 세션에 저장된 정보를 찾는겁니다. 

 

간단한 로그인 예시를 들어보겠습니다.

 

1.처음에 서버에서 난수화된 세션ID를 쿠키로 보냅니다.

2.사용자는 로그인을 시도합니다. id는 ph12 pw는 1234 그리고 SessionId 쿠키와 같이 요청합니다.

 

3.서버는 SessionID를 보고 내가 처음에 응답한 세션ID와 방금 클라이언트가 요청한 SessionID가 같은 세션컨테이너의 위치를 찾고 그곳에 id와 기타등등의 사용자 정보를 담습니다.

 

SessionID가 예를 들어서 1234라고 해보겠습니다.

 

4.다음 요청(ex: index.php) 에서 sessionid 쿠키 1234와 요청합니다. 그렇다면 서버는 컨테이너에서 1234를 찾고 그안에 있는 정보를 응답합니다.  

 

이로서 id를 서버에서 저장하니까 클라이언트는 사용자 정보 조작이 불가합니다.

 

그렇다면, 저번에 ID를 조작해서 용용이의 정보를 턴것처럼 다른사람의 SessionId를 입력하면 되는거 아니야?  

하지만 SessionId는 난수화되있어서 맞출 확률이 적습니다. 

XSS 공격을 이용한 쿠키 탈취가 아닌이상 힘듭니다.

 

이제 한번 쿠키로 사용한 로그인 말고 

세션으로 보완해봅시다

 

먼저 로그인 성공 실패 여부를 따지는 login.php로 이동합시다.

로그인 성공시 Session을 시작하고 사용자가 입력한 id를 세션에 넣어봅시다.

 

세션을 시작하는 함수는 

session_start(); 입니다.

그다음 쿠키와 비슷하게 $_SESSION 으로 변수에 접근합니다.

<?php 
    $id = $_POST['id'];
    $password = $_POST['password'];
    $sql = "SELECT * FROM test_tbl where id = '" . $id . "' and pass = '" . $password . "'"; 
    $result = mysqli_query($conn, $sql); //sql 실행
    //login 
    if (mysqli_num_rows($result) > 0) {
        while($row = mysqli_fetch_assoc($result)) {
        echo $row["name"]. " USER WELCOME!!!<br>";
        
        #User Cookie 
        setcookie("userid",$row["id"],time() + 3600,"/");
        echo $_COOKIE["userid"] . "is Cookie value!";
        
        session_start();
        $_SESSION["userid"] = $row["id"];
        echo $_SESSION["userid"];
        header('Location: index.php');
    }
    //login faild
} else {
    echo "<br>login faild.";
}
?>

이런식으로 index.php로 넘어가기전에 session을 시작하고 session에 userid 란에 사용자가 입력한 id를 넣습니다.

테스트 해보시고 이제 index.php를 바꿔볼까요?

 

?php 
	session_start();
	$id = $_SESSION["userid"];
	$sql = "SELECT * FROM test_tbl where id = '$id'"; 
    	$result = mysqli_query($conn, $sql); 
    	
    if (mysqli_num_rows($result) > 0) {
        while($row = mysqli_fetch_assoc($result)) {
        echo "@@MAIN PAGE@@";
        echo "<br>";
        echo $row["name"]. " USER WELCOME!!!<br>";
    }
    //login faild
} else {
   header('Location: login.php');
}
?>

Cookie 값을 받고있던 index.php를 Session값을 받도록 하면 끝이죠. 정말 간단합니다.

아까 login.php에서 로그인 성공시 session_start로 세션을 이미 시작했는데

 

index.php에서도 왜 세션을 시작할까요?

session_start();를 빼먹으면 작동이 안됩니다.

session_start는 세션이 없으면 세션을 만들고 세션이 이미있으면 그 세션을 사용할수 있도록(유지) 하는 함수라고 합니다. 

 

이제 보완된 로그인이 완성되었습니다.

다음시간에는 로그아웃을 만들어보도록 하겠습니다.

반응형