1

PHP - 로그인 인증(권한) 구현 - Cookie 방식

PHP - 로그인 인증(권한) 구현 - Cookie 방식

노아의 블로그

    목차
반응형

전시간에는 쿠키를 이용해서 아이디 기억하기 기능을 만들었습니다.

그렇다면, login.php 말고 이제 다른 페이지

index.php 페이지를 만들어봅시다.

 

gedit index.php

 

index.php는 로그인 성공시 들어와지고요 로그인된 사용자 이름을 띄워서 XXX사용자님 환영합니다! 라는 

페이지로 구성해볼거에요.

 

전에도 설명하다시피 로그인을 계속하는 번거로움을 없애기 위해서 쿠키를 사용한다고 했죠?

쿠키를 사용하는게 이해가 안되신다면 쿠키 없이 index.php에 로그인된 사용자의 정보를 출력해보세요. 

물론~ 할수야 있겠죠 login.php에서 index.php에 정보를 넘긴다면요. 다만 정보를 index.php에 보내는 코드를 작성해야하겠죠.

하지만 또다른페이지 여러개가 만들어진다면? 너무 비효율적이죠. 당장에 쇼핑몰만 봐도 페이지가 여러가지인데 로그인에서 다 넘길거에요? 네 그냥 불가능에 가깝습니다.

 

그래서 쿠키를 사용한다고 설명드렸죠.

 

그렇다면 쿠키를 사용해서 어떻게 사용자 정보를 출력할까요?

간단한 방법을 생각해봅시다.

 

저는 이렇게 생각해볼게요.

 

Id는 식별자잖아?

근데 Id가 쿠키에 저장되니까.

누가 누구인지를 식별할수 있겠네?

그렇다면 쿠키값을 불러와서 DB에서 쿠키에 있는 Id인 회원을 조회하면? 사용자 정보를 쓸 수 있겠다. 

 

네. 바로 Index.php에서 쿠키값을 이용해 DB에서 조회하는 방법입니다.

Select * from id where id = [쿠키에있는 id값]

 

그러면 시작해봅시다!

 

가 아니라 시작하기전에 바꿔야 할 것이 있습니다.

바로 login.php에 setcookie 메서드인데요.

setcookie("userid",$row["id"],time() + 3600,"/login.php");

이상한 점을 찾아볼까요?

 

네. 메서드의 마지막부분은 경로를 설정하는 부분이라고 했죠.

저희는 index.php에서도 이 userid쿠키를 쓰고싶은데, 지금은 경로가 login.php로 되어있어서 login.php 밑으로만 쿠키가 적용됩니다.

 

따라서 우리는 경로를 "/" 으로 지정할것입니다.

/는 최상위 경로이므로 모든곳에 적용이 가능합니다. 모든 경로에서 이 userid 쿠키를 사용할 수 있습니다.

 

바꿔보시죠.

setcookie("userid",$row["id"],time() + 3600,"/");

 

그리고 로그인 성공시 index.php로 이동하고싶어요. 어떻게 할까요?

로그인 체크(if문) 안에다가 index.php로 이동하는 코드를 작성하면 되겠죠?

이동하는 코드는 header 함수입니다.

header('Location: index.php');

이 코드를 login.php 에 if문 맨 밑에 넣어주시기 바랍니다.

로그인을 시도하면 index.php로 이동하는 모습입니다.

 

하지만 아무것도 쓰지 않아서 빈 화면만 보이게 되죠. 다음과 같이 입력하겠습니다.

<?php
$id = $_COOKIE["userid"];
	echo $id; ?>

select sqluser로 로그인 하니 select(id)가 뜨면 성공. 

이제 DB에서 이 id를 조회해야겠군요. 

DB연결코드 조회코드 모두 login.php에서 복붙하고 약간만 다듬읍시다.

<?php
$servername = "localhost"; //서버주소
$username = "user1234"; //MYSQL 사용자 이름
$password = "1234Qwert!"; //MYSQL 사용자 비번
$dbname = "test"; //접속할 DB 이름

$conn = mysqli_connect($servername,$username,$password,$dbname); //mysql 연결

// 연결 확인
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error()); //에러메시지
}
?>

<?php 
	
	$id = $_COOKIE["userid"];
	echo $id;
	
	$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 {
    echo "<br>login faild.";
}
?>

짠. 

전에 했던 로그인 페이지와 다른것은 쿠키가 들어갔다 이정도만 다르죠? 똑같아서 설명할것도 없습니다.

쿠키값에 id가 들어가니까 로그인한 사용자의 id가 select면

 

select * from member where id = 'select'; 

이런식으로 들어가는것입니다.

 

실행시켜봅시다!

 

정상적으로 출력됩니다.

이제 문제가 없습니다!!!!!!! 끝~~~~!

은 미친소리입니다. 이 사이트에는 취약점이 엄청나게 많습니다

 

index.php는 로그인한 사용자의 정보 페이지잖아요?

하지만 누군가가 로그인도 안하고 url에 index.php를 쓴다면? 

....통과되겠죠... 우리가 의도한대로 사용자가 사용하지 않습니다.

그.래.서

로그인 된 사람이 index.php로 이동되는것처럼 

index.php에서는 로그인 되지 않은 사용자를 login.php로 이동시켜버리면 해결됩니다.

 

index.php에 else문에 다음과 같이 입력하면 됩니다.

 header('Location: login.php');

네 이제 로그인하지 않은 사용자가 index.php에 접근시 다시 login.php로 이동하게됩니다!

 

이제 완벽...? 아쉽게도 no입니다.

이 select라는 사용자가 갑자기 흑화해서 용용이의 정보를 털려고 합니다.

먼저 select라는 사용자는 자기 아이디로 로그인을 시도해서 index.php로 들어갑니다.

그런데 쿠키를 보니까 자기의 id가 들어간것을 확인했습니다.

 

사용자 select는 어...? 왜 userid에 내 id가 저장되어있지?

그럼 저 쿠키에 용용이의 id를 집어넣으면 설마 용용이의 정보가 나오나 하고 생각했습니다.

 

쿠키의 단점이죠. 클라이언트측이 관리한다는것. 그래서 위조가 가능합니다.

 

여기 있는 자신의 id에

 

용용이의 id를 집어넣고 새로고침(요청) 을 하였습니다.

 

 

결과는 충격적이게도, 용용이의 정보가 나왔습니다.

index 페이지는 로그인된 사용자만 들어갈 수 있으니까 안일하게 생각한 개발자가 쿠키로 id만 받아서 DB에서 조회하는겁니다. 다만 개발자가 하나 놓친것이 있다면 쿠키는 변조가 가능한것. 따라서 자기자신의 계정으로 로그인해서 index.php 페이지에 접근하고 쿠키값을 다른 사람의 id로 바꿔버리면 다른사람의 권한을 취득할 수 있는거죠.. 

 

이를 보완한것이 세션이라고 설명드렸죠. 다음시간에는 세션에 대해서 알아봅시다. 수고하셨습니다.

반응형

'WEB > PHP' 카테고리의 다른 글

PHP - 로그아웃 구현  (0) 2023.04.22
PHP 로그인 인증 - Session  (0) 2023.04.22
PHP 로그인 - 쿠키를 통한 아이디 저장(아이디 기억하기)  (0) 2023.04.21