PHP 세션을 통한 로그인/로그아웃 기능 구현

이 포스트에서는 PHP 사이트에서 세션을 통해 로그인과 로그아웃 기능을 구현하는 방법을 설명합니다.
※ 이 포스트의 내용은 CC-BY-SA 3.0으로 배포되는 제타위키의 PHP 세션 로그인 구현 문서를 참고하여 작성하였습니다.

인터넷을 이용할 때 사용자(클라이언트)의 컴퓨터에 저장되는 간략한 정보를 ‘쿠키’라고 부르는데, ‘세션’은 이러한 정보가 서버에 저장되는 것을 말합니다. 서버에 저장되는만큼 쿠키보다 보안이 좋기 때문에 로그인 기능은 세션을 이용합니다.

일단, 로그인 기능을 실험할 페이지는 어떻게 만들지 구상해 봅시다.

  1. 메인(index.php)은 로그인 페이지로 가는 링크를 만듦.
  2. 로그인 페이지(login.php)는 로그인용 폼을 만들고 로그인 처리용 페이지를 만들어서 처리.
  3. 로그인 처리 페이지(login_ok.php)는 계정 정보를 대조하여 로그인 성공시 그 상태로 메인으로 복귀, 실패시는 실패 안내 후 로그인 페이지로 복귀.
  4. 메인 페이지에 로그아웃용 페이지로 가는 링크가 표시됨.
  5. 로그아웃 페이지(logout.php)는 세션을 삭제하여 로그아웃 처리하고 위의 1번으로 돌아감.

이런 식입니다. 이를 위해 다음과 같이 4개의 php 파일을 만들어 봅시다.

index.php

<!DOCTYPE html>
<?php session_start(); ?>
<html>
	<head>
		<meta charset="utf-8" />
		<title>PHP Session Login Test</title>
	</head>
	<body>
		<h1>Hello, world!</h1>
		<?php
			if(!isset($_SESSION['user_id']) || !isset($_SESSION['user_name'])) {
				echo "<p>로그인을 해 주세요. <a href=\"login.php\">[로그인]</a></p>";
			} else {
				$user_id = $_SESSION['user_id'];
				$user_name = $_SESSION['user_name'];
				echo "<p><strong>$user_name</strong>($user_id)님 환영합니다.";
				echo "<a href=\"logout.php\">[로그아웃]</a></p>";
			}
		?>
		<hr />
		<p>투명한 유리구슬처럼 보이지만 그렇게 쉽게 깨지진 않을 거야</p>
	</body>
</html>

이것이 처음으로 나올 페이지입니다. 2번 줄에 session_start() 함수가 있는 것이 보일 텐데 이는 세션을 사용하기 위해 필수적인 함수입니다. 이 함수는 코드 초반부에 사용합니다. 그리고 본문을 표시할 때는 세션에 로그인된 사용자 정보가 있는지 확인한 후 없으면 로그인 페이지로 연결하고 있으면 로그인한 사용자 정보를 보여줌과 함께 로그아웃 페이지로 연결합니다. 세션 정보를 확인하기 위해 PHP는 초전역변수 $_SESSION[]을 제공하고 있습니다.

login.php

<!DOCTYPE html>
<?php session_start(); ?>
<html>
	<head>
		<meta charset="utf-8" />
		<title>PHP Session Login Test</title>
	</head>
	<body>
		<h1>Hello, world!</h1>
		<hr />
		<h2>로그인</h2>
		<?php if(!isset($_SESSION['user_id']) || !isset($_SESSION['user_name'])) { ?>
		<form method="post" action="login_ok.php">
			<p>아이디: <input type="text" name="user_id" /></p>
			<p>비밀번호: <input type="password" name="user_pw" /></p>
			<p><input type="submit" value="로그인" /></p>
		</form>
		<?php } else {
			$user_id = $_SESSION['user_id'];
			$user_name = $_SESSION['user_name'];
			echo "<p><strong>$user_name</strong>($user_id)님은 이미 로그인하고 있습니다. ";
			echo "<a href=\"index.php\">[돌아가기]</a> ";
			echo "<a href=\"logout.php\">[로그아웃]</a></p>";
		} ?>
	</body>
</html>

로그인을 하기 위한 페이지입니다. 여기서도 마찬가지로 session_start() 함수를 사용해 세션을 불러온 후 로그인 상태가 아닐 때 로그인 폼을 보여주고 로그인 처리 페이지로 이동시킵니다. 만약 로그인이 됐는데 로그인 페이지로 다시 들어왔다면 이미 로그인됐다는 메시지와 함께 메인으로 가는 링크와 로그아웃하는 링크를 보여줍니다.

login_ok.php

<?php
	if ( !isset($_POST['user_id']) || !isset($_POST['user_pw']) ) {
		header("Content-Type: text/html; charset=UTF-8");
		echo "<script>alert('아이디 또는 비밀번호가 빠졌거나 잘못된 접근입니다.');";
		echo "window.location.replace('login.php');</script>";
		exit;
	}
	$user_id = $_POST['user_id'];
	$user_pw = $_POST['user_pw'];
	$members = array(
		'sowon' => array('password' => '951207', 'name' => '소원'),
		'yerin' => array('password' => '960819', 'name' => '예린'),
		'eunha' => array('password' => '970530', 'name' => '은하'),
		'yuju'  => array('password' => '971014', 'name' => '유주'),
		'sinb'  => array('password' => '980603', 'name' => '신비'),
		'umji'  => array('password' => '980819', 'name' => '엄지'),
	);

	if( !isset($members[$user_id]) || $members[$user_id]['password'] != $user_pw ) {
		header("Content-Type: text/html; charset=UTF-8");
		echo "<script>alert('아이디 또는 비밀번호가 잘못되었습니다.');";
		echo "window.location.replace('login.php');</script>";
		exit;
	}
	/* If success */
	session_start();
	$_SESSION['user_id'] = $user_id;
	$_SESSION['user_name'] = $members[$user_id]['name'];
?>
<meta http-equiv="refresh" content="0;url=index.php" />

로그인 처리용 페이지입니다. 여기서는 저장된 사용자 정보를 불러온 후 로그인 페이지에서 받아온 아이디와 비밀번호를 대조하여 틀리면 로그인 실패로 처리하여 다시 로그인 페이지로 이동시키고 맞으면 로그인 성공으로 처리합니다. 참고로
여기서는 예를 들기 위해 페이지 안에 자체적으로 DB를 저장해 두었지만 실무에서는 MySQL을 사용해 사용자 정보를 저장하고 비밀번호도 평문이 아닌 암호문으로 저장합니다.

logout.php

<?php
	session_start();
	session_destroy();
?>
<meta http-equiv="refresh" content="0;url=index.php" />

마지막으로 로그아웃 처리 페이지입니다. 저장된 세션을 불러온 후 그 세션 정보를 완전히 삭제함으로써 로그인 상태에서 벗어납니다. 그리고 다시 메인 페이지로 돌아갑니다.

이렇게 하면 간단한 세션 로그인 기능의 구현이 완료됩니다.

“PHP 세션을 통한 로그인/로그아웃 기능 구현”의 5개의 생각

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다