쿠키 제거


260

쿠키를 제거하고 싶을 때

unset($_COOKIE['hello']);

파이어 폭스의 쿠키 브라우저에서 쿠키가 여전히 존재한다는 것을 알았습니다. 쿠키를 어떻게 제거 할 수 있습니까?


당신은 찾을 수 있습니다 $cookie->delete()에서 github.com/delight-im/PHP-Cookie 도움. 질문의 코드는 서버 측에서 구문 분석 된 속성을 삭제합니다. 쿠키는 여전히 클라이언트쪽에 있습니다.
— caw

답변:


280

당신은 이것을 시도 할 수 있습니다

if (isset($_COOKIE['remember_user'])) {
    unset($_COOKIE['remember_user']); 
    setcookie('remember_user', null, -1, '/'); 
    return true;
} else {
    return false;
}

141
이 예는 이해하지만 쿠키에 사용자 이름이나 비밀번호를 저장하지 마십시오.
— tamasd

3
무의미합니다 unset($_COOKIE['Hello']);. 제거해도 아무런 변화가 없습니다.
— machineaddict

30
unset($_COOKIE['Hello']);코드의 뒷부분에서 쿠키를 확인하려면 @machineaddict 가 실제로 중요합니다.
— Andreas Hultgren 2018 년

4
제대로 작동하지만 페이지를 다시로드하려고 할 때. 오래된 데이터로 쿠키 세트를 보았습니다.
— Nilesh patel

9
======= 크롬에서 작동하지 않습니다 ======= 오늘이 코드를 사용해 보았고 Google 크롬을 사용하여 사이트에 액세스 한 다음 크롬의 개발자 도구에 들어가면 만료 시간이 있음을 알 수 있습니다 에포크 (예 : 1969-12-31 23:59:59) 전에 1 초로 설정되어 있지만 다음에 페이지를 제출하면 쿠키가 서버에 제출됩니다. -1을 1로 변경하면 (예 : 1970-01-01 00:00:01) 다음 명령을 제공합니다. setcookie ( 'Hello', null, 1, '/'); 그때 크롬은 예상대로 행동하고 쿠키를 제출하지 않았습니다
— Peter Hinds

284

값을 ""로 설정하고 만료 날짜를 어제 (또는 과거의 날짜)로 설정하십시오.

setcookie("hello", "", time()-3600);

그러면 다음에 페이지가로드 될 때 쿠키가 만료됩니다.


10
시간을 0으로 설정하는 것은 어떻습니까? =]
— strager

12
과거에 날짜를 너무 많이 넣으면 IE가 짖고 굳어집니다. 즉, 값이 제거되지 않습니다.
— Julien

52
@strager 수동 상태 : 0으로 설정하거나 생략하면 쿠키는 세션 종료시 (브라우저가 닫힐 때) 만료됩니다. 쿠키를 삭제하는 것은 아닙니다. IE가 Julien의 말을 어떻게 할 것인지는 잘 모르겠지만 IE가 이상한 일을 할 가능성이 있습니다.
— yannis

31
또한 페이지의 나머지 부분에 $ _COOKIE [ "hello"]를 보는 코드가 있으면 여전히 설정을 찾을 수 있기 때문에 실제로 설정 해제 ($ _COOKIE [ "hello"])도 잊지 마십시오. 나는 이것에 조금 물렸다.
— Magmatic

12
또한 경로를 설정하는 것이 좋습니다. setcookie ( 'hello', '', time ()-3600, '/');
— Stephan Weinhold

226

쿠키를 삭제하는 확실한 방법은 $_COOKIE값과 브라우저 쿠키 파일을 모두 지우는 것입니다 .

if (isset($_COOKIE['key'])) {
    unset($_COOKIE['key']);
    setcookie('key', '', time() - 3600, '/'); // empty value and old timestamp
}

3
페이지를 새로 고칠 필요가 없기 때문에 이것이 가장 좋은 방법입니다!
— MaxV

19
나는 계속 페이지를 내려 가면서 답변은 계속 나아지고 재미있다. 그러나 이것은 가장 좋은 것입니다. 여기를 계속 보지 마십시오.
— Andrew

23
참고로, 경로를 사용하여 쿠키를 설정 한 경우이 setcookie호출에도 경로를 포함시켜야합니다 .setcookie('key', '', time() - 3600, '/');
— Gavin

1
@Gavin 그 팁 감사합니다. 왜 삭제되지 않았는지 궁금했지만 unsetting성공적이었습니다.
— stinkysGTI

1
쿠키가 있는지 확인 하고 값이 있는 쿠키에 관심이있는 사람은 값을 가진 쿠키를 검사 에서 찾을 수 없으므로 대신 array_key_exists ()null 를 사용해야 합니다. nullisset()
— Leith

27

쿠키를 안정적으로 삭제하려면 PHP 서버에서 계산 한 것처럼 쿠키가 과거에 언제라도 만료되도록 설정하는 것만으로는 충분하지 않습니다. 이는 클라이언트 컴퓨터가 서버와 다른 시간을 가질 수 있고 종종 있기 때문입니다.

가장 좋은 방법은 일초 만료 빈 쿠키와 현재의 쿠키를 덮어하는 것입니다 미래를 , 신기원 이후로 이렇게 (1970년 1월 1일 0시 0 분 0 초 UTC)를 :

setcookie("hello", "", 1);

13
내가 틀렸다면 정정하되, "1"로 설정하면 미래의 1 초가 아닌 신기원 후 1 초로 설정됩니다 ..? 시간대 차이에 대해서는 정확하다고 생각하므로 가장 좋은 해결책은 과거 2 일로 설정하는 것입니다 (따라서 가장 먼 시간대조차도 쿠키를 설정 해제합니다).
— PaulSkinner

@PaulSkinner epoch 날짜는 표준 시간대와 무관하며 컴퓨터가 계산을 수행합니다.
— AlexR

3
@AlexR 예. 그래도 내 요점에 대답하지 않습니다. 나의 이해하려면, 위의 코드는 않습니다 내가 잘못 생각하지 않는 한, 과거에 만료 쿠키 (신기원 지난 1 초)을 설정합니다.
— PaulSkinner

@PaulSkinner는 물론 나머지 의견은 완벽합니다.
— AlexR

9
"1"은 +1입니다. 과거에 정확히 1 시간 동안 삭제 된 쿠키를 설정하는 데 다른 모든 사람들이 왜 그렇게 고쳐 졌는지 이해할 수 없습니다.
— Meisner

20

그러면 코드에서 쿠키가 설정 해제되지만 각 요청마다 $ _COOKIE 변수가 새로 고쳐 지므로 다음 페이지 요청에서 다시 나타납니다.

실제로 쿠키를 제거하려면 과거에 만료 날짜를 설정하십시오.

// set the expiration date to one hour ago
setcookie("hello", "", time()-3600);

1
unset()쿠키 가 필요하지 않습니까?
— Pratik

2
@PratikCJoshi 나중에 코드를 찾은 경우에만.
— AlphaMycelium

14

내 코드에서 동일한 문제가 발생하여 쿠키 경로 문제라는 것을 알았습니다. 이 스택 오버플로 게시물을 확인하십시오 : PHP 세트 쿠키를 삭제할 수 없습니다

"/"의 경로 값을 사용하여 쿠키를 설정했지만 지우려고 할 때 경로 값이 없으므로 지워지지 않았습니다. 다음은 작동 한 예입니다.

쿠키 설정 :

$cookiePath = "/";
$cookieExpire = time()+(60*60*24);//one day -> seconds*minutes*hours
setcookie("CookieName",$cookieValue,$cookieExpire,$cookiePath);

쿠키 지우기 :

setcookie("cookieName","", time()-3600, $cookiePath);
unset ($_COOKIE['cookieName']);

희망이 도움이됩니다.



7

PHP 문서에서 " Example # 2 setcookie () delete example " 이라는 샘플을 참조하십시오 . 브라우저에서 쿠키를 지우려면 쿠키가 만료되었음을 브라우저에 알려야합니다. 그러면 브라우저가 쿠키를 제거합니다. unset사용 했으므로 COOKIE 배열에서 'hello'쿠키를 제거합니다.


7

다음은 PHP v7 setcookie () 코드가 작동하는 방식입니다.

<?php
    setcookie('user_id','');
    setcookie('session','');
?>

포트 80에서 스니핑하는 동안 tcpdump의 출력에서 ​​서버는 다음 HTTP 헤더를 클라이언트 (브라우저)로 보냅니다.

Set-Cookie: user_id=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0
Set-Cookie: session=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0

다음 요청에서 패킷을 관찰하면 브라우저가 더 이상 헤더에 쿠키를 보내지 않습니다.


4

쿠키를 삭제하려면 값을 NULL로 설정하면됩니다.

"만료 시간, 경로 또는 도메인에 기본값이 아닌 쿠키를 설정 한 경우 쿠키를 삭제하면 쿠키가 올바르게 삭제되도록 동일한 값을 다시 제공해야합니다." "PHP5 배우기"책에서 인용하십시오.

따라서이 코드는 작동해야합니다 (작동합니다).

쿠키 설정 : setcookie('foo', 'bar', time() + 60 * 5);

쿠키 삭제 : setcookie('foo', '', time() + 60 * 5);

그러나 나는 모두가 만료 날짜를 과거로 설정하고 있음을 알았습니다.


1
신뢰할 수있는 이유입니다. 과거에는 값을 아무것도 아닌 시간으로 설정하는 조합이 있습니다 (그러나 IE가 때로는 읽은 내용과 너무 멀리 좋아하지 않는 한)는 전체적으로 작동합니다.
— PaulSkinner

빈 문자열은와 ''동일하지 않습니다 null.
— orev

3

모든 쿠키를 제거하려면 다음을 작성하십시오.

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

3
쿠키를 기본값으로 설정하는 쿠키와 동일한 경로 및 도메인 설정이 없으면 쿠키를 실제로 제거하지 않습니다.
— Noishe

2

쿠키를 "제거"하려면 다음과 같이 만료 날짜를 1 시간 전에 설정하십시오.

setcookie ("TestCookie", "", time() - 3600);

또는

setcookie ("TestCookie", "", time() - 3600, "/~rasmus/", "example.com", 1);

출처 : http://www.php.net/manual/en/function.setcookie.php

filter_input()방문자가 다음과 같이 입력 / 조작 할 수있는 모든 전역에 대해이 기능을 사용해야합니다 .

$visitors_ip = filter_input(INPUT_COOKIE, 'id');

자세한 내용은 여기를 참조하십시오. http://www.php.net/manual/en/function.filter-input.php 및 여기를 참조 하십시오 : http://www.w3schools.com/php/func_filter_input.asp


2

나는이 주제가 만들어진 이후 오랜 시간이 걸렸지만이 솔루션 내에서 약간의 실수를 보았습니다 (세부 사항이므로 그렇게 부를 수 있습니다). 더 나은 솔루션은 아마도이 솔루션이라는 데 동의합니다.

if (isset($_COOKIE['remember_user'])) {
            unset($_COOKIE['Hello']);
            unset($_COOKIE['HelloTest1']);
            setcookie('Hello', null, -1, '/');
            setcookie('HelloTest1', null, -1, '/');
            return true;
        } else {
            return false;
        }

그러나 현재는 설정 해제 기능이 작동하는 모든 경우에 쿠키를 삭제하고 설정 해제 기능이 작동하지 않는 경우 만료 된 새 쿠키를 즉시 생성합니다.

즉, 설정 해제 기능이 작동하더라도 컴퓨터에는 여전히 쿠키가 2 개 있습니다. 논리적 관점에서 요구되는 목표는 쿠키가 가능하면 쿠키를 삭제하고 쿠키가 실제로 쿠키가 아닌 경우 쿠키를 삭제하는 것입니다. "가장 깨끗한"결과를 얻을 수 있습니다.

그래서 우리는 더 잘해야한다고 생각합니다.

if (isset($_COOKIE['remember_user'])) {
            setcookie('Hello', null, -1, '/');
            setcookie('HelloTest1', null, -1, '/');
            unset($_COOKIE['Hello']);
            unset($_COOKIE['HelloTest1']);
            return true;
        } else {
            return false;
        }

감사하고 좋은 하루 되세요 :)


함수 설정 해제는 PHP의 논리를위한 것입니다 ($ _COOKIE [ 'Hello'] 변수를 사용하려는 경우 설정되지 않았으므로). 그리고 setcookie 함수는 네비게이터를위한 것입니다. 두 가지 다른 목적으로, 함수의 순서는 실제 코드에 영향을 미치지 않습니다.
— Kalzem

사실, 나는 그것을 알고 있었지만 쿠키가 설정 해제 / 삭제되었는지 확인하고 두 가지 솔루션을 바로 사용하려는 경우이를 만료하기 전에 정리하고 설정을 해제하는 것보다 정리하는 것이 더 깨끗합니다. 그런 다음 만료 된 쿠키를 다시 만드십시오.
— Greg

그렇습니다. 죄송합니다. 지금 답장을 보내 주셔서 감사합니다 :) 다른 방법으로 사람들이하는 것을 보았 기 때문에 그것을 보냈습니다.
— Greg

2
$cookie_name = "my cookie";
$cookie_value = "my value";
$cookie_new_value = "my new value";

// Create a cookie,
setcookie($cookie_name, $cookie_value , time() + (86400 * 30), "/"); //86400 = 24 hours in seconds

// Get value in a cookie,
$cookie_value = $_COOKIE[$cookie_name];

// Update a cookie,
setcookie($cookie_name, $cookie_new_value , time() + (86400 * 30), "/");

// Delete a cookie,
setcookie($cookie_name, '' , time() - 3600, "/"); //  time() - 3600 means, set the cookie expiration date to the past hour.

2

모든 현재 도메인에서 쿠키를 완전히 삭제하려면 다음 코드가 도움이 될 것입니다.

unset($_COOKIE['hello']);
setcookie("hello", "", time() - 300,"/");

이 코드는 모든 도메인에서 쿠키 변수를 완전히 삭제합니다. "/"-쿠키 변수의 값이 모두 현재 도메인이나 경로뿐만 아니라 모든 도메인에 대해 설정되었음을 나타냅니다. time ()-300은 이전 시간으로 설정되어 만료됨을 나타냅니다.

그것이 완벽하게 삭제되는 방법입니다.


1

쿠키 값을 기반으로 세션 변수를 설정할 수 있습니다

session_start();

if(isset($_COOKIE['loggedin']) && ($_COOKIE['loggedin'] == "true") ){
$_SESSION['loggedin'] = "true";
}

echo ($_SESSION['loggedin'] == "true" ? "You are logged in" : "Please Login to continue");

1

이 사용자 정의 기능을 간단히 사용할 수 있습니다.

function unset_cookie($cookie_name) {
    if (isset($_COOKIE[$cookie_name])) {
        unset($_COOKIE[$cookie_name]);
        setcookie($cookie_name, null, -1);
    } else { return false; }
}

$ _COOKIE [ 'user_account']를 제거하려면
그냥 사용하십시오 :

unset_cookie('user_account');

1

간단 해!

setcookie("cookiename", "cookievalue", 1);

삭제 쿠키에 대한 값을 설정할 필요는 없습니다!
— Amir Fo

1

0시간 을 입력 하면 브라우저에 대해 "지금" (지금부터 +0이 실제로 나타남) 을 의미 하며 쿠키가 삭제됩니다.

setcookie("key", NULL, 0, "/");

크롬 브라우저에서 확인하여 다음을 제공합니다.

Name: key
Content: Deleted
Created: Sunday, November 18, 2018 at 2:33:14 PM
Expires: Sunday, November 18, 2018 at 2:33:14 PM

아니요. 문서를 읽으십시오. "0으로 설정하거나 생략하면 쿠키는 세션 종료시 (브라우저가 닫힐 때) 만료됩니다."
— DrLightman

@DrLightman 참석해 주셔서 감사합니다. 문서를 인용 해 주시겠습니까?
— Amir Fo

function.setcookie.php 는 매개 변수를 만료 시킵니다. "0으로 설정하거나 생략하면 쿠키는 세션 종료시 (브라우저가 닫힐 때) 만료됩니다."
— DrLightman

1

쿠키 false를 설정 해제하려면 쿠키 값 을 설정하십시오.

setcookie('cookiename', false);

추신 :-가장 쉬운 방법입니다.


-1

서버의 php 및 브라우저의 js를 사용하여 쿠키를 삭제해야합니다. (php로 만들었지 만 쿠키 파일은 브라우저 클라이언트에도 있습니다) :

예를 들면 :

if ($_GET['action'] == 'exit'){
            // delete cookies with js and then in server with php:
            echo '
            <script type="text/javascript">
                var delete_cookie = function(name) {
                     document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:01 GMT;";
                };
                delete_cookie("madw");
                delete_cookie("usdw");
            </script>
            ';
unset($_COOKIE['cookie_name']);
unset($_COOKIE['cookie_time']);

쿠키 값을 설정 / 삭제하기 위해 JavaScript가 필요하지 않습니다. PHP 함수 setcookie는 당신을 위해 그렇게 할 것입니다 php.net/manual/en/function.setcookie.php
— Michael Khalili

-5

대부분은 로컬 컴퓨터에서만 작동한다는 사실을 잊고 있습니다. 도메인에서는이 예제와 같은 패턴이 필요합니다.

setcookie("example_cookie", 'password', time()-3600, "/", $_SERVER['SERVER_NAME']);

1
domain 매개 변수는 현재 도메인을 생략하면 의미합니다.
— DustWolf

나는 당신의 대답이 틀렸다고 말하고 싶었습니다. 현재 컴퓨터를 자동으로 사용하므로 로컬 컴퓨터뿐만 아니라 모든 도메인에서 작동합니다. 그리고 당신의 의견은 당신이 기분 나쁘다는 것을 의미합니까?
— DustWolf

코드 위에있는 텍스트를 읽고 있습니까? 나를 괴롭히지 말고, 나는 일하고있다. 나는 너와 대화를 끝냈다.
— 피터 Gruppelaar

다른 사용자가 답변에서 실수를 지적하는 경우 왜 다른 사용자에게 화가 났는지 이해할 수 없습니다. setcookielocalhost 여부에 관계없이 모든 도메인에서 작동합니다.
— xorinzor

모두가 말하면, 그 경우는 ... 그렇다면 분명히 내 대답에 문제가있을 것입니다 ...이 게시물에서 지적 된 fct 모자는 중요하지 않습니까? , 그리고 비슷한 상황에서 일하는 모든 글로벌 사용자를 무시하십시오 ... 나는 그것을 얻습니다.
— 피터 Gruppelaar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.