하위 도메인과 도메인간에 쿠키 공유


420

두 가지 질문이 있습니다. .mydomain.com쿠키에서 도메인을 (점으로) 지정하면 모든 하위 도메인이 쿠키를 공유 할 수 있음을 이해합니다.

하위 도메인 없이 subdomain.mydomain.com만든 쿠키에 액세스 할 수 있습니까 ?mydomain.comwww

mydomain.com(를 빼고 www에서 만든 경우 하위 도메인) 쿠키에 액세스 subdomain.mydomain.com?




이 질문을 봐 주실 수 있습니까? stackoverflow.com/questions/38351769/…
Jayavardhan Gange

1
@ adam0101 도메인과 하위 도메인이 다른 서버에서 호스팅되면 어떻게됩니까?
user3782114

3
@ user3782114, 다른 서버에 있는지 여부는 중요하지 않습니다. 필자의 경우 서로 다른 서버에있을뿐 아니라 각 도메인이 여러 서버에 걸쳐로드 밸런싱되었습니다. 우리를 조금 트립시킨 한 가지는 낮은 환경 (dev, test, uat 등)이 "dev.oursite.com", "test. oursite.com "등이 있습니다. (적어도 .Net에서는) 각 환경에 대해 별도의 시스템 키를 생성하고 Web.config에 저장합니다 (각 환경에 대한 구성을 변환한다고 가정).
adam0101

답변:


653

도메인이 헤더에 명시 적으로 명명 된 경우 2 개의 도메인 mydomain.comsubdomain.mydomain.com쿠키 만 공유 할 수 있습니다 Set-Cookie. 그렇지 않으면 쿠키 범위가 요청 호스트로 제한됩니다. (이를 "호스트 전용 쿠키"라고합니다. 호스트 전용 쿠키 란 무엇입니까? )

예를 들어에서 다음 헤더를 subdomain.mydomain.com보낸 경우 요청에 쿠키가 전송되지 않습니다 mydomain.com.

Set-Cookie: name=value

그러나 다음을 사용하면 두 도메인에서 모두 사용할 수 있습니다.

Set-Cookie: name=value; domain=mydomain.com

이 쿠키 는와 같은 중첩 된 하위 도메인을 포함하여 mydomain.com의 모든 하위 도메인에 전송됩니다 subsub.subdomain.mydomain.com.

에서 RFC 2109 , 선도적 인 점없는 도메인이 하위 도메인에 사용할 수 없습니다 수 있으며, 단지 선행 점은 (의미 .mydomain.com)는 최상위 도메인을 여러 하위 도메인 사용 (하지만 할 수 있도록했다 당신이 무엇을 물어 수있는 것 이전 사양에서는 불가능합니다).

그러나 모든 최신 브라우저는 최신 사양 RFC 6265를 준수 하며 선행 점을 무시하므로 최상위 도메인뿐만 아니라 하위 도메인에서도 쿠키를 사용할 수 있습니다.

요약하면에서 위의 두 번째 예와 같은 쿠키를 설정하면에서 쿠키에 mydomain.com액세스 할 수 subdomain.mydomain.com있으며 그 반대도 마찬가지입니다. 쿠키 를 허용 sub1.mydomain.com하고 sub2.mydomain.com공유 하는 데에도 사용할 수 있습니다 .

또한보십시오:


3
감사; 나는 점의 중요성에 대한 메모를 추가했습니다.
cmbuckley

2
왜 당신이 단지 ""를 넣지 않았는지 이해할 수 없습니다. 기존 및 신규와의 최대 호환성을 위해 도메인에서
Alan Macdonald

12
이전 표준에서 with my 쿠키 domain=.mydomain.com는 bare mydomain.com에 유효하지 않으므로 두 RFC는 서로 호환되지 않습니다.
cmbuckley

4
@ 프랭크, 예, 알고 있습니다. 내 의견은 내 질문이 두 개의 하위 도메인이 아닌 도메인과 하위 도메인 간의 쿠키 공유와 관련이 있음을 분명히하는 것이 었습니다.
adam0101

3
이것을 어디에 넣을 지 잘 모르겠으므로 허용 된 답변의 의견을 선택하고 있습니다. 이름에 점이있는 localhost를 호출해야 할 때까지 로컬 호스트에서 위의 내용을 입증하는 데 오랜 시간이 걸리고 실험에 실패했습니다. "localhost.com"또는 이와 유사한 것 그런 다음 모든 "세트 쿠키"동작이이 답변의 여기에 작성된 설명에 따라 시작되었습니다. 이것이 누군가를 도울 수 있기를 바랍니다.
Cesc

32

@cmbuckley 답변이 전체 그림을 표시하는지 잘 모르겠습니다. 내가 읽는 것은 :

쿠키의 속성이 달리 나타내지 않는 한 쿠키는 원본 서버로만 반환되고 (예 : 하위 도메인으로) 반환되지 않으며 현재 세션이 끝날 때 (사용자 에이전트가 정의한대로) 만료됩니다. 사용자 에이전트는 인식 할 수없는 쿠키를 무시합니다.

RFC 6265

또한

8.6.  Weak Integrity

   Cookies do not provide integrity guarantees for sibling domains (and
   their subdomains).  For example, consider foo.example.com and
   bar.example.com.  The foo.example.com server can set a cookie with a
   Domain attribute of "example.com" (possibly overwriting an existing
   "example.com" cookie set by bar.example.com), and the user agent will
   include that cookie in HTTP requests to bar.example.com.  In the
   worst case, bar.example.com will be unable to distinguish this cookie
   from a cookie it set itself.  The foo.example.com server might be
   able to leverage this ability to mount an attack against
   bar.example.com.

즉, 하위 도메인 / 도메인이 쿠키를 읽지 못하도록 보호 할 수 있지만 다른 도메인에 쿠키를 작성하는 것을 막을 수는 없습니다. 따라서 누군가 동일한 브라우저가 방문하는 다른 하위 도메인을 제어하여 사이트 쿠키를 다시 작성할 수 있습니다. 큰 관심사가 아닐 수도 있습니다.

@cmbuckley에서 제공 한 멋진 쿠키 테스트 사이트 / 나 같은 답변에서 놓친 사람들을 위해; 스크롤 업 및 업 보트 가치 :


4
그것은 내가 말하는 것에 동의하는 것 같습니다 :을 지정하지 않으면 domain쿠키는 요청 호스트에만 사용됩니다. 이는 Set-Cookie: name=valuefrom mydomain.com이 하위 도메인에 대한 요청과 함께 전송되지 않음을 의미합니다 . 이 테스트 스크립트를 가지고 놀아보십시오 .
cmbuckley

@ cmbuckley, 좋아, 당신이 말한 것이 맞아 보입니다. 나는 대답을 바꿔 줄 것이다. 지적 해 주셔서 감사합니다.
akostadinov

4.1.2 절 (첫 인용)이 규범 적이 지 않다는 점을 지적 할 필요가있다.
Velda

cmbuckley 링크에 감사드립니다. 그것이 어떻게 빨리 작동하는지 테스트하는 것이 좋습니다.
lawphotog

22

다음은 DOM 쿠키 API ( https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie ) 를 사용하는 예제 이므로 동작을 직접 확인할 수 있습니다.

다음 JavaScript를 실행하면

document.cookie = "key = value"

다음과 같은 것으로 보입니다.

document.cookie = "key = value; domain = mydomain.com"

쿠키 키는 도메인에 (만) 사용할 수 mydomain.com .


이제 mydomain.com에서 다음 JavaScript를 실행하면

document.cookie = "key = value; domain = .mydomain.com"

쿠키 키를 사용할 수있게 mydomain.com 뿐만 아니라 subdomain.mydomain.com .


마지막으로 subdomain.mydomain.com에서 다음을 시도하고 실행하려는 경우 :

document.cookie = "key = value; domain = .mydomain.com"

subdomain.mydomain.com 에서 쿠키 키를 사용할 수 있습니까? 나는 이것이 허용된다는 것에 약간 놀랐다. 하위 도메인이 상위 도메인에서 쿠키를 설정할 수있는 것은 보안 위반이라고 가정했습니다.


1
httponly쿠키 의 동작과 생성하는 쿠키의 종류를 설명하는 별도의 사양이 있는지 궁금합니다 .
adam0101

3
게시 한 문서가 귀하가 작성한 진술에 동의하지 않습니다. 처음 두 예제는 동일 하지 않습니다 ( domain속성으로 인해 쿠키가 하위 도메인에서 작동하게되며 그러한 특성은 작동하지 않습니다). 선행 점은 기껏해야 무시되고 최악의 경우 적극적으로 차단됩니다.
cmbuckley

호스트 헤더에 의존하고 싶지 않은 경우 이것이 가장 좋은 솔루션입니다. 나는 그것과 그 작동을 확인
Szymon

14

도메인의 하위 도메인에서 쿠키를 설정할 수 있습니다.

(요청에 대한 응답으로 보냄 subdomain.mydomain.com)

Set-Cookie: name=value; Domain=mydomain.com // GOOD

그러나 하위 도메인의 도메인에서 쿠키를 설정할 수 없습니다 .

(요청에 대한 응답으로 보냄 mydomain.com)

Set-Cookie: name=value; Domain=subdomain.mydomain.com // Browser rejects cookie

왜 ?

사양 RFC 6265 섹션 5.3.6 스토리지 모델에 따름

정규화 된 요청 호스트가 그렇지 않은 경우 도메인 속성 도메인 일치 쿠키를 완전히 무시하고이 단계를 중단하십시오.

RFC 6265 섹션 5.1.3 도메인 매칭

도메인 매칭

다음 조건 중 하나 이상에 해당하면 문자열이 지정된 도메인 문자열과 일치합니다.

  1. 도메인 문자열과 문자열이 동일합니다. (이 시점에서 도메인 문자열과 문자열은 모두 소문자로 표준화되었습니다.)

  2. 다음 조건이 모두 유지됩니다.

    • 도메인 문자열은 문자열의 접미사입니다.

    • 도메인 문자열에 포함되지 않은 문자열의 마지막 문자는 % x2E ( ".") 문자입니다.

    • 문자열은 호스트 이름입니다 (즉, IP 주소가 아님).

따라서 "subdomain.mydomain.com"도메인은 "mydomain.com"과 일치하지만 "mydomain.com"은 "subdomain.mydomain.com"과 도메인 일치하지 않습니다

이 답변 도 확인하십시오 .


이것은 나에게 가장 도움이되는 답변이었습니다.
Toby

3

두 경우 모두 가능합니다. IE와 Edge의 기본 동작입니다.

다른 답변은 귀중한 통찰력을 추가하지만 주로 Chrome의 동작을 설명합니다. IE에서는 동작이 완전히 다르다는 점에 유의해야합니다. CMBuckley의 매우 유용한 테스트 스크립트는 Chrome에서 도메인이 지정되지 않은 경우 쿠키가 루트와 하위 도메인간에 공유되지 않음을 보여줍니다. 그러나 IE에서 동일한 테스트를 통해 공유 한 것으로 나타났습니다. 이 IE 사례는 CMBuckley의 www-or-not-www 링크에있는 가정 설명에 더 가깝습니다. 루트와 하위 도메인에서 서로 다른 서비스 스택 쿠키를 사용하는 시스템이 있기 때문에 이것이 사실입니다. 누군가 IE에서 액세스 할 때까지 잘 작동했으며 두 시스템이 캐시를 폭발시킬 때까지 세션 쿠키가 이길 수있는 사람과 싸웠습니다.


0

localhost에서 작업하는 경우주의하십시오! 쿠키를 js에 다음과 같이 저장하면 :

document.cookie = "key=value;domain=localhost"

과 같은 하위 도메인에 액세스하지 못할 수 있습니다 sub.localhost. 이 문제를 해결하려면 가상 호스트 를 사용해야 합니다. 예를 들어 가상 호스트를 구성하면 ServerName localhost.com다음과 같이 도메인과 하위 도메인에 쿠키를 저장할 수 있습니다.

document.cookie = "key=value;domain=localhost.com"

-12

간단한 솔루션

setcookie("NAME", "VALUE", time()+3600, '/', EXAMPLE.COM);

Setcookie의 5 번째 매개 변수는 쿠키를 사용할 수있는 (하위) 도메인을 결정합니다. (EXAMPLE.COM)으로 설정하면 모든 하위 도메인에서 사용할 수 있습니다 (예 : SUBDOMAIN.EXAMPLE.COM)

참조 : http://php.net/manual/en/function.setcookie.php


17
이 질문은 PHP에만 국한된 것이 아니며, 그것이 유효한 것으로 생각하지 않습니다.
sergelerator

1
Sergelerator, 나는 질문을 제기하지 않았다. OP에 응답하고있었습니다.
Lawes

4
@Lawes 나는 sergelator가 OP의 질문이 PHP에 국한되지 않았다는 것을 의미한다고 생각하지만 귀하의 답변은 PHP 전용 솔루션 인 것처럼 보이므로 OP의 질문에 적합하지 않습니다.
Mirage
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.