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

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

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

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



답변

도메인이 헤더에 명시 적으로 명명 된 경우 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공유 하는 데에도 사용할 수 있습니다 .

또한보십시오:


답변

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


답변

다음은 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 에서 쿠키 키를 사용할 수 있습니까? 나는 이것이 허용된다는 것에 약간 놀랐다. 하위 도메인이 상위 도메인에서 쿠키를 설정할 수있는 것은 보안 위반이라고 가정했습니다.


답변

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

(요청에 대한 응답으로 보냄 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”과 도메인 일치하지 않습니다

이 답변 도 확인하십시오 .


답변

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

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


답변

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

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

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

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


답변

간단한 솔루션

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

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

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