PHP 로그인 샘플 소스(HTTP 인증 로그인, Cookie 로그인, Session 로그인)
PHP 웹 프로그래밍 언어를 사용해 HTTP 인증, Cookie, Session, Session+Cookie를 사용해 로그인 샘플 소스 코드를 정리해 보았습니다.
PHP HTTP 인증 로그인
장점 : 복잡한 과정을 거치지 않고 간단히 구현 가능
단점 : 로그아웃 기능이 없어 브라우저를 종료해야 로그아웃이 진행됨
요약 : 내부 인트라넷 용도나 간단히 구현하기 위해 인증 과정이 필요한 경우 사용하면 좋을 듯.
소스 server.php
$_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'] 전역 변수 코드를 이용해 사용자가 입력한 데이터를 가져와 header 전송을 사용해 인증 로그인 팝업을 띄우는 코드입니다.
<?php
header('Content-Type: text/html; charset=UTF-8');
$username = 'zzarungna';
$password = '1234abcd';
/**
* 브라우저를 모두 종료하기 전까지 로그인이 유지된다.
* $_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'] 전역변수를 이용해 헤더 인증정보 데이터를 가져온다.
*/
if(!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) ||
$_SERVER['PHP_AUTH_USER'] != $username || $_SERVER['PHP_AUTH_PW'] != $password ){
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate:Basic realm="zzarungna_login"');
exit('죄송합니다. 로그인 이후 페이지 사용이 가능 합니다. 아이디와 비밀번호를 확인해 주세요.');
}else{
echo('로그인 성공!');
}
?>
결과 화면 server.php
로그인이 되어 있지 않은 상태라면 HTTP 인증 팝업 노출.
소스 etc_page.php
다른 페이지에서 HTTP 인증 여부를 확인하려면 server.php 소스를 거쳐 로그인 여부를 확인해 처리.
<?php
header('Content-Type: text/html; charset=UTF-8');
require_once 'server.php';//다른 페이지에서 헤더 인증정보를 통해 로그인 사용자만 사용 가능하게 하고 싶다면 페이지를 인증정보 페이지를 항상 참조해야 한다.
?>
<h1><?php echo($_SERVER['PHP_AUTH_USER']); ?>님 방갑습니다. 저희 홈페이지를 이용해 주셔서 감사합니다.</h1>
결과 화면 etc_page.php
HTTP 인증이 통과되었다면 페이지 내용 출력
PHP Cookie 로그인
장점 : 로그아웃 구현 가능
단점 : 쿠키 만기 시점을 지정하지 않는 경우 브라우저 종료 시 로그아웃, 저장데이터 용량 한계, 쿠키를 지원하지 않는 브라우저가 있는 경우 사용 불가, 쿠키 삭제를 하지 않는 경우 사용자 PC에 데이터가 저장되어 보안상 좋지 않다.
요약 : 쿠키는 보조수단으로 세션과 함께 사용하면 좋음.
기존에 로그인 HTML 페이지를 하나의 페이지에서 구현하려고 했으나 쿠키가 생성되는 시간에 쿠키 생성 체크가 안 되는 현상이 있어 페이지를 3개로 나누어 작성
소스 cookie_login.php
form 전송여부 체크 후 아이디와 비밀번호가 맞는 경우 setcookie('id', $_POST['id]); 코드를 사용해 쿠키 생성.
<?php
header('Content-Type: text/html; charset=UTF-8');
$main_page = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/client.php';
$server_id = 'hey';
$server_pw = 'nice';
if(isset($_POST['submit'])){ //form이 전송되었다면
if(!empty($_POST['id']) && !empty($_POST['pw']) && $server_id == $_POST['id'] && $server_pw == $_POST['pw']){//id pw 입력 여부 체크, 지정한 아이디와 비번이 동일한지 체크
setcookie('id', $_POST['id'], time() + 2400);//쿠키 생성 2400초(40분) 동안 유지
header("Location: $main_page");//로그인 인증 후 쿠키 생성 후 리다이렉트
}
}
?>
<style>
div{
border: 1px solid black;
width: 270px;
height: 89px;
text-align: right;
}
</style>
<div>
<?php
if(empty($_COOKIE['id'])){
?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<label>아이디 : </label><input type="text" id="id" name="id" ><br>
<label>비밀번호 : </label><input type="password" id="pw" name="pw" ><br>
<input type="submit" id="submit" name="submit" value="로그인">
</form>
<?php
}else{
header("Location: $main_page");
}
?>
</div>
결과 화면 cookie_login.php
소스 client.php(로그인 이후 메인 페이지)
empty($_COOKIE['id']); 코드를 사용해 쿠키가 생성되었는지 확인 후 로그인 여부를 체크한다.
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>쿠키!</title>
<style>
div{
border: 1px solid black;
width: 270px;
height: 89px;
text-align: right;
}
</style>
</head>
<body>
<div>
<?php
if(empty($_COOKIE['id'])){
$login_page = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/cookie_login.php';
?>
<h3>로그인이 필요합니다.</h3>
<a href="<?php echo($login_page); ?>">로그인 페이지로</a>
<?php
}else{
?>
<h3><?php echo($_COOKIE['id'] . '님을 환영 합니다.'); ?></h3>
<form action="cookie_logout.php" method="post">
<input type="submit" value="로그아웃" id="submit" name="submit" >
</form>
<?php
}
?>
</div>
</body>
</html>
결과 화면 client.php
소스 cookie_logout.php
생성했던 쿠키 이름으로 기존에 생성된 쿠키가 있는지 확인 후 생성했던 쿠키 삭제.
<?php
header('Content-Type: text/html; charset=UTF-8');
$login_page = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/cookie_login.php';
if(isset($_COOKIE['id'])){
if(isset($_POST['submit'])){
setcookie('id', '', time() - 2400);
echo('<h3>로그아웃 성공</h3>');
echo('<a href='.$login_page.'>로그인 페이지로</a>');
}else{
echo('<h3>로그아웃 실패</h3>');
}
}
?>
결과 화면 cookie_logout.php
Session 로그인
장점 : 세션용 쿠키 정보가 웹서버에 저장되어 보안성이 높아진다.
단점 : 서버 부하
요약 : 세션을 생성해도 서버 부하가 생길 만큼 파일 용량이 크지 않음으로 로그인은 세션을 사용해 구현하는 게 좋다.
소스 session_login.php
PHP에서는 Session을 사용하려면 session_start(); 을 가장 먼저 작성 해주어야 한다. 소스의 흐름은 세션이 있는지 폼이 전송되었는지 아이디와 비밀번호를 입력하였는지 지정한 아이디와 패스워드와 일치하는지를 확인하는 소스 코드입니다. 쿠키와는 다르게 한 페이지에서 로그인 여부를 바로 확인할 수 있어 2페이지로 작성하였습니다.
<?php
header('Content-Type: text/html; charset=UTF-8');
session_start();//session을 하기 위해서 선언해 줘야 한다.
$server_id = 'hi';
$server_pw = 'imsession';
if(!isset($_SESSION['id'])){
if(isset($_POST['submit'])){
if(!empty($_POST['id']) && !empty($_POST['pw'])){
if($_POST['id'] == $server_id && $_POST['pw'] == $server_pw){
$_SESSION['id'] = $_POST['id'];
echo('로그인성공!!');
}else{
echo('아이디 또는 비번이 맞지 않습니다.');
}
}else{
echo('아이디 비밀번호를 모두 입력해 주세요.');
}
}
}
?>
<style>
div{
border: 1px solid black;
width: 270px;
height: 89px;
text-align: right;
}
</style>
<?php
if(!isset($_SESSION['id'])){
?>
<div>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<label>아이디 : </label><input type="text" id="id" name="id" ><br>
<label>비밀번호 : </label><input type="password" id="pw" name="pw" ><br>
<input type="submit" id="submit" name="submit" value="로그인">
</form>
</div>
<?php
}else{
?>
<div>
<h3><?php echo($_SESSION['id'] . '님 환영 합니다.'); ?></h3>
<form action="session_logout.php" method="post">
<input type="submit" value="로그아웃" id="submit" name="submit" >
</form>
</div>
<?php
}
?>
결과화면 session_login.php
소스 session_logout.php
마찬가지로 세션을 사용하기 위해서 session_start(); 사용하며 세션 변수 초기화 후 웹서버에 생성된 세션용 쿠키까지 삭제하는 내용 입니다.
<?php
header('Content-Type: text/html; charset=UTF-8');
session_start();//세션 사용 시작
$home_url = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/loginpage.php';
if(isset($_SESSION['id'])){
$_SESSION = array();//세션 초기화
if(isset($_COOKIE[session_name()])){//웹 서버에 저장된 세션으로 사용했던 쿠키 삭제
setcookie(session_name(), '', time() - 3600);
}
session_destroy();//세션 종료
echo('<h3>로그아웃 성공</h3>');
echo('<a href='.$home_url.'>로그인 페이지로</a>');
}else{
echo('이미 로그아웃 되었습니다.');
}
?>
결과화면 session_logout.php
PHP Session + Cookie 사용
장점 : 브라우저를 종료해도 로그인 유지 가능, 쇼핑몰에 로그인을 하지 않아도 쿠키를 이용해 사용자가 봤었던 관심 상품을 보여줄 수 있다.
단점 : 세션이 유지되는 시간은 제한되어 있음.
요약 : 세션으로 불가능한 영역을 쿠키로 대체하여 활용할 수 있다.
소스 loginpage.php
로그인하지 않았다면 로그인 할 수 있는 화면을 제공한다.
<?php
session_start();
if(!isset($_SESSION['id'])){//로그아웃하지 않은 상태라면 쿠키에 저장된 값을 가져와 로그인을 유지한다.
if(isset($_COOKIE['id'])){//쿠키에 있는 정보를 가져와 세션에 넣어주어 다시 로그인을 하지 않아도 되니 사용자 입장에서 편하다.
$_SESSION['id'] = $_COOKIE['id'];
}
}
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>로그인</title>
<style>
div{
border: 1px solid black;
width: 270px;
height: 89px;
text-align: right;
}
</style>
</head>
<body>
<div>
<?php
if(!isset($_SESSION['id'])){
?>
<form action="session_cookie_login.php" method="post">
<label>아이디 : </label><input type="text" id="id" name="id" ><br>
<label>패스워드 : </label><input type="password" id="pw" name="pw" >
<input type="submit" id="submit" name="submit" value="로그인">
</form>
<?php
}else{
?>
<h3><?php echo($_SESSION['id'] . '님을 환영 합니다.'); ?></h3>
<form action="session_cookie_logout.php" method="post">
<input type="submit" value="로그아웃" id="submit" name="submit" >
</form>
<?php
}
?>
</div>
</body>
</html>
결과화면 loginpage.php
소스 session_cookie_login.php
아이디와 비밀번호 체크, 세션 생성, 쿠키 생성
<?php
header('Content-Type: text/html; charset=UTF-8');
session_start();
$home_url = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/loginpage.php';
$server_id = 'session';
$server_pw = 'cookie';
$login_page = '<a href='.$home_url.'>로그인 페이지로</a>';
if(!isset($_SESSION['id'])){
if(isset($_POST['submit'])){
if(!empty($_POST['id']) && !empty($_POST['pw'])){
if($_POST['id'] == $server_id && $_POST['pw'] == $server_pw){
$_SESSION['id'] = $_POST['id'];//세션 생성
setcookie('id', $_POST['id'], time() + 172800);//쿠키 생성 만기 2일후까지
echo('로그인성공!!');
echo($login_page);
}else{
echo('아이디 또는 비번이 맞지 않습니다.');
echo($login_page);
}
}else{
echo('아이디와 비밀번호를 모두 입력해 주세요.');
echo($login_page);
}
}
}else{
//로그인 페이지로 리다이렉트 이미 로그인되어 있는 상태라면
header("Location: $home_url");
}
?>
결과화면 session_cookie_login.php
소스 session_cookie_logout.php
세션 초기화, 세션 삭제, 웹서버 세션용 쿠키 삭제, 쿠키 삭제
<?php
header('Content-Type: text/html; charset=UTF-8');
session_start();
$home_url = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/loginpage.php';
if(isset($_SESSION['id'])){
$_SESSION = array();//세션 초기화
if(isset($_COOKIE[session_name()])){//웹서버 세션 쿠키 삭제
setcookie(session_name(), '', time() - 2400);
}
session_destroy();//세션을 삭제 합니다.
setcookie('id', '', time() - 172800);//쿠키 삭제
echo('<h3>로그아웃 성공</h3>');
echo('<a href='.$home_url.'>로그인 페이지로</a>');
}else{
echo('이미 로그아웃 되었습니다.');
}
?>
결과화면 session_cookie_logout.php
로그아웃 버튼을 누르지 않은 상태에서 브라우저를 종료한 후 loginpage.php에 다시 접근하게 되면 기존에 클라이언트 쿠키 정보를 활용해 세션에 값을 다시 부여하여 다시 로그인 과정을 거치지 않아도 로그인 처리 가능.
주의점 : 각각의 브라우저별로 로그인 이후 로그아웃 버튼을 누르지 않고 이틀이 지나지 않은 상태에서 정상적으로 작동. 브라우저간 공유는 되지 않음.
로그인 환경을 구성할 때 HTTP, Cookie, Session을 활용하면 좋을 듯하며 HTTP, Session, Cookie를 활용해 로그인 기능뿐만 아니라 필요에 따라 자유롭게 활용하면 좋을 것 같습니다. 개인적으로 참고할 목적으로 정리하였으며 필요한 분들께 도움이 되는 정보였길 바랍니다.