php 입문 | 페이지 전환, 쿠키, 세션 | 세션을 사용한 로그인

그러면 실제로 세션을 사용해 보자. 여기에서는 세션 이용의 기본 중의 기본이라 할 수 있는 로그인 기능을 구현하여 보기로 한다. 정식으로 사용자 이름과 암호를 데이터베이스에 저장하고 ……라는 것은 아직 버겁 때문에 우선 PHP 스크립트 안에서 이러한 변수로 준비하고, 그것을 통해 확인만해 보는 것으로 해보자.

여기에서는 로그인 페이지 index.php와 로그인했을 때 표시되는 index2.php 두 페이지를 만들어 보기로 한다. 우선 로그인 페이지 (index.php)부터, 아래와 같이 코드를 작성한다.

<?php
    @session_start();
     
    if ($_POST != null){
        $account = $_POST['account'];
        $pass = $_POST['pass'];
        $_SESSION['account'] = $account;
        $_SESSION['pass'] = $pass;
        header("Location: ./index2.php");
    }
?>
<!DOCTYPE html>
<html lang="ko">
    <head> 
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
        <title>sample page</title>
    </head>
    <body>
        <h1>Hello PHP!</h1>
        <p>
            <?php
            if (isset($_SESSION['account'])) {
                echo "your account:" . htmlspecialchars($_SESSION['account']);
            }   
            ?>
        </p>
        <hr>
        <form method="post" action="./index.php">
            ACCOUNT :<input type="text" name="account"><br>
            PASSWORD:<input type="password" name="pass"><br>
            <input type="submit" value="이동">
        </form>
        <hr>
    </body>
</html>

여기에서 폼을 전송하면, 맨 위의 스크립트에서 그 내용을 확인하고 세션에 저장하고 있다. 이것 자체로는 로그인 체크하고 있지는 않는다. 단순히 전송된 계정과 암호를 저장하고 있을 뿐이다.

처음에 먼저 session_start를 수행하고 있고, 그 앞에 @가 붙여 있다. 이는 이전에 파일 액세스할 때에 등장했었던, “오류가 발생해도 무시하고 계속하기"위한 것이다. 서버에 기본적으로 세션 기능이 ON으로 되어 있는 경우도 있기에, 그러한 경우에 다시 세션을 시작하려고 하면 “벌써 시작하고 있다"라고 오류가 발생할 수 있다. 따라서 이에 대한 예방 조치이다.

$account = $_POST['account'];
$pass = $_POST['pass'];
$_SESSION['account'] = $account;
$_SESSION['pass'] = $pass;

세션 관계의 처리는 아주 간단하다. $_SESSION에 보관하면 모두 저장된다. 다른 설명 필요가 없을 정도로 간단하다. 그리고 또 하나를 언급한다면, 현재 계정을 표시하고 있는 body의 스크립트 부분이다. 여기에서는

if (isset($_SESSION['account'])) {...중략...

이와 같이 작성되어 있다. “isset"라는 함수는 인수에 지정된 변수가 존재하는지 여부를 확인한다. 즉, 이는 $_SESSION[ 'account']가 있는지를 확인해 보는 거다.

로그인 했을 때만 페이지를 표시하기

이어서 index2.php을 작성해 보자. 여기서는 로그인되어 있는지 체크하고, 로그인이 되었을 때만 페이지를 표시시켜 보도록 하자. 아래와 같이 예제 코드는 작성하면 된다.

<?php
    @session_start();
     
    // ACCOUNT와 PASS
    $ok_account = "admin";
    $ok_pass = "kanri";
     
    // 로그인 체크
    $flg = false;
    $account = $_SESSION['account'];
    $pass = $_SESSION['pass'];
    if ($account == $ok_account and $pass == $ok_pass){
        $flg = true;
    }
    // 로그인이 되어 있지 않았을 때 처리
    if (!$flg){
        echo "<html><body><h1>NOT LOGIN!!!</h1>";
        echo '<a href="./index.php">back to login page.</a>';
        echo "</body></html>";
        exit;
    }
?>
<!DOCTYPE html>
<html lang="ko">
    <head> 
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
        <title>sample page</title>
    </head>
    <body>
        <h1>Index2.php!</h1>
        <p>[Account: <?php echo htmlspecialchars($account); ?>]</p>
        <p>새로 준비된 페이지입니다.</p>
        <hr>
    </body>
</html>

여기에서는 먼저 @session_start한 후에, 등록 사용자의 계정과 암호를 $ok_account$ok_pass 에 준비해 둔다. 그리고 $_SESSION에서 account와 pass 값을 각각 얻어내어, 값을 확인하고 계정과 암호가 맞으면 $flg라는 변수에 true를 대입하고 있다. 이는 로그인 성공 여부를 나타내는 변수로, 이것이 true이면 로그인된 것이고, false라면 되지 않은 것이다.

로그인이 되지 않은 경우는 echo으로 오류 메시지와 index.php로 돌아가기 링크를 표시하고, 마지막에 “exit"를 하고 있다. 이는 “여기에서 스크립트의 실행을 종료한다’는 것이다. exit 실행하면, 이후에 있는 코드는 모두 실행되지 않는다. PHP 스크립트뿐만 아니라 작성하는 HTML 코드도 모두 출력되지 않을 것이다. 즉, 로그인하지 않으면 여기에 포함된 페이지 자체가 표시되지 않는다.

여기에서는 echo로 오류를 쓰고 exit실행하는 것으로 대응을 했지만, 하는 방법은 다양하다. 오류 페이지로 리디렉션하거나 로그인 페이지로 되돌리거나 하는 것도 좋을 것이다. 이 외에 다양한 방법에 대해 생각해 보길 바란다.

로그인 체크 일반화

일단 이것으로 로그인했을 때만 페이지를 표시하도록 처리가 되었지만, 모든 페이지에 여기에 써 있는 것처럼 처리를 해야 한다면 로그인 체크하는 것은 비효율적이다. 이러한 경우에는 로그인 체크 페이지를 준비하여 이를 각 페이지에서 로드하고 실행하도록 할 수 있다.

아래와 같이 간단한 예제를 보도록 하자.

check.php 코드

<?php
    @session_start();
     
    // ACCOUNTとPASS
    $ok_account = "admin";
    $ok_pass = "kanri";
     
    // 로그인 체크
    $flg = false;
    $account = $_SESSION['account'];
    $pass = $_SESSION['pass'];
    if ($account == $ok_account and
            $pass == $ok_pass){
        $flg = true;
    }
    // 로그인이 되어 있지 않았을 때 처리
    if (!$flg){
        echo "<html><body><h1>NOT LOGIN!!!</h1>";
        echo '<a href="./index.php">back to login page.</a>';
        echo "</body></html>";
        exit;
    }
?>

check.php을 이용한 페이지 예제

<?php include_once('./check.php'); ?>
<!DOCTYPE html>
<html lang="ko">
    <head> 
        <meta http-equiv="Content-Type"  content="text/html; charset=UTF-8" /> 
        <title>sample page</title>
    </head>
    <body>
        <h1>Index2.php!</h1>
        <p>[Account: <?php echo htmlspecialchars($account); ?>]</p>
        <p>새로 준비된 페이지입니다.</p>
        <hr>
    </body>
</html>

여기에서는 “check.php"라는 파일을 index.php 등과 같은 위치에 생성하고, 거기에 로그인 체크 처리를 준비한다. 그리고, 로그인 체크를 필요로 하는 페이지(index2.php)에는 아래의 한 문장을 시작 부분에 작성해 두도록 한다.

<?php include_once('./check.php'); ?>

단지 이것만으로 그 페이지는 로그인하지 않으면 볼 수 없게 된다. 여기에서는 “include_once"라는 함수를 이용하고 있다. 이는 인수에 지정된 스크립트 파일을 한번만 로드하는 기능을 가지고 있다. check.php을 가져 오면, 그 자리에서 스크립트가 실행되므로 여기에서 로그인하지 않으면 오류가 표시되고 exit가 실행된다. 당연히 이 페이지의 include_once 이후의 내용들도 표시되지 않는다.

 

로그인 시스템의 기본은 이것으로 대략 알게 되었다. 이 후에는 계정과 암호를 더 확고하게 관리하는 구조를 구상해 본다면, 그럭저럭 쓸만한 로그인 시스템을 만들 수 있을 것이다.




최종 수정 : 2021-08-27