쿠키가 있는지 어떻게 확인합니까?


84

쿠키가 있는지 확인하는 좋은 방법은 무엇입니까?

정황:

쿠키가있는 경우

cookie1=;cookie1=345534;
//or
cookie1=345534;cookie1=;
//or
cookie1=345534;

다음과 같은 경우 쿠키가 존재하지 않습니다.

cookie=;
//or
<blank>

답변:


127

원하는 쿠키 이름으로 getCookie 함수를 호출 한 다음 = null인지 확인합니다.

function getCookie(name) {
    var dc = document.cookie;
    var prefix = name + "=";
    var begin = dc.indexOf("; " + prefix);
    if (begin == -1) {
        begin = dc.indexOf(prefix);
        if (begin != 0) return null;
    }
    else
    {
        begin += 2;
        var end = document.cookie.indexOf(";", begin);
        if (end == -1) {
        end = dc.length;
        }
    }
    // because unescape has been deprecated, replaced with decodeURI
    //return unescape(dc.substring(begin + prefix.length, end));
    return decodeURI(dc.substring(begin + prefix.length, end));
} 

function doSomething() {
    var myCookie = getCookie("MyCookie");

    if (myCookie == null) {
        // do cookie doesn't exist stuff;
    }
    else {
        // do cookie exists stuff
    }
}

3
이후 unescape사용되지 않으며, 사용하는 차이가 decodeURIComponent대신은?
the_nuts

3
@the_nuts, 좋은 캐치. 나는 이것을 몰랐다. w3cschools에 따르면 decodeURI () 또는 decodeURIComponent를 사용하여 unescape를 대체 할 수 있습니다. 사용할 선택은 저장되는 항목에 따라 달라질 수 있습니다. 쿠키에 인코딩 된 구분 문자가있을 것으로 예상하지 않기 때문에 decodeURI를 선택했습니다. 전체 참조 : w3schools.com/jsref/jsref_decodeuri.asp
jac

3
변수 끝이 설정되어 있기 때문에이 처음 쿠키 작동하지 않습니다
warch

function doSomething ($ name) {var myCookie = getCookie ($ name);
Sol

1
이것은 w3schools가 신뢰할 수있는 소스가 아닌 이유와 답변을 복사 / 붙여 넣기해서는 안되는 이유에 대한 완벽한 예입니다. js에서 상당히 잘 알려진 == 및! = 사용을 피했을 것입니다.
Isaac Pak

96

대체 비 jQuery 버전을 만들었습니다.

document.cookie.match(/^(.*;)?\s*MyCookie\s*=\s*[^;]+(.*)?$/)

쿠키 존재 여부 만 테스트합니다. 더 복잡한 버전은 쿠키 값을 반환 할 수도 있습니다.

value_or_null = (document.cookie.match(/^(?:.*;)?\s*MyCookie\s*=\s*([^;]+)(?:.*)?$/)||[,null])[1]

대신 쿠키 이름을 넣으십시오 MyCookie.


14
멋진 클린 솔루션! 요즘 사람들은 플러그인을 너무 빨리 잡습니다 ... 너무 많은 오버 헤드. 이것은 아주 좋은 해결책입니다!
patrick

3
이것은 작동하지 않습니다. Regex에 공백이 없습니다. document.cookie.match (/^(.*;)? MyCookie = [^;] + (. *)? $ /) 여야합니다.? 뒤에 공백이 있습니다.
Bogdan M.

1
document.cookie는 공백으로 구분 된 쿠키를 반환합니다. 예 : cookie1 =; cookie1 = 345534;
Bogdan M.

1
@BogdanM. : 첫 번째 쿠키에는 공백이 없습니다! / [] {0,1} / 위 내 댓글보기
가브리엘

6
변수를 사용하려는 경우 : new RegExp ( "^ (? :. *;)? \\ s *"+ cookieName + "\\ s * = \\ s * ([^;] +) (? :. *)? $ ")
josef josef

34
document.cookie.indexOf('cookie_name=');

-1해당 쿠키가 없으면 반환 됩니다.

추신 그것의 유일한 단점은 (주석에서 언급했듯이) 그러한 이름으로 설정된 쿠키가 있으면 실수 할 것이라는 것입니다. any_prefix_cookie_name

( 출처 )


5
또한 이름의 문자열이있는 모든 쿠키와 일치합니다. 예를 들어이 예제는 -1if cookie_name_whatever가 설정된 것 이외의 것을 반환합니다 (cookie_name이 아닌 경우에도). 다른 답변의 정규식 버전이이를 해결합니다.
hajamie

4
100 % 정확하지는 않지만 대부분의 경우 충분한 솔루션입니다. 감사합니다. 큰 함수 나 다른 솔루션의 복잡한 정규 표현식보다 이것을 사용하는 것이 훨씬 편합니다.
Shane N

14

주의! 선택한 답변에 버그가 있습니다 (Jac의 답변).

쿠키가 두 개 이상이고 (아마도 ..) 검색중인 쿠키가 목록의 첫 번째 쿠키 인 경우 변수 "end"를 설정하지 않으므로 "cookieName"다음에 나오는 전체 문자열을 반환합니다. = "document.cookie 문자열 내!

다음은 해당 기능의 수정 된 버전입니다.

function getCookie( name ) {
    var dc,
        prefix,
        begin,
        end;

    dc = document.cookie;
    prefix = name + "=";
    begin = dc.indexOf("; " + prefix);
    end = dc.length; // default to end of the string

    // found, and not in first position
    if (begin !== -1) {
        // exclude the "; "
        begin += 2;
    } else {
        //see if cookie is in first position
        begin = dc.indexOf(prefix);
        // not found at all or found as a portion of another cookie name
        if (begin === -1 || begin !== 0 ) return null;
    } 

    // if we find a ";" somewhere after the prefix position then "end" is that position,
    // otherwise it defaults to the end of the string
    if (dc.indexOf(";", begin) !== -1) {
        end = dc.indexOf(";", begin);
    }

    return decodeURI(dc.substring(begin + prefix.length, end) ).replace(/\"/g, ''); 
}

하나의 쿠키 세트로 함수가 "cookieName ="을 반환했습니다. :-/
Jeppe

1
@Jeppe 쿠키가 하나뿐 일 때도 작동하도록 코드를 수정했습니다. 저는 실제로 전체 기능을 리팩토링하고 정리할 수있는 기회를 얻었으며 일부 주석을 추가했습니다. ;)
Pikkio

replace (/ "/ g, '')에 문제가 있습니다. 구문 오류가 발생합니다
iKamy

그것은 나를 위해 일했지만 아마도 정규식에서 따옴표를 피하는 것이 낫습니다. 나는 대답을 편집했습니다. 지금도 당신을 위해 일해야합니다!
Pikkio

6

jQuery를 사용하는 경우 jquery.cookie 플러그인을 사용할 수 있습니다 .

특정 쿠키에 대한 값을 가져 오는 것은 다음과 같이 수행됩니다.

$.cookie('MyCookie'); // Returns the cookie value

3
이것은 또한 OP가 jquery-cookie 플러그인을 사용하고 있다고 가정합니다. jquery를 사용하고 있었기 때문에 약간의 루프를 던졌지 만 해결하려는 작업에 해당 플러그인을 사용할 수 없습니다.
hippeelee 2013-04-16

8
이것은 jquery에만 국한된 것이 아니라 답변에서 참조하지 않은 jquery 플러그인이 필요합니다
artfulhacker

4

regexObject. test (String)는 string보다 빠릅니다 . 일치 (RegExp).

MDN 사이트 document.cookie를위한 포맷을 설명하고, (a 쿠키 잡아 예 정규식을 갖는다 document.cookie.replace(/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/, "$1");). 이를 바탕으로 나는 이것을 할 것입니다.

/^(.*;)?\s*cookie1\s*=/.test(document.cookie);

질문은 쿠키가 설정되었지만 비어있을 때 false를 반환하는 솔루션을 요청하는 것 같습니다. 이 경우 :

/^(.*;)?\s*cookie1\s*=\s*[^;]/.test(document.cookie);

테스트

function cookieExists(input) {return /^(.*;)?\s*cookie1\s*=/.test(input);}
function cookieExistsAndNotBlank(input) {return /^(.*;)?\s*cookie1\s*=\s*[^;]/.test(input);}
var testCases = ['cookie1=;cookie1=345534;', 'cookie1=345534;cookie1=;', 'cookie1=345534;', ' cookie1 = 345534; ', 'cookie1=;', 'cookie123=345534;', 'cookie=345534;', ''];
console.table(testCases.map(function(s){return {'Test String': s, 'cookieExists': cookieExists(s), 'cookieExistsAndNotBlank': cookieExistsAndNotBlank(s)}}));

테스트 결과 (Chrome 55.0.2883.87)


cookieName을 문자열로 전달하는 대신 어떻게 변수를 cookieName으로 전달할 수 있습니까?
DILEEP THOMAS

var name = 'cookie1'; new RegExp ( '^ (. *;)? \\ s *'+ 이름 + '\\ s * ='). test (document.cookie);
hajamie

4

이것은 오래된 질문이지만 여기에 내가 사용하는 접근 방식이 있습니다 ...

function getCookie(name) {
    var match = document.cookie.match(RegExp('(?:^|;\\s*)' + name + '=([^;]*)')); return match ? match[1] : null;
}

null쿠키가 존재하지 않거나 요청 된 이름이 포함되지 않은 경우 반환 됩니다.
그렇지 않으면 요청 된 이름의 값이 반환됩니다.

쿠키는 가치없이 절대 존재해서는 안됩니다. 왜냐하면 공정하게 말해서 그 이유는 무엇일까요? 😄
더 이상 필요하지 않으면 모두 함께 제거하는 것이 가장 좋습니다.

function deleteCookie(name) {
    document.cookie = name +"=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;";
}

값이없는 쿠키를 갖는 데는 완전히 타당한 이유가 있습니다. 즉, 무언가의 존재를 알리기위한 것입니다. 부울처럼 사용됩니다 : 쿠키가 존재 함 => 참, 쿠키가 존재하지 않음 => 거짓
Gus

2
이것은 목록에서 가장 좋은 방법이었습니다.
앤드류

1
function getCookie(name) {

    var dc = document.cookie;
    var prefix = name + "=";
    var begin = dc.indexOf("; " + prefix);
    if (begin == -1) {
        begin = dc.indexOf(prefix);
        if (begin != 0) return null;
        else{
            var oneCookie = dc.indexOf(';', begin);
            if(oneCookie == -1){
                var end = dc.length;
            }else{
                var end = oneCookie;
            }
            return dc.substring(begin, end).replace(prefix,'');
        } 

    }
    else
    {
        begin += 2;
        var end = document.cookie.indexOf(";", begin);
        if (end == -1) {
            end = dc.length;
        }
        var fixed = dc.substring(begin, end).replace(prefix,'');
    }
    // return decodeURI(dc.substring(begin + prefix.length, end));
    return fixed;
} 

@jac 함수를 시도했지만 문제가 발생했습니다. 여기에 그의 함수를 편집 한 방법이 있습니다.


1

쿠키 변수 대신 document.cookie.split ...

var cookie = 'cookie1=s; cookie1=; cookie2=test';
var cookies = cookie.split('; ');
cookies.forEach(function(c){
  if(c.match(/cookie1=.+/))
   console.log(true);
});


1

Node를 사용하는 모든 사람을 위해 ES6 가져 오기 및 cookie모듈 로 멋지고 간단한 솔루션을 찾았습니다 !

먼저 쿠키 모듈을 설치하고 종속성으로 저장하십시오.

npm install --save cookie

그런 다음 가져 와서 사용합니다.

import cookie from 'cookie';
let parsed = cookie.parse(document.cookie);
if('cookie1' in parsed) 
    console.log(parsed.cookie1);

1

자바 스크립트 사용 :

 function getCookie(name) {
      let matches = document.cookie.match(new RegExp(
        "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
      ));
      return matches ? decodeURIComponent(matches[1]) : undefined;
    }

0

대신이 방법을 사용하십시오.

function getCookie(name) {
    var value = "; " + document.cookie;
    var parts = value.split("; " + name + "=");
    if (parts.length == 2) return parts.pop().split(";").shift();
    else return null;
}

function doSomething() {
    var myCookie = getCookie("MyCookie");

    if (myCookie == null) {
        // do cookie doesn't exist stuff;
    }
    else {
        // do cookie exists stuff
    }
}

0
/// ************************************************ cookie_exists

/// global entry point, export to global namespace

/// <synopsis>
///   cookie_exists ( name );
///
/// <summary>
///   determines if a cookie with name exists
///
/// <param name="name">
///   string containing the name of the cookie to test for 
//    existence
///
/// <returns>
///   true, if the cookie exists; otherwise, false
///
/// <example>
///   if ( cookie_exists ( name ) );
///     {
///     // do something with the existing cookie
///     }
///   else
///     {
///     // cookies does not exist, do something else 
///     }

function cookie_exists ( name )
  {
  var exists = false;

  if ( document.cookie )
    {
    if ( document.cookie.length > 0 )
      {
                                    // trim name
      if ( ( name = name.replace ( /^\s*/, "" ).length > 0 ) )
        {
        var cookies = document.cookie.split ( ";" );
        var name_with_equal = name + "=";

        for ( var i = 0; ( i < cookies.length ); i++ )
          {
                                    // trim cookie
          var cookie = cookies [ i ].replace ( /^\s*/, "" );

          if ( cookie.indexOf ( name_with_equal ) === 0 )
            {
            exists = true;
            break;
            }
          }
        }
      }
    }

  return ( exists );

  } // cookie_exists

0

여기에 몇 가지 좋은 답변이 있습니다. 그러나 나는 [1] 정규 표현식을 사용하지 않고 [2] 읽기 쉬운 논리를 사용하고 [3] 이름이 다른 쿠키의 하위 문자열 인 경우 [4] 가 true를 반환 하지 않는 짧은 함수를 갖는 것을 선호합니다 . 이름. 마지막으로 [5] 우리는 리턴이 그것을 깨지 않기 때문에 for each 루프를 사용할 수 없습니다.

function cookieExists(name) {
  var cks = document.cookie.split(';');
  for(i = 0; i < cks.length; i++)
    if (cks[i].split('=')[0].trim() == name) return true;
}

0
function getcookie(name = '') {
    let cookies = document.cookie;
    let cookiestore = {};
    
    cookies = cookies.split(";");
    
    if (cookies[0] == "" && cookies[0][0] == undefined) {
        return undefined;
    }
    
    cookies.forEach(function(cookie) {
        cookie = cookie.split(/=(.+)/);
        if (cookie[0].substr(0, 1) == ' ') {
            cookie[0] = cookie[0].substr(1);
        }
        cookiestore[cookie[0]] = cookie[1];
    });
    
    return (name !== '' ? cookiestore[name] : cookiestore);
}

쿠키 개체를 얻으려면 간단히 getCookie()

쿠키가 있는지 확인하려면 다음과 같이하십시오.

if (!getcookie('myCookie')) {
    console.log('myCookie does not exist.');
} else {
    console.log('myCookie value is ' + getcookie('myCookie'));
}

또는 삼항 연산자를 사용하십시오.


0
function hasCookie(cookieName){
return document.cookie.split(';')
.map(entry => entry.split('='))
.some(([name, value]) => (name.trim() === cookieName) && !!value);
}

참고 : 작성자는 쿠키가 비어있는 경우 함수가 false를 반환하기를 원했습니다. 즉, cookie=;이는 && !!value조건으로 달성됩니다 . 빈 쿠키가 여전히 기존 쿠키라고 생각하면 제거하십시오.


0

var cookie = 'cookie1=s; cookie1=; cookie2=test';
var cookies = cookie.split('; ');
cookies.forEach(function(c){
  if(c.match(/cookie1=.+/))
   console.log(true);
});


안녕하세요, SO에 오신 것을 환영합니다! 이 코드가 질문에 답할 수 있지만 문제를 해결하는 방법 및 / 또는 이유에 대한 추가 컨텍스트를 제공하면 답변의 장기적인 가치가 향상됩니다. 읽기 바랍니다 투어를 하고, 어떻게 내가 좋은 답변을 작성하려면 어떻게해야합니까?
Tomer Shetah

0

쿠키가 안전한 경우 document.cookie(모든 답변이 사용하는)을 사용하여 클라이언트 측에서 존재 여부를 확인할 수 없습니다 . 이러한 쿠키는 서버 측에서만 확인할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.