하위 도메인에서 localStorage 사용


95

쿠키를 지원할 수있는 브라우저 (IE 제외)에서 쿠키를 localStorage로 대체 하고 있습니다. 문제는 site.comwww 입니다. site.com 은 별도의 localStorage 개체를 저장합니다. 나는 www가 하위 도메인으로 간주된다고 생각합니다 (물어 보면 어리석은 결정). 사용자가 원래 site.com에 있었고 www 를 입력하기로 결정한 경우 . site.com 을 방문하면 모든 개인 데이터에 액세스 할 수 없습니다. 모든 "하위 도메인"이 기본 도메인과 동일한 localStorage를 공유하도록하려면 어떻게해야합니까?


4
Firefox 및 IE8은 사용자 지정 도메인에 영구 데이터 저장을 지원합니다. 예를 들어 FF에서 globalStorage [ 'site.com']을 수행 할 수 있으며 이는 www.site.com 및 site.com에서 가능합니다. Chrome 구현에서이 작업을 수행하는 방법을 아직 파악하지 못했습니다.
JoJo

9
하나 또는 후자를 사용하는 것을 고려하십시오-www를 방문하는 모든 사용자를 리디렉션하십시오. 하위 도메인이없는 도메인에 하위 도메인을 추가하거나 그 반대입니다.
Elad Nava

오래 전에 기사를 작성했습니다. Cross-Domain LocalStorage
jcubic

답변:


94

이것이 내가 여러 도메인에서 사용하는 방법입니다 ...

  • 상위 도메인의 iframe 사용-parent.com
  • 그런 다음 각 child.com 도메인에서 parent.com iframe에 postMessage를 수행하십시오.
  • 여러분이해야 할 일은 parent.com iframe과 통신하기 위해 postMessage 메시지를 해석하는 방법에 대한 프로토콜을 설정하는 것뿐입니다.

나는 그것이 도움이되기를 바랍니다 :)


2
이것은 확인 된 답변이 아니라 실제 답변입니다. 이 작업을 직접 수행했지만 postMessage로 편리한 콜백 래퍼도 만들었습니다.
제이슨 세브링

4
다음은이 방법을 설명하는 몇 가지 예제 코드와 함께 좋은 기사입니다. jcubic.wordpress.com/2014/06/20/cross-domain-localstorage
Todd Price

4
타사 쿠키가 비활성화되지 않은 경우에만 가능합니다. stackoverflow.com/a/44097269/4311428
Max

6
Apple은 타사 데이터를 차단하기 위해 데스크톱과 모바일 모두에서 Safari 7+의 기본값을 업데이트했습니다. 이 옵션은 이제 "쿠키 및 기타 웹 사이트 데이터 차단"이라고 불리며, 이는 이제 도메인에 의해 완전히 격리 된 localstorage와 같은 것을 말합니다. Safari에서이 방법을 작동 실 거예요
Aranganathan

2
@Max @Aranganathan는 여전히 작동 원래 질문의 경우에 - site.com/ www.site.com한 하위 도메인이 동일한 상위 도메인에로
Kostiantyn

40

이 특정 문제에 대해 iframe 및 postMessage 솔루션을 사용하는 경우 하위 도메인이없는 쿠키에 데이터를 저장하는 것이 (코드 및 계산 모두) 덜 작업 할 수 있으며 아직 그렇지 않은 경우 로드시 localStorage에서 쿠키에서 가져옵니다 .

장점 :

  • 추가 iframe 및 postMessage 설정이 필요하지 않습니다.

단점 :

  • www뿐 아니라 모든 하위 도메인에서 데이터를 사용할 수 있으므로 모든 하위 도메인을 신뢰하지 않으면 작동하지 않을 수 있습니다.
  • 각 요청에 대해 데이터를 서버로 보냅니다. 좋지는 않지만 시나리오에 따라 iframe / postMessage 솔루션보다 작업량이 적을 수 있습니다.
  • 이 경우 쿠키를 직접 사용하지 않는 이유는 무엇입니까? 상황에 따라 다릅니다.
  • 도메인의 모든 쿠키에서 총 4K 최대 쿠키 크기 (댓글에서 지적 해 주신 Blake에게 감사드립니다)

나는 다른 주석가들과 동의하지만 이것은 localStorage에 대한 지정 가능한 옵션이어야하므로 해결 방법이 필요하지 않습니다.


29
단점 : 최대 쿠키 크기 4k
Blake Miller

17
또한 어려운 방법을 배웠 듯이 4k 제한은 각 쿠키가 아닌 단일 도메인에 대한 모든 쿠키 크기의 합계입니다.
Blake Miller

기타 단점 :-쿠키는 광고 차단기에 의해 차단 될 가능성이 높습니다.-쿠키는 서버와 클라이언트간에 작은 데이터를 공유하는 데 사용됩니다. 서버가 쿠키에 저장 한 데이터를 사용하지 않는 경우 이는 결과적으로 오용입니다.
Enno

32

일관성과 이와 같은 문제를 피하기 위해 site.com을 www.site.com으로 리디렉션하는 것이 좋습니다.

또한 각 브라우저 기본 저장소를 사용할 수있는 PersistJS 와 같은 브라우저 간 솔루션 사용을 고려하십시오 .


이러한 리디렉션을 수행하기 위해 서버에 대한 관리자 액세스 권한이 없습니다. 이 라이브러리를 사용하면 www와 비 www간에 영구 데이터를 공유 할 수 있습니까? 약간의 읽기를 수행 한 후에는 거의 모든 브라우저의 저장 메커니즘이이를 허용하지 않는 것 같습니다. 쿠키이든 localStorage이든 상관없이이 문제가 발생합니다.
JoJo

예, 스토리지는 일반적으로 하위 도메인을 포함하여 도메인에 따라 다릅니다. 이것이 내가 리디렉션을 제안한 이유입니다. 관리자 액세스가 반드시 필요한 것은 아닙니다. 문서 루트에서 .htaccess 규칙을 사용하면됩니다
Eran Galperin

1
@JoJo 리디렉션하는 방법에는 여러 가지가 있습니다. 예를 들어 헤더를 보내 Location거나 <meta>HTML 태그를 통해 , 심지어 JS를 통해 window.location.
Sony Santos

1
이것은 대답을 피하는 것입니다. Mayank의 답변을 올바른 것으로 참조하십시오.
제이슨 세브링

1
+1 @avoiding, 여기에있는 다른 경우와는 관련이 없습니다. lang1.domain.com-lang2.domain.com
r --------- k

6

메인 도메인에서 쿠키로 설정-

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

그런 다음 기본 도메인 또는 하위 도메인에서 데이터를 가져 와서 localStorage에 설정합니다.


4

나는 xdLocalStorage를 사용하고 있는데, 이것은 LocalStorage 인터페이스를 구현하고 iframe 포스트 메시지 통신을 사용하여 도메인 간 스토리지를 지원하는 경량 js 라이브러리입니다. (angularJS 지원)

https://github.com/ofirdagan/cross-domain-local-storage


3
나는 그것을 보았지만 Safari에서 작동하지 않는 것 같습니다. github.com/ofirdagan/cross-domain-local-storage/issues/10
안드리 Zalitis

1

이런 종류의 솔루션은 이와 같은 많은 문제를 야기합니다. 일관성 및 SEO 고려 사항을 위해 기본 도메인에서 리디렉션하는 것이 최상의 솔루션입니다.

서버 수준에서 리디렉션 수행

Nginx를 사용하여 www를 비 www로 리디렉션하는 방법

https://www.digitalocean.com/community/tutorials/how-to-redirect-www-to-non-www-with-nginx-on-centos-7

또는 경로 53과 같은 다른 수준을 사용하는 경우


1

방법은 다음과 같습니다.

주어진 슈퍼 도메인 (예 : example.com)의 하위 도메인 간 공유를 위해 해당 상황에서 사용할 수있는 기술이 있습니다. 에 적용 할 수있는 localStorage, IndexedDB, SharedWorker, BroadcastChannel, 등, 동일 원본 페이지 간의 공유 기능을 제공하지만, 어떤 이유에 대한 수정 존중하지 않는 모두가 document.domain그들을 직접 원점으로 상위 도메인을 사용할 수 있도록 것이라고합니다.

(1) 데이터가 속할 하나의 "기본"도메인을 선택합니다. 즉, https://example.com 또는 https://www.example.com에 localStorage 데이터가 저장됩니다. https://example.com 을 선택한다고 가정 해 보겠습니다 .

(2) 선택한 도메인의 페이지에 대해 일반적으로 localStorage를 사용합니다.

(3) 모든 https://www.example.com 페이지 ( 다른 도메인)에서 javascript를 사용하여 document.domain = "example.com";. 그런 다음 숨겨진을 만들고 선택한 https://example.com 도메인 의 일부 페이지로 <iframe>이동 합니다 ( 거기에 아주 작은 자바 스크립트 스 니펫을 삽입 할 수 있는 한 어떤 페이지 는 문제가되지 않습니다 . 사이트를 다시 만들려면 특별히이 목적을 위해 빈 페이지를 만드십시오. 확장 프로그램이나 Greasemonkey 스타일의 사용자 스크립트를 작성하고 있으므로 example.com의 페이지를 제어 할 수없는 경우서버에서 찾을 수있는 가장 가벼운 페이지를 선택하고 여기에 스크립트를 삽입하십시오. 어떤 종류의 "찾을 수 없음"페이지는 아마도 괜찮을 것입니다).

(4) 숨겨진 iframe 페이지의 스크립트는 (a) set document.domain = "example.com";, (b)이 작업이 완료되면 부모 창에 알립니다. 그 후에 부모 창은 제한없이 iframe 창과 모든 개체에 액세스 할 수 있습니다! 따라서 최소 iframe 페이지는 다음과 같습니다.

<!doctype html>
<html>
<head>
  <script>
    document.domain = "example.com";
    window.parent.iframeReady();  // function defined & called on parent window
  </script>
</head>
<body></body>
</html>

userscript를 작성하는 경우는 다음과 같은 외부 액세스 기능을 추가하고 싶지 않을 수도 iframeReady()당신에게 unsafeWindow, 그래서 대신 사용자 정의 이벤트를 사용할 수 있습니다 메인 윈도우의 userscript을 통지 할 수있는 더 좋은 방법 :

    window.parent.dispatchEvent(new CustomEvent("iframeReady"));

메인 페이지의 창에 맞춤 "iframeReady"이벤트에 대한 리스너를 추가하여 감지 할 수 있습니다.

(참고 : iframe의 도메인이 이미 example.com 인 경우에도 document.domain = "example.com"을 설정해야합니다. : document.domain 에 값을 할당하면 원본 포트 가 암시 적 으로 null로 설정되며 두 포트가 iframe에 대해 일치해야합니다. . 그리고 부모가 동일 출처 고려 여기에 참고 사항을 참조 될 : https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy#Changing_origin )

(5)은 iframe이 준비가 있음을 부모 창을 알렸다 숨겨진되면, 부모 창에서 스크립트를 그냥 사용할 수 있습니다 iframe.contentWindow.localStorage, iframe.contentWindow.indexedDB, iframe.contentWindow.BroadcastChannel, iframe.contentWindow.SharedWorker대신 window.localStorage, window.indexedDB등 ...이 모든 객체에 범위가 될 선택 은 https : // example.com 출처-모든 페이지에 대해 동일한 공유 출처를 갖게됩니다!

이 기술의 가장 어색한 부분은 진행하기 전에 iframe이로드 될 때까지 기다려야한다는 것입니다. 따라서 예를 들어 DOMContentLoaded 핸들러에서 localStorage 사용을 간단하게 시작할 수는 없습니다. 또한 숨겨진 iframe이 제대로로드되지 않는지 감지하기 위해 몇 가지 오류 처리를 추가 할 수 있습니다.

분명히, 숨겨진 iframe이 페이지의 수명 동안 제거되거나 탐색되지 않는지 확인해야합니다 ... OTOH 그 결과가 무엇인지 모르겠지만 나쁜 일이 발생할 가능성이 큽니다.

그리고주의 사항 : 헤더를 사용하여 설정 / 변경 document.domain차단할 수 있습니다. Feature-Policy이 경우이 기술은 설명 된대로 사용할 수 없습니다.


그러나,에 의해 차단 될 수없는이 기술의 훨씬 더-복잡 일반화가 Feature-Policy, 그 또한 데이터를 공유, 통신, 공유 노동자에 완전히 관련이없는 도메인을 수 있습니다 (공통 상위 도메인 오프 즉뿐 아니라 하위 도메인). @Mayank Jain은 이미 답변에서 설명했습니다.

일반적인 아이디어는 위와 마찬가지로 액세스를위한 올바른 출처를 제공하기 위해 숨겨진 iframe을 만드는 것입니다. 그러나 iframe 창의 속성을 직접 가져 오는 대신 iframe 내부의 스크립트를 사용하여 모든 작업을 수행 postMessage()하고 및 addEventListener("message",...).

이것은 postMessage()다른 출처 창 사이에서도 사용할 수 있기 때문에 작동합니다 . 하지만 메인 윈도우의 코드에서 직접 localStorage, IndexedDB 등의 API를 사용하는 것보다 iframe과 메인 윈도우 사이에서 생성하는 일종의 메시징 인프라를 통해 모든 것을 전달해야하기 때문에 훨씬 더 복잡합니다.


0

이것이 내 웹 사이트에서 해결 한 방법입니다. www가없는 모든 페이지를 www.site.com으로 리디렉션했습니다. 이렇게하면 항상 www.site.com의 localstorage가 필요합니다.

루트 디렉토리 의 .htacess에 다음을 추가하십시오 (아직없는 경우 생성하십시오).

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

5
나는 이것을 반대 투표하고 싶지만 OP의 사용 사례에 도움이 될 수 있기 때문에 그렇게하지 않을 것이지만 myapp.com과 developers.myapp.com 및 support.myapp.com에서 세션을 유지하려는 사람들에게는이 대답이 있습니다. 안좋다.
Don Omondi 2010 년

안녕하세요 @DonOmondi 당신이 제안하는 것에 대한 링크로 나를 도울 수 있다면 감사하겠습니다!
Ayush Baheti

3
OP는 "하위 도메인에서 localStorage 사용"을 요청했습니다. 귀하의 대답은 "www를 www가 아닌 ​​것으로 리디렉션"하는 것입니다.하지만 일반적인 경우에 특정 하위 도메인이 "www.abc.com"인 경우에만 작동 할 수 있습니다. 더 실용적입니다.
Don Omondi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.