Programming/PHP

PHP 로그인 샘플 소스(HTTP 인증 로그인, Cookie 로그인, Session 로그인)

zzarungna 2021. 6. 14. 23:12
반응형

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를 활용해 로그인 기능뿐만 아니라 필요에 따라 자유롭게 활용하면 좋을 것 같습니다. 개인적으로 참고할 목적으로 정리하였으며  필요한 분들께 도움이 되는 정보였길 바랍니다.

반응형