쿠키 제거


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.