명시 적 도메인을 가진 localhost의 쿠키


191

쿠키에 대한 몇 가지 기본 사항이 누락되어 있어야합니다. 나는 서버 측에 쿠키를 설정 로컬 호스트에 로컬 호스트 (또는 .localhost) 명시 적으로 도메인을 지정합니다. 쿠키가 일부 브라우저에서 허용되지 않는 것 같습니다.

Firefox 3.5 : Firebug에서 HTTP 요청을 확인했습니다. 내가 보는 것은 :

Set-Cookie:
    name=value;
    domain=localhost;
    expires=Thu, 16-Jul-2009 21:25:05 GMT;
    path=/

또는 (도메인을 .localhost로 설정 한 경우) :

Set-Cookie:
    name=value;
    domain=.localhost;
    expires=Thu, 16-Jul-2009 21:25:05 GMT;
    path=/

두 경우 모두 쿠키가 저장되지 않습니다.

IE8 : 추가 도구를 사용하지 않았지만 쿠키가 후속 요청에서 다시 전송되지 않기 때문에 쿠키도 저장되지 않은 것 같습니다.

Opera 9.64 : localhost와 .localhost 모두 작동 하지만 Preferences에서 쿠키 목록을 확인하면 도메인이 localhost (목록 그룹화) 아래에 나열되어 있어도 도메인은 localhost.local로 설정됩니다.

Safari 4 : localhost 및 .localhost는 모두 작동 하지만 환경 설정에서 항상 .localhost로 나열됩니다. 반면에 명시 적 도메인이없는 쿠키는 로컬 호스트 (점 없음)로 표시됩니다.

localhost의 문제점은 무엇입니까? 이러한 불일치로 인해 localhost와 관련된 특수 규칙이 있어야합니다. 또한 왜 도메인에 점이 붙어야하는지는 명확하지 않습니다. RFC 2109는 다음과 같이 명시 적으로 설명합니다.

Domain 속성 값에 포함 된 점이 없거나 점으로 시작하지 않습니다.

왜? 이 문서에는 보안 관련 작업이 필요하다는 내용이 나와 있습니다. 나는 전체 사양을 읽지 않았다는 것을 인정해야하지만 (나중에 할 수도 있음) 조금 이상하게 들립니다. 이를 기반으로 localhost에서 쿠키를 설정하는 것은 불가능합니다.


14
6 살짜리 실인데 여전히 문제입니다. Chrome v40을 사용하고 있습니다. 여기를 참조 하십시오 .
Gaui

5
Chrome 43 ... 여전히 버그입니다.
Evan Carroll

4
Chrome 54는 해결되지 않음
Vahid Amiri

6
Chrome 73 .. 여전히 같은 문제가 발생합니다. :(
Code_Crash

2
누구든지 이것을 해결할 수 있습니까? 여전히 같은 s *** .. 이 SO 답변을 참조하십시오
Bonjour123

답변:


236

설계 상 도메인 이름에는 최소한 두 개의 점이 있어야합니다. 그렇지 않으면 브라우저가 유효하지 않은 것으로 간주합니다. ( http://curl.haxx.se/rfc/cookie_spec.html의 참조를 참조 하십시오 )

작업시 localhost쿠키 도메인은 완전히 생략해야합니다. 그냥으로 설정 ""하거나 NULL또는 FALSE대신하는 것은 "localhost"충분하지 않습니다.

PHP의 경우 http://php.net/manual/en/function.setcookie.php#73107에 대한 주석을 참조 하십시오 .

Java Servlet API로 작업하는 경우 cookie.setDomain("...")메소드를 전혀 호출하지 마십시오 .


93
왜 모든 사람이 이것을 +1하고 있는지 잘 모르겠습니다. 쿠키의 도메인을 null 또는 false 또는 빈 문자열로 설정했는데 여전히 localhost에 저장되지 않습니다.
저스틴

5
도메인의 두 점에 대해 RFC6265의 어느 곳도 보이지 않습니다. tools.ietf.org/html/rfc6265#section-5.2.3 .Net은 로컬 도메인의 모든 호스트에 대해 ".local"로 설정했다고 말합니다. Opera / Safari와 일치하는 것 같습니다 msdn.microsoft.com/en-us/library/ckch3yd2.aspx
MandoMando

9
@Justin : 흠, Domain=쿠키를 설정할 때 매개 변수 를 완전히 생략해야합니다 . 도메인을 null 또는 비어있는 상태로 설정하면 프레임 워크가 Domain=매개 변수를 생략하지 않고 해당 값으로 매개 변수를 보냅니다 . 예를 들어 Firebug로 확인하십시오.
sleske 2013 년

2
@Ralph, 100 만 감사,이 일은 몇 시간 동안 나를 미치게했다. 바라건대 Domain을 null로 설정하면 (.Net 서버 스택에 있음) 매력처럼 작동합니다.
Xose Lluis 2016

4
이것은 다소 잘못된 표현입니다. "널 (null) 또는 거짓 (false) 또는 빈 문자열로 설정"은 "쿠키의 '도메인'부분을 전혀 설정하지 않음"을 읽어야합니다. 예를 들어, 간단한 테스트를 사용하여 쿠키의 도메인 섹션을 완전히 제거하면 localhost에서 작동합니다.((domain && domain !== "localhost") ? ";domain="+domain : "")
L0j1k

34

@Ralph Buchfelder에 광범위하게 동의하지만 로컬 컴퓨터 (example.com, fr.example.com, de.example.com과 같은 여러 하위 도메인이있는 시스템을 복제하려고 할 때 실험을 통해이를 증폭시키는 방법이 있습니다) OS X / Apache / Chrome | Firefox).

127.0.0.1에서 가상의 하위 도메인을 가리 키도록 / etc / hosts를 편집했습니다.

127.0.0.1 localexample.com
127.0.0.1 fr.localexample.com
127.0.0.1 de.localexample.com

fr.localexample.com에서 작업 중이고 domain 매개 변수를 제외하면 fr.localexample.com에 대해 쿠키가 올바르게 저장되지만 다른 하위 도메인에는 표시되지 않습니다.

나는 ".localexample.com"의 도메인을 사용하는 경우, 쿠키가 fr.localexample.com 제대로 저장되고 있다 다른 하위 도메인에 표시.

"localexample.com"도메인을 사용하거나 "localexample"또는 "localhost"도메인을 시도 할 때 쿠키가 저장되지 않았습니다.

"fr.localexample.com"또는 ".fr.localexample.com"도메인을 사용하는 경우 쿠키는 fr.localexample.com에 대해 올바르게 저장되고 다른 하위 도메인에 (올바르게) 보이지 않습니다.

따라서 도메인에 두 개 이상의 점이 필요하다는 요구 사항은 왜 그래야하는지 알 수 없지만 올바른 것으로 보입니다.

누군가 이것을 시도하고 싶다면 다음과 같은 유용한 코드가 있습니다.

<html>
<head>
<title>
Testing cookies
</title>
</head>
<body>
<?php
header('HTTP/1.0 200');
$domain = 'fr.localexample.com';    // Change this to the domain you want to test.
if (!empty($_GET['v'])) {
    $val = $_GET['v'];
    print "Setting cookie to $val<br/>";
    setcookie("mycookie", $val, time() + 48 * 3600, '/', $domain);
}
print "<pre>";
print "Cookie:<br/>";
var_dump($_COOKIE);
print "Server:<br/>";
var_dump($_SERVER);
print "</pre>";
?>
</body>
</html>

30

localhost : 당신은 사용할 수 있으며 domain: ".app.localhost"작동합니다. '도메인'매개 변수는 1 개 이상의 점을 필요로 쿠키를 설정하기위한 도메인 이름. 그런 다음 다음과 같은 로컬 호스트 하위 도메인에서 세션을 작동시킬 수 있습니다 api.app.localhost:3000.


1
또한 Express 3.x를 사용하여 node.js 서버에서 테스트 및 작업express.session({cookie: { domain: '.app.localhost', maxAge: 24 * 60 * 60 * 1000 }})
AmpT

3
로컬 도메인을 사용하는 경우이 답변을 선택해야합니다! 하위 도메인 앞에 점을 넣으면 문제가 해결됩니다.
Foxhoundn

1
그렇다면이 선점은 어디에서 .app.오는가? 일부 SPEC의 일부입니까? 그리고 모든 부적합 영역 (두 개의 점이없는 영역)에 적용 할 수 있습니까? 또한 오래된 브라우저에서도 작동합니까? : ^)
user2173353

아 .. 이제 이해합니다 ... 브라우저를 속이는 것은 속임수입니다. 확인.
user2173353

14

쿠키가 다음과 같이 'localhost'의 명시 적 도메인으로 설정된 경우 ...

쿠키 설정 : 이름 = 값; domain = localhost ; 만기 = 목, 2009 년 7 월 16 일 21:25:05 GMT; 경로 = /

... 브라우저는 최소 2 개의 기간을 포함하지 않으며 특별히 처리 된 7 개의 최상위 도메인 중 하나가 아니기 때문에이를 무시 합니다 .

..... ". com", ".edu"및 "va.us"형식의 도메인을 방지하려면 도메인에 2 ~ 3 개의 기간이 있어야합니다. 아래에 나열된 7 개의 특수 최상위 도메인 중 하나에 실패하는 도메인은 두 개의 기간 만 필요합니다. 다른 도메인은 3 개 이상이 필요합니다. 7 개의 특별한 최상위 도메인은 "COM", "EDU", "NET", "ORG", "GOV", "MIL"및 "INT"입니다.

위의 기간 수는 아마도 선행 기간이 필요하다고 가정합니다. 그러나이 기간은 최신 브라우저에서 무시되며 아마도 읽을 것입니다 ...

적어도 하나 또는 둘 이상의 기간

domain 속성의 기본값 은 쿠키 응답을 생성 한 서버의 호스트 이름입니다 .

따라서 localhost에 대해 쿠키를 설정하지 않는 해결 방법은 단순히 도메인 속성을 지정하지 않고 브라우저가 기본값을 사용하도록하는 것입니다. 이것은 도메인 속성의 명시 적 값과 동일한 제한 조건이없는 것으로 보입니다.


나는 DV를하지 않았지만 다른 사람들이 한 이유는 당신의 대답이 실제로 많은 가치를 부가하지 않기 때문입니다. 두 기간 요구 사항과 도메인 속성을 비워 두는 것은 다른 답변에서 논의되었습니다. 또한 최상위 도메인에 대해 추가 한 내용이 잘못된 것 같습니다. 내 경험상 그것은 요구 사항이 아닙니다.
TTT

@TTT 선행 기간이 무시되기 때문에 TLD에 따라 적어도 1 또는 2 기간이어야한다고 말하는 대답에 비트가 있는지 확실하지 않습니까? 따라서 문제에 대한 배경 지식을 제공하고 다른 곳에서는 다루지 않는다고 생각하는 점을 추가했습니다. 규칙은 명시 적 도메인과 브라우저의 기본 규칙이 다릅니다. 그것은 나에게 어떤 가치를 부여하는 것 같습니다.
Scott Munro

1
도메인을 null로두면 (설정하지 않음) Chrome이 localhost에 쿠키를 유지하지 않습니다. 여전히 무시합니다. 이는 "영구"쿠키 (만료 날짜를 설정하는 쿠키)에만 적용됩니다. 로컬 호스트 (만료 날짜를 설정하지 않은 쿠키)에 대한 "세션"쿠키에 매달리기 때문입니다.
Triynko

3

결과는 브라우저마다 다릅니다.

Chrome 127.0.0.1은 작동했지만 localhost .localhost 및 ""는 작동하지 않았습니다. Firefox- .localhost는 작동했지만 localhost, 127.0.0.1 및 ""는 작동하지 않았습니다.

Opera, IE 또는 Safari에서 테스트하지 않았습니다


3
Chrome V.22.0.1229.94 m : Domain=매개 변수가 제공되지 않고 로컬 호스트의 쿠키 설정으로 테스트했습니다 . Domain=또한 작동하지만 작동 Domain=localhost하지 않습니다.
sleske

3

이 문제를 직접 해결하는 데 많은 시간을 보냈습니다.

PHP를 사용하면이 페이지의 아무것도 작동하지 않았습니다. 결국 내 코드에서 PHP의 session_set_cookie_params () 에 대한 'secure'매개 변수 가 항상 TRUE로 설정되고 있음을 깨달았습니다 .

https로 localhost를 방문하지 않았으므로 브라우저는 쿠키를 허용하지 않습니다. 따라서 $ _SERVER [ 'HTTP_HOST']를 기반으로 'localhost'인지 여부에 따라 '보안'매개 변수를 조건부로 설정하도록 코드의 해당 부분을 수정했습니다. 지금 잘 작동합니다.

나는 이것이 누군가를 돕기를 바랍니다.


2

다른 도메인에서 쿠키를 설정하는 경우 (예 : XHR 교차 출처 요청을 통해 쿠키를 설정하는 경우) 여기에withCredentials 설명 된대로 쿠키를 가져 오는 데 사용하는 XMLHttpRequest 에서 속성을 true로 설정해야합니다 .


그래도 그래. 교차 도메인 요청에서는 여전히 작동하지 않습니다. 브라우저-Safari, IE 11
Rohit Kumar

2

당신은 그것을 사용 localhost.org하거나 오히려 .localhost.org항상 해결할 것입니다127.0.0.1


1

127.0.0.1을 도메인으로 사용하여 로컬에서 테스트하는 것이 훨씬 낫습니다. 왜 그런지 모르겠지만 localhost 및 .localhost 등과 결과가 혼합되었습니다.


1

제안 된 수정 프로그램 중 어느 것도 나를 위해 효과가 없었습니다 .null, false로 설정하고 두 개의 점을 추가하는 등은 작동하지 않았습니다.

결국 쿠키가 localhost이고 이제 쿠키가 Chrome 38 에서 작동하는 경우 쿠키에서 도메인을 제거했습니다 .

이전 코드 (작동하지 않음) :

document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';domain=.' + document.domain + ';path=/;';

새 코드 (현재 작동) :

 if(document.domain === 'localhost') {
        document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';path=/;' ;
    } else {
        document.cookie = encodeURI(key) + '=' + encodeURI(value) + ';domain=.' + document.domain + ';path=/;';
    }

1

나는 같은 문제가 있었고 도메인을 지정하지 않고 쿠키 이름 자체에 2 개의 점을 넣어서 고쳤습니다.

set-cookie: name.s1.s2=value; path=/; expires=Sun, 12 Aug 2018 14:28:43 GMT; HttpOnly

1

사용할 때 문제가있는 것 같습니다 https://<local-domain>다음과 http://<local-domain>. http://사이트는 이후 요청에 쿠키를 전송하지 않는 https://사이트 세트 그들. 강제로 다시로드하고 캐시를 지우는 것은 도움이되지 않습니다. 쿠키 수동 삭제 만 작동합니다. 또한 https://페이지에서 지우면 http://페이지가 다시 작동하기 시작합니다.

"엄격한 보안 쿠키"와 관련이있는 것 같습니다. 여기에 좋은 설명이 있습니다 . 그것은 한 크롬 58 년에 발표 2017년 4월 19일에.

Chrome은 실제로 주소 표시 줄 아이콘을 클릭 할 때 페이지 프로토콜에 따라 올바른 쿠키를 표시하므로 보안 쿠키와 비보안 쿠키를 모두 기록하는 것처럼 보입니다.

그러나 Developer tools > Application > Cookies동일한 도메인에 동일한 이름의 보안 쿠키가있는 경우 비보안 쿠키를 표시하지 않으며 요청과 함께 비보안 쿠키를 보내지 않습니다. 이것은 Chrome 버그처럼 보이거나이 동작이 예상되는 경우 http페이지에 있을 때 보안 쿠키를보고 쿠키 가 재정의되고 있음을 나타내는 방법이 있어야합니다 .

해결 방법은 http 사이트 또는 https 사이트에 대한 것인지 여부에 따라 다른 이름의 쿠키를 사용하고 앱에 고유 한 이름을 지정하는 것입니다. __Secure-접두사는 쿠키가 엄격하게 안전해야 함을 나타냅니다, 또한 좋은 연습 보안 및 비보안 충돌하지 않기 때문이다. 있다 다른 혜택 도 접두사로는.

/etc/hostshttps 대 http 액세스에 서로 다른 도메인을 사용하면 작동하지만 실수로 한 번 https://localhost방문하면 동일한 이름의 쿠키가 http://localhost사이트 에서 작동 하지 못하므로 좋은 해결 방법이 아닙니다.

내가 제출 한 크롬 버그 리포트를 .


0

document.cookie = valuename + "="+ value + ";"+ 만료 + "; domain =; path = /";

이 "도메인 =; 경로 = /"; 쿠키가 하위 도메인에서 작동하므로 동적 도메인을 사용합니다. localhost에서 테스트하고 싶다면 작동합니다.


0

여기에 대한 답변 중 어느 것도 나를 위해 일하지 않았습니다. PHP를 페이지의 첫 번째 항목으로 지정하여 문제를 해결했습니다.

다른 헤더와 마찬가지로 쿠키는 스크립트에서 출력하기 전에 보내 져야합니다 (프로토콜 제한 사항입니다). 이를 위해서는 공백뿐만 아니라 태그를 포함한 출력 전에이 함수를 호출해야합니다.

에서 http://php.net/manual/en/function.setcookie.php


그러나 문제와는 아무런 관련이 없습니다. 헤더 앞에 다른 출력을 보내는 실수는 아닙니다.
Marnes


0

나는 조금 놀았다.

Set-Cookie: _xsrf=2|f1313120|17df429d33515874d3e571d1c5ee2677|1485812120; Domain=localhost; Path=/

현재 Firefox 및 Chrome에서 작동합니다. 그러나 컬을 사용할 수있는 방법을 찾지 못했습니다. 나는 Host-Header를 시도했고 운이 좋으면 도움을주었습니다.

그러나 설정하면 컬로 작동합니다.

Set-Cookie: _xsrf=2|f1313120|17df429d33515874d3e571d1c5ee2677|1485812120; Domain=127.0.0.1; Path=/

대신에. Firefox에서는 작동하지 않습니다.


0

또 다른 중요한 세부 사항 인 expires = 는 다음 날짜 시간 형식을 사용해야합니다. Wdy, DD-Mon-YYYY HH : MM : SS GMT ( RFC6265-섹션 4.1.1 ).

Set-Cookie:
  name=value;
  domain=localhost;
  expires=Thu, 16-07-2019 21:25:05 GMT;
  path=/

5
-1 쿠키의 현재 사양은 RFC 6265, tools.ietf.org/html/rfc6265 이며 4 자리 연도는 명시 적으로 명시되어 있습니다. 따라서 다른 브라우저가 다르게 해석하는 2 자리 연도를 사용하는 것은 좋지 않습니다.
sleske

옳은. RFC6265 섹션 4.1.1 참조
Zen Cart

4
맞지만 2011 년 6 월에이 RFC를 찾지 못했습니다. 따라서이 정보는 이제 정확하지 않지만, 내가 쓸 당시에는 그렇지 않았습니다.
Tralamazza

4
사소한 일로 바꾸지 말고 우리 모두가 답변을 최신 상태로 유지하도록 도와야합니다. @sleske가 제공 한 최신 정보로 답변을 업데이트하고 도움을 주셔서 감사합니다.
Matthew Purdon

0

많은 실험과 다양한 게시물을 읽은 후 효과가있었습니다. 쿠키를 여러 개 설정하고 다시 읽고 시간을 설정 한 후 삭제할 수 있습니다.

func addCookie(w http.ResponseWriter, name string, value string) {
    expire := time.Now().AddDate(0, 0, 1)
    cookie := http.Cookie{
       Name:    name,
       Value:   value,
       Expires: expire,
       Domain:  ".localhost",
       Path:    "/",
    }
    http.SetCookie(w, &cookie)
}

0

나를 위해 일한 유일한 것은 Path=/쿠키 를 설정 하는 것이 었습니다 .

또한 경로 속성의 기본값은 브라우저 (브라우저) 중 두 개만 테스트했지만 브라우저마다 다릅니다.

Chrome은 쿠키를있는 그대로 설정하려고합니다. 경우 path속성이 생략 Set-Cookie헤더 다음 저장 및 무시되지 않습니다.

그러나 Firefox는 명시 적 path속성 없이도 쿠키를 저장 합니다. 요청 된 경로로 설정했습니다. 내 요청 URL이었고 /api/v1/users경로가 /api/v1자동으로 설정되었습니다 .

어쨌든, 두 브라우저 모두 명시 적 도메인, 즉 다른 것 없이 path설정 되었을 때 작동했습니다 . 따라서 각 브라우저가 쿠키를 처리하는 방식에는 약간의 차이가 있습니다./Domain=localhost

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