Network setcookie

(PHP 4, PHP 5, PHP 7, PHP 8)

setcookie — Send a cookie


설명

setcookie(
    string $name,
    string $value = "",
    int $expires_or_options = 0,
    string $path = "",
    string $domain = "",
    bool $secure = false,
    bool $httponly = false
): bool
                

PHP 7.3.0부터 사용 가능한 대체 서명(명명된 매개변수에서는 지원되지 않음):

setcookie(string $name, string $value = "", array $options = []): bool

setcookie()는 나머지 HTTP 헤더와 함께 보낼 쿠키를 정의합니다. 다른 헤더와 마찬가지로 쿠키는 스크립트의 출력보다 먼저 전송되어야 합니다(프로토콜 제한 사항임). 이를 위해서는 <html><head> 태그와 공백을 포함하여 출력 전에 이 함수를 호출해야 합니다.

쿠키가 설정되면 $_COOKIE 배열을 사용하여 다음 페이지 로드 시 쿠키에 액세스할 수 있습니다. 쿠키 값은 $_REQUEST에도 존재할 수 있습니다.


매개변수

» RFC 6265는 각 setcookie() 매개변수가 해석되는 방식에 대한 규범적 참조를 제공합니다.

name
쿠키의 이름입니다.
value
쿠키의 값입니다. 이 값은 클라이언트 컴퓨터에 저장됩니다. 민감한 정보를 저장하지 마십시오. name'cookiename'이라고 가정하면 이 값은 $_COOKIE['cookiename']을 통해 검색됩니다.
expires_or_options
쿠키가 만료되는 시간입니다. 이것은 Unix 타임스탬프이므로 Epoch 이후의 초 단위입니다. 이를 설정하는 한 가지 방법은 time()) 호출 결과에 쿠키가 만료되기 전까지의 시간(초)을 추가하는 것입니다. 예를 들어 time()+60*60*24*30은 쿠키가 30일 후에 만료되도록 설정합니다. 또 다른 옵션은 mktime() 함수를 사용하는 것입니다. 0으로 설정하거나 생략하면 쿠키는 세션이 끝날 때(브라우저가 닫힐 때) 만료됩니다.

메모: 날짜 형식 Wdy, DD-Mon-YYYY HH:MM:SS GMT와 달리 expires_or_options 매개변수는 Unix 타임스탬프를 취하는 것을 알 수 있습니다. 이는 PHP가 내부적으로 이 변환을 수행하기 때문입니다.

path
쿠키를 사용할 수 있는 서버의 경로입니다. '/'로 설정하면 전체 domain 내에서 쿠키를 사용할 수 있습니다. '/foo/'로 설정하면 쿠키는 /foo/ 디렉토리 및 domain/foo/bar/와 같은 모든 하위 디렉토리에서만 사용할 수 있습니다. 기본값은 쿠키가 설정되는 현재 디렉토리입니다.
domain
쿠키를 사용할 수 있는 (하위) 도메인입니다. 이를 하위 도메인(예: 'www.example.com')으로 설정하면 해당 하위 도메인과 그 하위 도메인(예: w2.www.example.com)에서 쿠키를 사용할 수 있습니다. 전체 도메인(모든 하위 도메인 포함)에서 쿠키를 사용할 수 있도록 하려면 값을 도메인 이름(이 경우 'example.com')으로 설정하기만 하면 됩니다.

더 이상 사용되지 않는 » RFC 2109를 구현하는 이전 브라우저에는 선행 . 모든 하위 도메인과 일치합니다.

secure
쿠키가 클라이언트의 보안 HTTPS 연결을 통해서만 전송되어야 함을 나타냅니다. true로 설정하면 보안 연결이 있는 경우에만 쿠키가 설정됩니다. 서버 측에서 보안 연결(예: $_SERVER["HTTPS"] 관련)에서만 이러한 종류의 쿠키를 보내는 것은 프로그래머의 몫입니다.
httponly
true인 경우 쿠키는 HTTP 프로토콜을 통해서만 액세스할 수 있습니다. 즉, JavaScript와 같은 스크립팅 언어에서 쿠키에 액세스할 수 없습니다. 이 설정이 XSS 공격을 통한 신원 도용을 줄이는 데 효과적으로 도움이 될 수 있다고 제안되었지만(모든 브라우저에서 지원되지는 않음) 해당 주장은 종종 논란의 여지가 있습니다. true 또는 false
options
expires, path, domain, secure, httponlysamesite 중 하나가 있을 수 있는 연관 배열입니다. 다른 키가 있으면 E_WARNING 수준의 오류가 생성됩니다. 값은 이름이 같은 매개변수에 대해 설명된 것과 동일한 의미를 갖습니다. samesite 요소의 값은 None, Lax 또는 Strict여야 합니다. 허용된 옵션이 지정되지 않은 경우 해당 기본값은 명시적 매개변수의 기본값과 동일합니다. samesite 요소가 생략되면 SameSite 쿠키 속성이 설정되지 않습니다.

반환 값

이 함수를 호출하기 전에 출력이 존재하면 setcookie()는 실패하고 false를 반환합니다. setcookie()가 성공적으로 실행되면 true를 반환합니다. 이것은 사용자가 쿠키를 수락했는지 여부를 나타내지 않습니다.


변경 로그

버전 설명
7.3.0 options 배열을 지원하는 대체 서명이 추가되었습니다. 이 서명은 SameSite 쿠키 속성 설정도 지원합니다.

Examples

몇 가지 예는 쿠키를 보내는 방법을 따릅니다.

예제 #1 setcookie() 보내기 예제

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

setcookie("TestCookie", $value);
setcookie("TestCookie", $value, time()+3600);  /* expire in 1 hour */
setcookie("TestCookie", $value, time()+3600, "/~rasmus/", "example.com", 1);
?>
                  
                

쿠키의 값 부분은 쿠키를 보낼 때 자동으로 urlencoded가 되고, 쿠키를 받으면 자동으로 디코딩되어 쿠키 이름과 같은 이름의 변수에 할당됩니다. 이것을 원하지 않으면 대신 setrawcookie()를 사용할 수 있습니다. 스크립트에서 테스트 쿠키의 내용을 보려면 다음 예 중 하나를 사용하십시오.

                  
<?php
// Print an individual cookie
echo $_COOKIE["TestCookie"];

// Another way to debug/test is to view all cookies
print_r($_COOKIE);
?>
                  
                

예제 #2 setcookie() 삭제 예제

쿠키를 삭제할 때 만료 날짜가 과거인지 확인하여 브라우저에서 제거 메커니즘을 실행해야 합니다. 예는 이전 예에서 보낸 쿠키를 삭제하는 방법을 따릅니다.

                  
<?php
// set the expiration date to one hour ago
setcookie("TestCookie", "", time() - 3600);
setcookie("TestCookie", "", time() - 3600, "/~rasmus/", "example.com", 1);
?>
                  
                

예제 #3 setcookie() 및 배열

쿠키 이름에 배열 표기법을 사용하여 배열 쿠키를 설정할 수도 있습니다. 이렇게 하면 배열 요소 수만큼 쿠키를 설정하는 효과가 있지만 스크립트에서 쿠키를 받으면 값이 모두 쿠키 이름과 함께 배열에 배치됩니다.

                  
<?php
// set the cookies
setcookie("cookie[three]", "cookiethree");
setcookie("cookie[two]", "cookietwo");
setcookie("cookie[one]", "cookieone");

// after the page reloads, print them out
if (isset($_COOKIE['cookie'])) {
    foreach ($_COOKIE['cookie'] as $name => $value) {
        $name = htmlspecialchars($name);
        $value = htmlspecialchars($value);
        echo "$name : $value <br />\n";
    }
}
?>
                  
                

위의 예는 다음을 출력합니다.

three : cookiethree
two : cookietwo
one : cookieone
                

참고: 쿠키 이름의 일부로 [ 및 ]와 같은 구분 문자를 사용하는 것은 RFC 6265, 섹션 4를 준수하지 않지만 RFC 6265, 섹션 5에 따라 사용자 에이전트에서 지원해야 합니다.


메모

메모: 이 함수를 호출하기 전에 출력 버퍼링을 사용하여 출력을 보낼 수 있습니다. 브라우저에 대한 모든 출력의 오버헤드는 보낼 때까지 서버에서 버퍼링됩니다. 스크립트에서 ob_start()ob_end_flush()를 호출하거나 php.ini 또는 서버 구성 파일에서 output_buffering 구성 지시문을 설정하여 이를 수행할 수 있습니다.

일반적인 함정:

  • 쿠키가 표시되어야 하는 페이지가 다음에 로드될 때까지 쿠키가 표시되지 않습니다. 쿠키가 성공적으로 설정되었는지 테스트하려면 쿠키가 만료되기 전에 다음 로딩 페이지에서 쿠키를 확인하십시오. 만료 시간은 expires_or_options 매개변수를 통해 설정됩니다. 쿠키의 존재를 디버그하는 좋은 방법은 단순히 print_r($_COOKIE);을 호출하는 것입니다.
  • 쿠키는 설정된 것과 동일한 매개변수를 사용하여 삭제해야 합니다. 값 인수가 빈 문자열이고 다른 모든 인수가 setcookie에 대한 이전 호출과 일치하면 지정된 이름의 쿠키가 원격 클라이언트에서 삭제됩니다. 이는 값을 'deleted'으로 설정하고 만료 시간을 과거로 설정하여 내부적으로 달성됩니다.
  • false 값으로 쿠키를 설정하면 쿠키를 삭제하려고 하므로 부울 값을 사용하면 안 됩니다. 대신 false이면 0, true이면 1을 사용하십시오.
  • 쿠키 이름은 배열 이름으로 설정할 수 있으며 PHP 스크립트에서 배열로 사용할 수 있지만 별도의 쿠키는 사용자 시스템에 저장됩니다. 여러 이름과 값을 가진 하나의 쿠키를 설정하려면 explode()을 고려하십시오. 이 목적으로 serialize()를 사용하지 않는 것이 좋습니다. 보안 허점이 생길 수 있기 때문입니다.

setcookie()에 대한 여러 호출은 호출된 순서대로 수행됩니다.


기타