php 입문 | 페이지 전환, 쿠키, 세션 | 쿠키 사용의 기본


Web 응용 프로그램은 지속적으로 어떤 정보를 보존해야 하는 경우가 있다. 예를 들어, 로그인 정보를 계속 유지하지 않으면 페이지 어떤 누구인지 알 수 없게 되어 버린다. 그래서 사용자의 정보를 유지하도록 하는 것이 Web 응용 프로그램을 작성하는데 매우 중요하다.

그러기 위해 몇가지가 방법은 있는데, “Web 브라우저 측에 정보를 저장"하는 방법으로 이용되는 것이 “쿠키"이다. 쿠키란, 브라우저에 저장할 수 있는 매우 작은 데이터이다. 쿠키는 Web 사이트마다 세세한 정보를 브라우저에 저장할 수 있다. 여기에 데이터를 보관해두면 필요에 따라 데이터를 꺼내 사용할 수 있는 것이다.

이 쿠키는 그렇게 큰 데이터는 저장할 수 없다. 주의할 점은 “저장할 수 있는 쿠키의 수와 최대 크기는 브라우저마다 다르다"라는 점이다. 대체로 최저 라인으로 “1개의 사이트에 대하여 최대 20 개, 4096 바이트까지"라는 조건은 현재 어떤 브라우저에서도 분명한 것이므로, 이것 이하의 분량이라면 문제 없을 것이다. 쿠키에는 큰 데이터를 저장하는 것은 권장되지 않는다. 브라우저에 저장이 되지 않는 경우가 있다는 것을 잊지 말도록 하자.

이 쿠키를 이용하는 경우, “읽기” 및 “쓰기"로 접근(approach)이 다르므로 주의하자. 우선 쿠키 쓰기(저장)는 이 “setcookie"라는 함수를 이용한다. 이는

setcookie (이름, 값, 폐기 일자);

이런 식으로 지정한다. 첫번째 인자인 이름은 저장하는 쿠키의 이름이다. 이는 적당히 아무거나 붙일 수 있다. 그리고 두번째 인자는 실제 저장되는 값이다. 세 번째 인자는 “그 쿠키를 언제 파기한건지"에 대해 지정한다. 이는 파괴하는 시간을 나타내는 타임 스탬프 (기억 하는가? 1970년 1월 1일부터 계산한 경과 시간 (초)의 값이었다)을 지정한다.

이 파기 일시의 지정은 생략할 수 있다. 생략하거나 0을 지정하면 그 쿠키는 브라우저 종료시 자동으로 삭제된다.

이어서 쿠키 로드이다. 이것은 $_COOKIE라는 PHP의 시스템이 제공하는 연관 배열로 부터 읽어 올 수 있다. 이는

$ 변수 = $ _COOKIE[쿠키 이름];

이런식으로 이름을 지정하고 쿠키를 꺼낼 수 있다. 주의할 것은 $_COOKIE 값을 변경해도 쿠키를 변경할 수 없다 ‘는 점이다. 즉, 값을 읽기 오는 것만 가능하다. 이전에 $_POST 등과 동일하다.

쿠키를 이용해 보자

그럼 쿠키를 이용한 예제를 보도록 하겠다.

<?php
    if ($_POST != null){
        $str = $_POST['text1'];
        setcookie("mycookie",htmlspecialchars($str),time() + 60 * 1);
        header("Location: ./index.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
                $cookie = $_COOKIE['mycookie'];
                echo "쿠키 정보:{$cookie}";
            ?>
        </p>
        <hr>
        <form method="post" action="./index.php">
            <input type="text" name="text1">
            <input type="submit" value="전송">
        </form>
        <hr>
    </body>
</html>

위 예제는 입력 필드에 쓴 텍스트를 쿠키에 저장하는 예이다. 아무거나 써서 보내 보자. 쿠키 정보에 저장된 쿠키의 내용이 표시된다.

여기에서는 쿠키의 저장 및 로드를 각각 다른 태그에 작성되어 있다. 다음 부분이 쿠키 조작을 하고 있는 곳이다.

setcookie("mycookie",htmlspecialchars($str),time() + 60 * 10);

세번째 인수는 time 함수로 현재의 타임 스탬프를 얻어와서, 거기 10분의 초를 더하고 있다. 즉, “10분 후에 파기"하는 설정하였다. 그리고 쿠키 로드는

$cookie = $_COOKIE['mycookie'];

이런식으로 하고 있다. 이것으로 쿠키 값이 로드된다. 만약 그 쿠키가 이미 삭제된 경우에는 값은 null이 된다.

그런데, 쿠키를 이용하는 경우에는 한 가지 주의해야 할 점이 있다. 그것은 “setcookie한 단계에서는 쿠키는 아직 저장되지 않는다"라는 점이다.

쿠키는 HTTP 헤더를 사용하여 주고 받는다. setcookie은 사실 헤더에 쿠키가 저장 추가된다. 그래서 이도 header 함수와 마찬가지로 아직 헤더가 출력되지 않을 때 호출해 주지 않으면 안된다. 헤더가 전송된 후에는 setcookie을 실행해도 쿠키에 저장할 수 없다.

setcookie에서 헤더에 쿠키 정보가 추가되면 그것이 브라우저로 전송되고 브라우저 측에서 읽었을 때 쿠키가 생성 저장된다. 그리고 이후에 해당 사이트의 페이지에 액세스하면 그 때 브라우저의 쿠키 정보를 Web 서버에 보내져 $_COOKIE에 저장된 값을 얻을 수 있게 되는 것이다.

즉, secookie을 수행할 때 쿠키가 아직 존재하지 않고, 다음에 방문했을 때부터 얻을 수 있다. 쿠키의 값을 변경하는 경우에도 마찬가지로 이후에 방문했을 때 변경이 적용된다.

위에 예제 코드를 보면 setcookie한 후에 header 함수를 사용하여 자신에게 페이지 이동하고 있다는 것을 알 수 있을 것이다. 이렇게 하면 쿠키를 저장한 후에 페이지를 다시 방문하여 쿠키를 즉시 사용할 수 있도록하고 있다.