setcookie

(PHP 3, PHP 4 , PHP 5)

setcookie -- 쿠키를 전송합니다.

설명

bool setcookie ( string name [, string value [, int expire [, string path [, string domain [, int secure]]]]])

setcookie()는 HTTP 헤더에 쿠키를 전송하도록 설정합니다. 다른 헤더와 마찬가지로, 쿠키는 스크립트의 다른 출력에 앞서서 보내져야 합니다. (이는 프로토콜 제한입니다) <html>, <head> 태그뿐이 아니라, 공백을 포함한 어떠한 출력보다 앞서서 호출할 필요가 있습니다. 이 함수를 호출하기 전에 출력이 존재하면, setcookie()는 실패하고 FALSE를 반환합니다. setcookie()이 성공적으로 작동하면, TRUE를 반환합니다. 이는 사용자가 쿠키를 허용했는가를 의미하는 것은 아닙니다.

참고: PHP 4에서, 전송하기 전까지 브라우저에 대한 모든 출력 오버헤드를 서버 버퍼에 넣는 출력 버퍼링을 사용하여 이 함수를 호출 하기 전에 출력을 보낼 수 있습니다. 스크립트에서 ob_start()ob_end_flush()를 호출하거나, php.ini나 서버 설정 파일에서 output_buffering을 설정해서 이를 사용할 수 있습니다.

name 인자를 제외한 모든 인자는 선택적입니다. 어떠한 인자를 교체할 때, 빈 문자열("")을 사용하여 다른 인자들을 넘어갈 수 있습니다. expiresecure 인자는 정수형이기 때문에, 빈 문자열로 넘어갈 수 없고, 대신 제로(0를 사용합니다. 다음 표는 setcookie() 함수의 각 인자를 설명합니다. 각각의 setcookie() 인자가 어떻게 작동하는지에 대한 정의는 넷스케이프 쿠키 규격를 읽어보고, HTTP 쿠키 작동에 대한 추가 정보는 RFC 2965를 읽어보십시오.

표 1. setcookie() 인자 설명

인자설명예제
name 쿠키의 이름. 'cookiename'은 $_COOKIE['cookiename']으로 호출합니다.
value 쿠키의 값. 이 값은 클라이언트 컴퓨터에 저장됩니다; 민감한 정보를 저장하지 마십시오. name이 'cookiename'이라면, 이 값은 $_COOKIE['cookiename']을 통해서 얻어집니다.
expire 쿠키 만료 시간. 에포치로부터의 초수를 나타내는 유닉스 타임스탬프입니다. 보통, time() 함수에 원하는 만료 시간을 더해서 설정합니다. 혹은 mktime()을 사용할 수 있습니다. time()+60*60*24*30은 쿠키가 30일 후에 만료하도록 합니다. 지정하지 않으면, 쿠키는 세션 종료시(브라우저를 닫을 때)에 만료됩니다.
path 이 쿠키를 사용할 수 있는 서버 경로. '/'로 지정하면, 이 쿠키는 domain 전체에서 사용할 수 있습니다. '/foo/'로 설정하면, domain/foo/ 디렉토리 안과 /foo/bar/ 등의 서브 디렉토리 안에서 사용할 수 있습니다. 기본값은 쿠키를 설정하는 현재 디렉토리입니다.
domain 이 쿠키를 사용할 수 있는 도메인. example.com의 모든 서브도메인에서 이 쿠키를 사용할 수 있게 하려면, '.example.com'로 설정해야 합니다. .은 필수는 아니지만, 많은 브라우저와 호환되게 합니다. www.example.com로 지정하면, 이 쿠키는 www 서브도메인에서만 사용할 수 있습니다. 상세는 규격의 tail matching을 참고하십시오.
secure 쿠키가 보안 HTTPS 접속에만 허용할 지를 지정합니다. 1로 설정하면, 쿠키는 보안 연결이 존재할 때만 설정됩니다. 기본값은 0입니다. 0이나 1

쿠키를 한번 설정하면, 다음 페이지 로드에서 $_COOKIE$HTTP_COOKIE_VARS 배열을 통해서 접근할 수 있습니다. $_COOKIE과 같은 자동 전역은 PHP 4.1.0부터 사용할 수 있는 점에 주의하십시오. $HTTP_COOKIE_VARS은 PHP 3부터 존재해왔습니다. 쿠키값은 $_REQUEST에도 존재합니다.

참고: PHP 지시어 register_globalson으로 설정하면 쿠키값은 변수로도 만들어집니다. 아래의 예제에서, $TextCookie이 존재합니다. $_COOKIE을 사용하기를 권장합니다.

일반적인 함정:

PHP 3에서, 동일한 스크립트에서 복수의 setcookie() 호출은 역순으로 실행되었습니다. 하나의 쿠키를 지우고 다른 것을 설정하려면 삭제하기 전에 추가를 놓았어야만 합니다. PHP 4에서는, setcookie()의 복수 호출은 호출한 순서에 따라 처리합니다.

쿠키를 보내는 몇가지 예제:

예 1. setcookie() 전송 예제

<?php
$value
= 'something from somewhere';

setcookie("TestCookie", $value);
setcookie("TestCookie", $value,time()+3600);  /* 1시간 뒤에 만료 */
setcookie("TestCookie", $value,time()+3600, "/~rasmus/", ".example.com", 1);
?>

쿠키 값은 쿠키를 전송할때 자동적으로 URL 인코드하고, 받을때 자동적으로 디코드해서 쿠키 이름과 같은 이름을 가지는 변수로 연결되는 점에 주의하십시오. 이 작동을 피하고 싶다면, PHP 5에서 setrawcookie()를 사용할 수 있습니다. 스크립트 안에서 쿠키의 내용을 보려면, 다음 예제 중 하나를 사용하십시오:

<?php
// 개별 쿠키의 출력
echo $_COOKIE["TestCookie"];
echo
$HTTP_COOKIE_VARS["TestCookie"];

// 모든 쿠키를 보는 디버그/테스트 방법
print_r($_COOKIE);
?>

쿠키를 삭제할때, 브라우저가 삭제 메카니즘을 작동하도록 만료 날짜를 과거로 지정해야만 합니다. 이전의 예제에서 보낸 쿠키를 삭제하는 예제입니다:

예 2. setcookie() 삭제 예제

<?php
// 만료 날짜를 한시간전으로 설정
setcookie ("TestCookie", "", time() - 3600);
setcookie ("TestCookie", "", time() - 3600, "/~rasmus/", ".example.com", 1);
?>

쿠키 이름에 배열 첨자를 사용해서 배열 쿠키를 설정할 수 있습니다. 배열 요소의 수 만큼의 쿠키를 설정하는 효과를 가지고, 쿠키가 스크립트에 받아들여질때, 값은 쿠키 이름의 배열 안에 위치하게 됩니다:

예 3. setcookie()와 배열

<?php
// 쿠키를 설정
setcookie("cookie[three]", "cookiethree");
setcookie("cookie[two]", "cookietwo");
setcookie("cookie[one]", "cookieone");

// 페이지가 리로드된 뒤에, 출력
if (isset($_COOKIE['cookie'])) {
    foreach (
$_COOKIE['cookie'] as $name => $value) {
        echo
"$name : $value <br />\n";
    }
}
?>

출력은

three : cookiethree
two : cookietwo
one : cookieone

참고: 쿠키에 관한 상세한 정보는 http://www.netscape.com/newsref/std/cookie_spec.html의 넷스케이프 쿠키 규격과 RFC 2965를 참고하십시오.

참고 문서에 따르면 expire 인자는 유닉스 타임스탬프가 아닌, Wdy, DD-Mon-YYYY HH:MM:SS GMT 날짜 형식이여야 합니다. 이는 PHP가 내부적으로 변환을 하기 때문입니다.

참고: Microsoft Internet Explorer 4 서비스팩 1은 path 인자가 지정되었을 때 쿠키를 정상적으로 처리하지 못합니다.

넷스케이프 커뮤니케이터 4.05와 Microsoft Internet Explorer 3.x는 경로와 시간을 설정하지 않았을 때 쿠키를 비정상적으로 처리합니다.

참고: header(), setrawcookie(), 쿠키 섹션.