PHP 프로그래밍

본문 바로가기
사이트 내 전체검색


Web Programming >> PHP Programming
[목차]
제15장 PHP에서 쿠키의 동작 원리 이해하기

    1. PHP에서 쿠키의 동작 원리 이해하기

 

1. HTTP 프로토콜의 동작원리

 

어떤 잘나가는 체인점이 체택한 규칙을 보니 가게를 찾은 손님은 오직 한가지 물건만 살 수 있고, 물건 구입이 끝나면 가게 밖을 나갔다 다시 들어와 구입해야 한다고 돼 있습니다. 또한 체인점에서 고용한 점원 들은 건망증이 심한 것인지, 하나 같이 머리가 안좋아서인지 방금 전 물건 사갔던 손님도 알아 보지 못하는 것 같습니다. 웹에서의 통신 규칙인 HTTP는 지금 언급한 체인점의 규칙과 유사합니다.

<그림1> http 동작과정

http는 <그림 1>에서 보여주는 것처럼 요청 메시지 응답 메시지의 전송이 끝나면 바로 연결이 끊어지는 형태로 동작합니다. 여러분이 기억하고 있는 서버에 텔넷으로 접속하고, 다음과 같이 입력해 보세요.

 

[jklee@localhost jklee]$ telnet 127.0.0.1 80

Trying 127.0.0.1 ...
Connected to 127.0.0.1.
Escape character is '^]'.

이렇게 명령어를 입력하면 HTML로 된 문서와 함께 자동으로 연결이 종료되는 과정을 확인할 수 있을 것입니다.

get / http/1.0 <enter>
<enter>

 HTTP/1.1 501 Method Not Implemented

Date: Mon, 13 Aug 2001 02:14:32 GMT

Server: Apache/1.3.14 (Unix)  (Red-Hat/Linux) mod_ssl/2.7.1 OpenSSL/0.9.5a DAV/1

.0.1 PHP/4.0.3pl1 mod_perl/1.24

Allow: GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, PATCH, PROPFIND, PROPPATC

H, MKCOL, COPY, MOVE, LOCK, UNLOCK, TRACE

Connection: close

Content-Type: text/html; charset=iso-8859-1

 

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">

<HTML><HEAD>

<TITLE>501 Method Not Implemented</TITLE>

</HEAD><BODY>

<H1>Method Not Implemented</H1>

get to /index.html not supported.<P>

Invalid method in request get / http/1.0<P>

<HR>

<ADDRESS>Apache/1.3.14 Server at w3.isejong.or.kr Port 80</ADDRESS>

</BODY></HTML>

Connection closed by foreign host.

 

단순해서 좋지만 이런 http동작 방식은 매번 요청할 때마다 새로운 연결을 가져야 한다는 단점을 갖고 있습니다(이 것 때문에 http를 비연결 지향형 프로토콜이라고 표현하기도 하죠). 하지만 웹서버에 도착하는 모든 요청은 서로 어떤 연관성도 갖지 않고, 그 상태를 특별히 저장하고 있지 않다는 점에서 더 큰 문제가 발생합니다. 즉, 웹서버는 그 전에 어떤요청이 있었는가에 대해선 전혀 고려하지 않는, 앞의 건망증 심한 점원 처럼 행동한다는 뜻인데, HTML문서를 전송하는 것이 주목적이었던 웹 초창기 시절에는 이것이 크게 문제 되지 는 않았습니다.

하지만 웹이 차츰 발전하면서 인증 시스템이나 쇼핑 시스템 같은 것을 구축하는  아이디어가 나오기 시작했습니다.  이런 시스템을 구축하기 위해서는 방문객의 신원을 확인하고 연속된 요청의 상태 변화를 추적하고 제어하는 기능이 필요합니다.

 

2. 쿠키란 무엇인가.

간단하게 말해 쿠키는 브라우저에 필요한 정보를 저장하는 일을 할 수 있게 합니다. 쿠키는 서버에 의해 브라우저로 전송되는 정보로서, 브라우저는 쿠키를 받으면 우선 저장한 다음, 서버에 있는 페이지에 요청 메시지를 보낼 때마다 헤더에 쿠키와 관련된 부분을 포함하는 방식으로 http의 상태를 유지할 수 있게 해 줍니다.좀더 자세히 쿠키의 동작을 추적해보면, 쿠키는 서버가 브라우저에 다음과 같은 헤더를 응답 http 헤더에 포함으로써 생성됩니다.

<그림2> http 메시지 구조

Set-Cookie: name=value;

앞의 응답을 받은 브라우저는 우선 name이라는 쿠키를 값과 함께 저장한 후 쿠키를 받은 서버에 요청할 일이 생기면 요청메시지의 http헤더 부분에 다음과 같은 것을 포함시키게 됩니다.

Cookie: name=value;

아래의 프로그램은 서버에서 쿠키를 설정하기 위한 응답 헤더의 작성과 그 다음 요청 헤더 속에 포함되는 쿠키를 찾아내는 모습을 보여주고 있습니다.

 

프로그램 : Cookie01.php

<?
header("Set-Cookie: name=value");

// 요청 http 헤더를 구하는 함수
$headers = getallheaders();

// 두 번째 요청부터 나오는 결과

if(isset($headers["Cookie"])) {
   print("Cookie: ". $headers["Cookie"]. "<br>");
}

//첫번째 요청 때 나오는 결과
else {
   print("Cookie 'name=value'를 보냈습니다.<br>");
}
?>

 

[F5]키나 새로고침 아이콘을 클릭하면, 아래와 같이 나타납니다.

 

이것은 예전 CGI 프로그램에서나 사용하던 방식이라고 볼 수 있지만, 그나마 PHP를 이용했기 때문에 아주 짧은 코드로 보여줄 수 있었습니다.(C로 같은 일을 하기 위해서는 훨씬 긴 코드가 필요합니다.) 한편 요청과 응답 헤더에 포함된 모습은 쿠키의 가장 간단한 형태이고 다른 옵션을 설정할 때는 훨씬 긴 헤더를 보내줘야 하는데, 일일이 이런식으로 쿠키를 처리하는 것은 피하고 싶을 것입니다.

3. PHP에서 쿠키 설정하기

다행히 PHP에서는 쿠키를 보다 편하게 조작하고 알아낼 수 있는 기능을 갖추고 있습니다. 우선 쿠키를 설정하기 위해서 setcookie()라는 함수를 제공합니다. 위의 프로그램(cookie01.php)의 첫 문장을 다음과 같이 보다 알기 편한 형태로 바꿔줄 수 있습니다.

setcookie("name","value");

setcookie()가 쿠키 스펙을 완전하게 만족시키는 것은 아니지만, 일반적인 웹 애플리케이션을 구현하는 데 있어 가장 필요한 기능은 다 갖추고 있으므로 사용하는데 큰 불편함을 느낄 정도는 아닐 것입니다. 다음에 나가는 것은 setcookie()함수의 완전한 형태이며, 어떤 식으로 사용할 것인지에 대한 간략한 설명입니다.

setcookie($name, $value, $expire, $path, $domain, $secure);

$expires는 쿠키의 만료시간을 지정합니다. 디폴트는 0으로 브라우저 종료순간까지 쿠키가 지속됩니다.

//브라우저가 종료되는 순간까지 지속되는 쿠키
setcookie("name","value");
//한시간 동안 지속되는 쿠키
setcookie("name","value",time()+3600);

$path는 쿠키의 유효한 path를 지정합니다. 디폴트는""(빈 문자열)으로 쿠키를 설정한 서버의 모든 path에 있는 스크립트에 쿠키를 보내도록 합니다. 각 path별로 필요한 쿠키만을 받도록 하고 싶을 때 사용합니다.

//쿠키를 설정한 웹서버의 /~jklee/밑에 있는 스크립트들 만이
//이 쿠키를 전송 받을 수 있습니다.
setcookie("name", "value",0, "/~jklee/");

$domain은 쿠키의 유효한 domain을 지정합니다. 디폴트는""(빈 문자열)로 쿠키를 설정한 서버입니다. 다른 웹서버와 쿠키를 공유하고 싶을 때 사용할 수 있습니다.

// "www.leelab.co.kr"의 "/~jklee/"밑에 있는 스크립트만이
//이 쿠키를 받을 수 있습니다.
setcookie("name","value",0,"/~jklee/","www.leelab.co.kr");

$secure는 암호화된 http(https://로 시작하는 URL을 의미)가 아니면 쿠키가 전송되지 않도록 방지할 수 있는 옵션입니다. 디폴트는 0으로 표준 http에서도 쿠키를 보내는 것을 의미합니다.

// 암호화된 http가 아닐 경우 쿠키가 전송되지 않습니다.
setcookie("name","value",0,"","",1);

더 이상 쓸모없게 된 쿠키를 계속 유지시킬 필요는 없겠지요. 다음과 같이 쿠키의 이름만 갖고 setcookie()를 호출해주는 것으로 브라우저에서 삭제할 수 있습니다.

// "name"이라는 쿠키를 브라우저에서 삭제합니다.
setcookie("name");

 

4. 쿠키를 참조하는 방법

브라우저에 쿠키를 설정하기 위해서는 setcookie()를 사용한다는 것을 알아 봤습니다. 그럼 브라우저에서 보내오는 쿠키값을 접근하기 위해서는 어떻게 해야 할까요. cookie01.php프로그램처럼 쿠키와 관련된 헤더를 직접 분석해도 알아낼 수 있겠지만, 무척이나 까다로운 작입이 될 것입니다.

그래서, PHP에서는 쿠키의 이름과 같은 전역변수인 "$쿠키이름"이나 혹은 "$HTTP_COOKIE_VARS["쿠키이름"]"으로 접근할 수 있습니다.(PHP 인터프리터가 요청 메시지의 쿠키관련 헤더를 해석해 자동으로 만들어 줍니다. 하지만, 항상 이 두변수를 사용할 수 있는 것은 아닙니다. 만일 여러분의 php.ini 설정 파일에 "register_globals=Off"라고 돼 있다면 전역변수인 "$쿠키이름"으로는 쿠키에 접근할 수 없고, "track_var = Off"라고 돼 있다면, "http_COOKIE_VARS["쿠키이름"]으로도 접근할 수 없습니다. 따라서, 최소한 track_vars옵션 만을 On 상태로 설정해 줘야겠조(4.0.3버전이후에는 track_vars가 항상 On으로 설정됩니다.

주의 할 점은 이값은 읽기 전용으로 쓰기를 할 수 없다는 것입니다. 정확히 말하면 가능은 하지만, 브라우저에 있는 쿠키에 영향을 끼치지  않는 다고 해야 할 것 같군요. 프로그램(cookie02.php)에서 보여주는 것 처럼 브라우저의 쿠키는 어디까지나 setcookie()함수로 바꿔줘야 합니다. 그리고 지금까지 쿠키의 동작을 말로 설명한 것이 잘 이해가 안된다면 <그림3>을 참고하기 바랍니다.

<그림3> PHP에서 쿠키가 처리되는 과정

 

프로그램 : Cookie02.php

<?
setcookie("test","testing value start");
setcookie("count",++$HTTP_COOKIE_VARS["count"]);

//두 번째 요청부터 나오는 결과
if(isset($HTTP_COOKIE_VARS["count"])) {
//클라이언트의 쿠키에 반영됩니다.
//요청된 시점의 스크립트에는 반영되지 않습니다.
setcookie("test","testing value ",$HTTP_COOKIE_VARS["count"]);
print "test=".$HTTP_COOKIE_VARS["test"]."<br>";

// 클라이언트의 쿠키에 반영되지 않습니다.
//요청된 시점의 스크립트에는 반영됩니다.

$HTTP_COOKIE_VARS["test"]="No Effect";
print "test=".$HTTP_COOKIE_VARS["test"]."<br>";

}
//첫번째 요청 때 나오는 결과
else {
    print("Cookie 'test'를 보냈습니다.");
}

?>

 

5. 쿠키를 사용할 때 주의 할점

PHP에서 쿠키를 다룰 때 주의할 점을 다음과 같이 정리해 봤습니다.

  • setcookie()를 호출하기 까지는 어떤 출력도 브라우저로 전송돼서는 안됩니다.(header()함수를 사용할 때와 같습니다.)
  • 처음 setcookie()를 호출하는 시점에는 $HTTP_COOKIE_VARS에 반영되지 않고, 다음 요청이 이뤄질 때 반영됩니다.
  • register_globals가 On으로 설정하고 쿠키 변수를 전역변수로 접근하는 것은 문제가 생길 소지가 있습니다.
  • $HTTP_COOKIE_VARS의 값을 바꾸는 것은 브라우저의 쿠키값에 아무런 영향을 끼치지 않습니다.
  • setcookie()의 value매개변수에 배열을 사용할 수 없습니다.

앞의 주의할 점 가운데 배열에 대한 부분을 미처 설명하지 못했군요. 그럼 쿠키 배열을 사용하는 방법에 대해 설명하지요

 

6. 쿠키배열 사용하기

하나의 쿠키는 4KB까지 저장되고, 도메인 혹은 서버 당 20개 까지만 허용됩니다.(크라우저가 받아들일 수 있는 쿠키는 총 300개입니다.) 그래서 아주 작은 크기의 값을 가진 쿠키를 무작위로 남발하다 보면 20개라는 제한에 걸리므로, 좀더 효율적으로 쿠키를 관리할 필요가 있습니다. 그런 이유로 쿠키에 배열을 사용하게 되었는데, 프로그램(cookie_array.php)처럼 해야 합니다.

프로그램 : cookie_array.php

<?
//"foo"라는 쿠키를 1차 배열로 만들어 줍니다.
setcookie("foo[1]","value 1");
setcookie("foo[2]","value 2");
setcookie("foo[3]","value 3");
 
//"bar"라는 쿠키를 2차 배열로 만들어 줍니다.
setcookie("bar[0][1]","value 1");
setcookie("bar[0][2]","value 2");
setcookie("bar[1][1]","value 3");
setcookie("bar[1][2]","value 4");
 
//"foo"와 "bar"라는 쿠키가 배열로 해석된다는 점에 주목
if($HTTP_COOKIE_VARS["foo"] && $HTTP_COOKIE_VARS["bar"]) {
    print "Cookie foo<br>";
    foreach($HTTP_COOKIE_VARS["foo"] as $key => $value) {
        print "$key => $value<br>";
    }

    print "Cookie bar<br>";
    foreach($HTTP_COOKIE_VARS["bar"] as $key1 => $value1) {
        print "$key1 : ";
        foreach($value1 as $key2 => $value2) {
            print "$key2 => $value2<br>";
        }
    }
}
else {
    print "쿠키를 보냈습니다.";
}

?>

 

하지만, 여러분으로서는 하고 싶지 않은 일일 것입니다. 다행히 배열 크기가 작은 경우는 별로 문제가 않되겠지만, 그렇지 않은 경우는 심각해질 정도로 코드가 길어지기 때문입니다. 이에 대한 해결책은 모든 차원의 배열을 하나하나 분석해 들어가면서 setcookie()를 자동으로 호출하는 함수를 작성하는 방법을 우선 생각해 낼 수 있을 것입니다. 이방식은 $HTTP_COOKIE_VARS에서 바로 쿠키값을 추출할 수 있다는 장점이 있지만, 반복문을 돌면서 setcookie()를 호출하기 때문에 설정하는데 걸리는 시간이 길어진다는 단점이 있습니다.

그래서 다른 방법을 권유하고 싶은데, serialize()와 un serialize()함수의 사용입니다. 이 방법은 쿠키의 공간을 약간 더 낭비하고 $HTTP_COOKIE_VARS에서 바로 원하는 쿠키 값을 얻어 낼 수 없다는 단점이 있지만, 설정하는 데 걸리는 시간은 전자 보다 빠릅니다. 프로그램(class.cookie.php)는 후자를 채택한 쿠키 클래스이며, set(), get(), delete()메쏘드의 사용 방법은 프로그램(use_cookie_class.php)를 보고 참고하기 바랍니다. 그리고, class.cookie.php 프로그램은 아직 까지 배열에 대한 문제만을 해결하고 있지만, 좀더 신경을 써서 작성한다면, 나머지 주의 할 점도 해결하도록 작성할 수 있을 것입니다.

프로그램 : class.cookie.php

<?
class Cookie{

//쿠키를 설정합니다.
//serialize된 값이 4KB가 넘으면, false를 반환합니다.

function set($name,$value,$expire=0,$path="",$domain="",$sceure=0) {

    $value = serialize($value);
    if(4096 < strlen($value)) {
        return false;
    } else {
        return setcookie($name, $value,$expire,$path,$domain,$secure);
    }
}

// 쿠키값을 가져 옵니다.
// 해당하는 이름의 쿠키가 없을 경우 false를 반환합니다.

function get($name) {
    global $HTTP_COOKIE_VARS;

    if($HTTP_COOKIE_VARS[$name]) {
        return unserialize($HTTP_COOKIE_VARS[$name]);
    }else {
        return false;
    }
}

//해당하는 이름의 쿠키를 삭제합니다.

function delete($name) {
    setcookie($name);
}

}
// Cookie Class end

?>

 

프로그램 : use_cookie_class.php

<?
require_once("class.cookie.php");

$array = array(0 => array(1,2,3), 1 => array(1,2,3), 2 => array(1,2,3));

//현재 시점에서 쿠키 "foo"값을 가져 옵니다.
$foo = Cookie::get("foo");

// 쿠키 "foo"가 설정돼 있는 경우
if($foo) {
    // ob_*계열의 함수로 header()와 setcookie()관련 함수의 출력이
    // 선행되어서는 안된다는 문제점을 해결할 수 있습니다.
    ob_start();

    foreach($foo as $key1 => $value1) {
        print "$key1: ";
        foreach($value1 as $key2 => $value2) {
            print "$key2 => $value2 <br>";
        }
    }

    Cookie::delete("foo");
    print "쿠키 foo를 삭제했습니다.";

    ob_end_flush();
} // 쿠키 "foo"가 설정돼 있지 않은 경우
else {
    // 쿠키 foo를 설정한다.
    Cookie::set("foo", $array);

    print "쿠키 foo를 보냈습니다.";
}

?>

 

7. 쿠키의 단점

쿠키는 http의 비상태성을 극복하는데 여러모로 쓸모가 많지만 다음과 같은 단점 또한 갖고 있습니다.

  • 하나의 도메인이나 서버에 대해 브라우저가 저장할 수 있는 크기가 한정돼 있습니다.(도메인 혹은 서버당 80KB까지 만 허용됩니다.)
  • 브라우저의 요청 http 헤더에 쿠키가 포함되므로 크기가 커지면 요청과 응답에 걸리는 시간이 길어집니다.(요청 헤더에 매번 80KB를 갖는 정보가 매번 포함된다는 사실을 상상해 보세요).
  • 웹서버는 자신이 보낸 쿠키를 기억하지 못하므로 http 헤더에 포함된 쿠키 관련 부분이 조작된 것인지도 알 수 없으며, 이것은 보안 문제를 유발시킬 수 있습니다.

앞에서 언급한 단점 중 세 번째는 매우 주의해야 할 문제입니다. 다음과 같이 간단히 name에 해당하는 쿠키값을 출력하는 코드를 생각해 봅시다.

프로그램명 : cookie.php

<? print $HTTP_COOKIE_VARS["name"]."\n"; ?>

 

 

텔넷으로 앞의 코드에 쿠키 값을 조작한 요청 헤더를 전송한 후의 결과를 보여주는 화면을 보면서 쿠키를 인증에 사용하고 있는 독자라면 아마 식은 땀을 흘리고 있지 않을 까 싶군요. 보다시피 아주 간단하게 쿠키값을 조작할  수 있다는 것을 알 수 있습니다. 그래서 쿠키를 보안에 민감한  영역에 사용하고 싶다면 쿠키 값을 설정하기 전에 인코딩하고 값을 참조할 대는 디코딩하는 과정을 거칠 필요가 있습니다.

화면 : 쿠키를 조작하는 모습

;;; 클라이언트에 의해 조작되는 쿠키가 포함된 요청 메시지

[jklee@w3 public_html]$ telnet 127.0.0.1 80

Trying 127.0.0.1...

Connected to 127.0.0.1.

Escape character is '^]'.

GET /~jklee/cookie.php http/1.0

Cookie: name=faked_value

 

;; 조작된 쿠키를 믿어 버리는 웹서버의 응답 메시지

HTTP/1.1 200 OK

Date: Mon, 13 Aug 2001 02:41:52 GMT

Server: Apache/1.3.14 (Unix)  (Red-Hat/Linux) mod_ssl/2.7.1 OpenSSL/0.9.5a DAV/1

.0.1 PHP/4.0.3pl1 mod_perl/1.24

X-Powered-By: PHP/4.0.3pl1

Connection: close

Content-Type: text/html

 

faked_value

Connection closed by foreign host.

[jklee@w3 public_html]$

 

8. 안전하게 쿠키 인코딩하는 법

쿠키에 배열을 쓰는 문제와 전역변수로 쿠키를 접근할 때의 문제점등은 앞의 예제에서 기본적으로 해결된 상태였습니다.

그러나 쿠키를 설정한 후 바로 반영되지 않는 문제는 여전남아 있습니다. 이것은 set()메쏘드와 delete()메쏘드에서 $HTTP_COOKIE_VARS에 직접 값을 쓰고 지우는 코드를 삽입하면 됩니다.

다음의 리스트에 어떤 차이가 있는지 확인해보시기 바랍니다.

파일명 : class.Cookie.v1.php

<?php

// set(), deleter() 메소드에서 $HTTP_COOKIE_VARS에 직접

// 값을 집어넣고 삭제하고 get() 메소드를 통해 참조한다.

 

 

class Cookie {

    

    // 쿠키를 설정한다.

    // serialize된 값이 4k가 넘으면 false를 반환한다.

    function set($name, $value, $expire=0, $path="", $domain="", $secure=0) {

        global $HTTP_COOKIE_VARS;

        

        $value = serialize($value);

     

        if (4096 < strlen($vlaue)) {

            return false;

        }

        else {        

            $HTTP_COOKIE_VARS[$name] = $value;

            return setcookie($name, $value, $expire, $path, $domain, $secure);

        }

    }

    

    // 쿠키값을 가져온다.

    // 해당하는 이름의 쿠키가 없을 경우 false를 반환한다.

    function get($name) {

        global $HTTP_COOKIE_VARS;

        

        if ($HTTP_COOKIE_VARS[$name]) {

            return unserialize($HTTP_COOKIE_VARS[$name]);

        }

        else {

            return false;

        }

    }

    

    // 해당하는 이름의 쿠키를 삭제한다.

    function delete($name) {

        global $HTTP_COOKIE_VARS;

        

        $HTTP_COOKIE_VARS[$name] = null;

        $$name = null;

        setcookie($name);

    }

}

 

?>

 

 

파일명 : cookieClass.php

<?php

 

require_once("class.Cookie.v1.php");

 

 

// Cookie 클래스를 사용했을 경우

$foo = Cookie::get("foo") + 1;

Cookie::set("foo", $foo);

$foo = Cookie::get("foo");

 

 

// setcookie()와 $HTTP_COOKIE_VARS를 이용한 경우

$bar = $HTTP_COOKIE_VARS["bar"] + 1;

setcookie("bar", $bar);

$bar = $HTTP_COOKIE_VARS["bar"];

 

 

// Cookie 클래스의 set() 메소드는 바로 값이 반영되지만,

// setcookie()의 경우 그렇지 않다는 것을 알 수 있다.

print "\$foo = $foo, \$bar = $bar<br>";

 

?>

 

 

아래의 리스트를 통해 좀더 안전해진 여러분의 쿠키를 학인해보기 바랍니다. 여기서 좀더 정교한 암호화 루틴을 사용하고 싶은 독자는 수정해서 사용하기 바랍니다.

 

파일명 : class.Cookie.v2.php

<?php

// base64방식의 인코딩과 디코딩을 수행하고 있다.

 

 

class Cookie {

    

    // 쿠키를 설정한다.

    // serialize된 값이 4k가 넘으면 false를 반환한다.

    function set($name, $value, $expire=0, $path="", $domain="", $secure=0) {

        global $HTTP_COOKIE_VARS;

        

        $value = base64_encode(serialize($value));

        

        if (4096 < strlen($vlaue)) {

            return false;

        }

        else {        

            $HTTP_COOKIE_VARS[$name] = $value;

            return setcookie($name, $value, $expire, $path, $domain, $secure);

        }

    }

    

    // 쿠키값을 가져온다.

    // 해당하는 이름의 쿠키가 없을 경우 false를 반환한다.

    function get($name) {

        global $HTTP_COOKIE_VARS;

        

        if ($HTTP_COOKIE_VARS[$name]) {

            return unserialize(base64_decode($HTTP_COOKIE_VARS[$name]));

        }

        else {

            return false;

        }

    }

    

    // 해당하는 이름의 쿠키를 삭제한다.

    function delete($name) {

        global $HTTP_COOKIE_VARS;

        

        $HTTP_COOKIE_VARS[$name] = null;

        $$name = null;

        setcookie($name);

    }

}

 

?>

 

 

파일명 : encode_cookie.php

<?php

 

require("class.Cookie.v2.php");

 

$foo = "남에게 그대로 보이기 싫은 문자열입니다.";

 

Cookie::set("foo", $foo);

 

print "인코딩 이전의 값: " . $foo . "<br>";

print "인코딩 이후의 값: " . $HTTP_COOKIE_VARS["foo"] . "<br>";

print "디코딩 이후의 값: " . Cookie::get("foo") . "<br>";

 

?>

 

 

http의 비상태성을 해결하는 방법으로 쿠키에 대해 알아봤지만, 이것이 전부는 아닙니다. 쿠키와 비슷하지만 서버측에 정보를 저장한다는 점에서 근본적으로 틀린 "세션"이라는 것도 있습니다.

여기까지 쿠키에 대해 알아보았습니다.

 

[목차]

개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

TEL. 063-469-4551 FAX. 063-469-4560 전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과

Copyright © www.leelab.co.kr. All rights reserved.