PHP에서 내 웹 사이트의 모든 쿠키를 삭제하는 방법


92

사용자가 로그 아웃을 클릭 할 때 내 웹 사이트의 쿠키를 모두 삭제할 수 있는지 궁금합니다.이 기능을 사용하여 쿠키를 삭제했지만 제대로 작동하지 않기 때문입니다.

setcookie("user",false);

PHP에서 한 도메인의 쿠키를 삭제하는 방법이 있습니까?


대부분의 경우 더 나은 아이디어는 쿠키를 더 현명하게 선택적으로 사용하는 것입니다. 세션을 사용하는 경우 하나의 쿠키로 충분합니다. 어쨌든, 설정 한 쿠키를 추적하면 쿠키를 반복하고 삭제하는 동적 방법이 필요하지 않습니다.
caw

답변:


172

PHP setcookie ()

해당 페이지에서 가져 오면 도메인에 대한 모든 쿠키가 설정 해제됩니다.

// unset cookies
if (isset($_SERVER['HTTP_COOKIE'])) {
    $cookies = explode(';', $_SERVER['HTTP_COOKIE']);
    foreach($cookies as $cookie) {
        $parts = explode('=', $cookie);
        $name = trim($parts[0]);
        setcookie($name, '', time()-1000);
        setcookie($name, '', time()-1000, '/');
    }
}

http://www.php.net/manual/en/function.setcookie.php#73484


9
나는 그 주석을 읽었지만 HTTP_COOKIE값을 사용하는 것이 $_COOKIE배열을 반복하는 것보다 나은 이유를 알지 못합니다 . 그 이유가 있습니까? 나에게 그것은 파서에 대해 더 많은 (이중) 작업처럼 보입니다.
찌르기

내가 말할 수있는 한 차이는 없습니다 (추가 작업 제외).
jasonbar

11
@poke : 쿠키 이름이 배열 표기법 인 경우, 예 : user [username] 그러면 PHP는 자동으로 $ _COOKIE에 해당 배열을 만듭니다. 대신 실제 HTTP 요청 헤더를 미러링하므로 $ _SERVER [ 'HTTP_COOKIE']를 사용하십시오.
Farhadi 2011 년

쿠키 또는 설정된 값이있는 쿠키를 제외한 모든 쿠키를 어떻게 삭제 하시겠습니까?
Chill Web Designs

2
이름은 같지만 도메인 설정이 다른 쿠키가 2 개있는 상황을 보았습니다. 그들 중 하나는 $ _COOKIE 배열로 만들고 다른 하나는 그렇지 않습니다. 그러나 둘 다 HTTP_COOKIE에서 볼 수 있습니다. 이 상황을 정리하려면 이것이 방법입니다.
dlo

42
$past = time() - 3600;
foreach ( $_COOKIE as $key => $value )
{
    setcookie( $key, $value, $past, '/' );
}

그러나 더 좋은 방법은 도메인에서 응용 프로그램과 함께 설정된 쿠키를 기억 (또는 어딘가에 저장)하고 모든 쿠키를 직접 삭제하는 것입니다.
이렇게하면 모든 값을 올바르게 삭제할 수 있습니다.


2
훌륭한 코드이지만 사용하기에 충분하지 않습니다 setcookie( $key, FALSE );?! (에서 메모 scetion 참조 php.net/manual/en/function.setcookie.php를 )
마르코 Demaio에게

@Marco Demaio : 그래야하지만 과거에 일부 서버에서 실패하는 것을 보았습니다. 하지만 물론, 그것이 당신을 위해 작동한다면, 그렇게하세요 :)
poke

그것은 서버의 문제가 아니라 내부적으로 수행하는 PHP입니다. 그리고 /당신이 배치 한 결승전의 필요성은 무엇 setcookie입니까?
Marco Demaio

@Marco Demaio : 예, 서버에서는 PHP 서버를 의미했습니다. 는 /쿠키 경로입니다. 도메인에서 쿠키를 제거 할 수 있도록 설정해야합니다. 그렇지 않으면 현재 경로로 설정되고 현재 경로에 대해 설정된 쿠키에만 영향을줍니다.
찌를

@trante 허!? $ key는 배열이 아니라 키입니다.
찌르기

16

위 답변 중 일부에 동의합니다. "time ()-1000"을 "1"로 바꾸는 것이 좋습니다. 값 "1"은 1970 년 1 월 1 일을 의미하며 100 % 만기를 보장합니다. 따라서:

setcookie($name, '', 1);
setcookie($name, '', 1, '/');

1
나는 항상 왜 아무도 이렇게 말하지 않는지 궁금해했고, 내가 찾고 있던 대답의 종류입니다.
Anther 2011-04-23

현재는 문제가되지 않을 수 있지만 한 시점에서 일부 브라우저는 오래된 날짜를 모두 무시하고 값이 삭제되지 않았습니다. 나는 IE 7이 이것을 한 예라고 생각합니다.
conrad10781

3

사이트에서 출력이 발생하기 전에 setcookie 함수를 호출해야합니다.

또한 사용자가 로그 아웃하는 경우 세션 변수도 삭제 / 무효화해야합니다.


2

쿠키의 이름을 변경할 때 모든 쿠키를 삭제하고 하나는 보존 할 수도 있습니다.

if (isset($_COOKIE)) {
    foreach($_COOKIE as $name => $value) {
        if ($name != "preservecookie") // Name of the cookie you want to preserve 
        {
            setcookie($name, '', 1); // Better use 1 to avoid time problems, like timezones
            setcookie($name, '', 1, '/');
        }
    }
}

또한이 PHP-Answer를 기반으로


1
잘못된 구문 : 1) if 절에 AS 구조가 없습니다. 2) "$ cookies"를 $ _COOKIE로 대체
Jeff

2

제공된 답변으로 문제가 해결되지 않았습니다.

그렇지 않았습니다.

  1. 상위 도메인 쿠키 제거 (abc에서, bc 제거, 쿠키),
  2. 루트가 아닌 상위 경로에서 쿠키를 제거하십시오.

내 스크립트는 그렇습니다.

<?php function unset_cookie($name)
{
    $host = $_SERVER['HTTP_HOST'];
    $domain = explode(':', $host)[0];

    $uri = $_SERVER['REQUEST_URI'];
    $uri = rtrim(explode('?', $uri)[0], '/');

    if ($uri && !filter_var('file://' . $uri, FILTER_VALIDATE_URL)) {
        throw new Exception('invalid uri: ' . $uri);
    }

    $parts = explode('/', $uri);

    $cookiePath = '';
    foreach ($parts as $part) {
        $cookiePath = '/'.ltrim($cookiePath.'/'.$part, '//');

        setcookie($name, '', 1, $cookiePath);

        $_domain = $domain;
        do {
            setcookie($name, '', 1, $cookiePath, $_domain);
        } while (strpos($_domain, '.') !== false && $_domain = substr($_domain, 1 + strpos($_domain, '.')));
    }
}

가장 예쁘고 / 안전하고 / 최적의 솔루션은 아니므로 쿠키 경로 및 / 또는 쿠키 도메인을 모르는 경우에만이 방법을 사용하십시오. 또는 버전을 만들기 위해 아이디어를 사용하십시오.


완벽한 솔루션
Shakeel Ahmed

1

Google Analytics와 같은 다양한 추적 도구도 도메인에서 쿠키를 사용하며 GA에 올바른 데이터를 유지하려는 경우 쿠키를 삭제하지 않으려는 점을 알고 있어야합니다.

내가 일할 수있는 유일한 해결책은 기존 쿠키를 null로 설정하는 것입니다. 클라이언트에서 쿠키를 삭제할 수 없습니다.

따라서 사용자를 로그 아웃하려면 다음을 사용합니다.

setcookie("username", null, time()+$this->seconds, "/", $this->domain, 0);
setcookie("password", null, time()+$this->seconds, "/", $this->domain, 0);

물론 이것이 모든 쿠키를 삭제하는 것은 아닙니다.


7
사용자의 비밀번호를 쿠키에 저장하지 않는 것이 좋습니다. 이는 특히 0쿠키가 전송 중에 암호화되지 않는다는 주장을 고려할 때 심각한 보안 허점 입니다.
Andrew Ensley 2012

1

이전의 모든 답변은를 setcookie명시 적 도메인과 함께 사용할 수 있음을 간과했습니다 . 또한 쿠키가 상위 하위 도메인에 설정되었을 수 있습니다. 예를 들어 foo.bar.tar.com도메인 에있는 경우에 쿠키가 설정되었을 수 있습니다 tar.com. 따라서 쿠키를 삭제했을 수있는 모든 도메인에 대해 쿠키를 설정 해제하려고합니다.

$host = explode('.', $_SERVER['HTTP_HOST']);

while ($host) {
    $domain = '.' . implode('.', $host);

    foreach ($_COOKIE as $name => $value) {
        setcookie($name, '', 1, '/', $domain);
    }

    array_shift($host);
}

0

기능을 사용하여 쿠키를 삭제하십시오.

function clearCookies($clearSession = false)
{
    $past = time() - 3600;
    if ($clearSession === false)
        $sessionId = session_id();
    foreach ($_COOKIE as $key => $value)
    {
        if ($clearSession !== false || $value !== $sessionId)
            setcookie($key, $value, $past, '/');
    }
}

통과 true하면 session데이터 가 지워지고 그렇지 않으면 세션 데이터가 보존됩니다.


0

이 질문이 오래되었다는 것을 알고 있지만 이것은 훨씬 더 쉬운 대안입니다.

header_remove();

하지만 조심하세요! 문서에 설명 된대로 쿠키, 세션 등을 포함한 모든 헤더를 지 웁니다 .


브라우저가 만료 될 때까지 저장된 쿠키를 유지하기 때문에 실제로 쿠키 또는 그 개념과 유사한 것을 제거하기 위해 실제로 아무것도 수행하지 않습니다. 다른 것들이 쿠키를 생성하려고 시도하면 도움이되지만 그렇게하지 못하도록합니다.
My1

0
<?php
      parse_str(http_build_query($_COOKIE),$arr);
      foreach ($arr as $k=>$v) {
        setCookie("$k","",1000,"/");
      }

제한적이고 즉각적인 도움을 제공 할 수있는이 코드 스 니펫에 감사드립니다. 적절한 설명은 이것이 문제에 대한 좋은 해결책 인 이유를 보여줌으로써 장기적인 가치를 크게 향상시키고 다른 유사한 질문을 가진 미래의 독자에게 더 유용하게 만들 것입니다. 귀하의 가정을 포함하여 몇 가지 설명을 추가하려면 답변을 편집하십시오.
Maximilian Peters
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.