[PHP] 세션(Session)

Jeon·2021년 8월 11일

PHP

목록 보기
7/7

1. 세션(Session)이란?

  • 일정 시간동안 같은 사용자(브라우저)로부터 들어오는 일련의 요구를 하나의 상태로 보고, 그 상태를 일정하게 유지시키는 기술이다.
  • 여기서 일정 시간은 방문자가 웹 브라우저를 통해 웹 서버에 접속한 시점으로부터 웹 브라우저를 종료하여 연결을 끝내는 시점을 말한다.

1. 세션의 특징

  1. 웹 서버에 웹 컨테이너의 상태를 유지하기 위한 정보를 저장한다
  2. 브라우저를 닫거나, 서버에서 세션을 삭제했을때만 삭제가 되므로, 쿠키보다 비교적 보안이 좋다.
  3. 저장 데이터에 제한이 없다.(서버 용량이 허용하는 한...)
  4. 각 클라이언트 고유 Session ID를 부여한다.
  5. Session ID로 클라이언트를 구분하여 각 클라이언트 요구에 맞는 서비스 제공

2. 세션을 쿠키와 병행하여 사용하는 이유

세션은 보안성이 좋다는 장점이 있다. 그러나 세션만 사용하지 않고 쿠키와 병행해 사용하는 이유는 아래와 같다.

  • 세션은 서버에 저장되고, 서버자원을 사용하기 때문에 사용자가 많을 경우 소모되는 자원이 상당하다.
  • 이러한 자원관리 차원에서 쿠키와 세션을 적절한 요소 및 기능에 병행 사용하여,
    서버 자원의 낭비를 방지하며 웹사이트의 속도를 높일 수 있다.


2. 세션 등록

문법

  1. session_start() : 세션을 사용하는 모든 파일에 반드시 있어야 하는 함수이다.
  2. $_SESSION : 세션의 이름과 그 값을 할당하는 변수이다.
    EX) $_SESSION["username"] = $username;
    == username이라는 세션을 만들건데, 그 값을 $username으로 한다.

예시

<?php // 세션 생성
    session_start();

    print "세션 시작!<p>";

    // SESSION의 변수명은 [ ] 안에. 변수명에 할당된 값은 = 이후에 입력.
    // SESSION은 전역변수이므로, 다른 문서에서도 여기서 할당한 SESSION을 활용할 수 있음.
    $_SESSION['userid'] = "kdhong";
    $_SESSION['username'] = "홍길동";
    $_SESSION['time'] = time(); // 현재시간

    print "3개의 세션 변수 등록 완료. <br>";
    print $_SESSION['userid']."<br>";
    print $_SESSION['username']."<br>";
    print $_SESSION['time']; ?>

3. 세션 삭제

세션 삭제 기능은 로그아웃 버튼을 만들 때 연관이 있다. 세션은 기본적으로 브라우저를 닫으면 사라진다. 하지만 단순 로그아웃을 원하는 사용자 입장에서는 브라우저를 종료하고 다시 실행해야 하는 불편이 있다. 그렇다면 로그아웃 버튼을 만들어 제공하는 것이 좋겠다.

문법

unset() : unset함수를 사용해 세션을 삭제할 수 있다.
EX) unset($_SESSION["username"]) : username이라는 세션을 삭제

에시

<?php // 로그아웃 기능 수행
    session_start();
    unset($_SESSION["username"]); // 세션 삭제
    setcookie("username",""); // 쿠키 삭제
    setcookie("password",""); // 쿠키 삭제
    header("Location:http://localhost:63342/htdocs/ch04/login_form.php");
    ?>

4. 세션을 활용한 로그인/로그아웃 기능 구현

관리자 아이디/비밀번호를 서버에 '지정'해두고, 해당 아이디, 비밀번호가 제대로 입력되었을 때만 로그인 처리를 하는 코드이다.

  • 아이디/비밀번호가 정확히 입력되어야 한다.
    - 로그인 유지 체크박스를 클릭했을 경우, 쿠키를 생성한다.

  • 로그인상태 유지를 위한 세션을 생성한다,

  • 이후 redirect 한다.

  • 만약 아이디/비밀번호가 정확하지 않다면, alert를 띄운다.

How it works?

  1. 로그인 화면

1-1. 로그인 오류 시

  1. 로그인 성공 시(로그인 유지 기능 활성화)

2-1. 쿠키 및 세션 생성 확인


3. 로그아웃(세션, 쿠키 삭제 확인)

코드

로그인 페이지
세션 유무에 따라 사용자에게 각각 다른 페이지를 표시함.

  • 로그인 안할 시(세션 없는 경우) 로그인 페이지
  • 로그인 되어있을 시(세션 있는 경우) 환영/로그아웃 페이지
<?php
session_start();
?>
<!DOCTYPE html>
<html>
    <head lang="ko">
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width">
        <title>
        관리자 로그인 페이지
        </title>
    </head>
    <body>
    <?php
    if(isset($_COOKIE["username"])){
        $_SESSION["username"] = $_COOKIE["username"];
    }

    if (!isset($_SESSION['username'])){
    ?>
    <form action="cookie_setcookie&login.php" method="post">
        <table border="1">
            <tr>
                <td><input type="text" required placeholder="아이디" name="username"></td>
            </tr>
            <tr>
                <td><input type="password" required placeholder="비밀번호" name="password"></td>
            </tr>
            <tr align="center">
                <td>
                    <input type="checkbox" value="yes" name="chkbox">로그인 상태 유지
                    <input type="submit" value="로그인">
                </td>
            </tr>
        </table>
    </form>
    <?php } else {
        print $_SESSION["username"]."님 환영합니다.";?>
        <button><a href="logout.php">로그아웃</a></button>
           <?php } ?>
    </body>
</html>

로그인 처리

<?php
    // 세션 개념도 추가해보기(3, 11번째 줄)
    session_start();

    $username = $_REQUEST["username"];
    $password = $_REQUEST["password"];
//  $chkbox = $_REQUEST["chkbox"]; // 클라이언트가 chkbox를 안 누르고 요청 보내면 Undefined Index 오류 발생. 이를 위해 isset() 사용

    if ($password == "1234" && $username == "admin"){
        // admin 로그인 성공한 경우에만 쿠키생성 / 세션 생성
        
    // isset() -> 'chkbox'라는 변수가 할당된 상태로 왔는지, 안 왔는지를 확인해줌.
    // 기존 =  if ($chkbox != null)
        if (isset($_REQUEST['chkbox'])) {
            $a = setcookie("username", $username, time() + 60);
            $b = setcookie("password", $password, time() + 60); //time() = expire 시간 설정하는 것)
        }
        $_SESSION["username"] = $username;
        header("Location:http://localhost:63342/htdocs/ch04/login_form.php");
        exit;
    } else {
        ?>
        <script>
        alert("관리자 아이디와 비밀번호를 다시 확인해주세요.")
        history.back()
        </script>
    <?php } ?>

로그아웃

<?php
    session_start();
    unset($_SESSION["username"]);
    setcookie("username","");
    setcookie("password","");
    header("Location:http://localhost:63342/htdocs/ch04/login_form.php");
?>
profile

0개의 댓글