다른 도메인에 쿠키를 설정하는 방법


166

이라는 웹 a.com사이트가 있고이 사이트의 특정 페이지가로드 될 때 (예 : 페이지 링크)라는 다른 사이트에 쿠키를 설정 한 b.com다음 사용자를로 리디렉션합니다 b.com.

나는로드 a.com/link할 때 쿠키를 설정하고 b.com사용자를로 리디렉션 하고 싶습니다 b.com.

나는 그것을 테스트했고 브라우저는 실제로에서 쿠키를 a.com/link받았지만 리디렉션 요청으로 쿠키를 보내지 않았습니다 b.com. 정상입니까?

다른 도메인에 쿠키를 설정할 수 있습니까?


b.com에서 URL 매개 변수를 사용하여 쿠키를 설정하면 모든 웹 사이트에서 b.com의 쿠키 값을 강제로 적용 할 수 있습니다.
Julien

2
쿠키를 설정하는 b.com의 iFrame을 사용하십시오;)
Jaquarh

답변:


129

다른 도메인에 쿠키를 설정할 수 없습니다. 이를 허용하면 엄청난 보안 결함이 발생합니다.

쿠키를 설정하려면 b.com을 가져와야합니다. a.com이 사용자를b.com/setcookie.php?c=value

setcookie 스크립트는 쿠키를 설정하고 b.com의 올바른 페이지로 리디렉션하기 위해 다음을 포함 할 수 있습니다.

<?php
    setcookie('a', $_GET['c']);
    header("Location: b.com/landingpage.php");
?>

그러나 a.com은 b.com으로 리디렉션 할 때 동일한 데이터를 헤더 형식으로 삽입 할 수 있습니까? 이것이 보안 결함을 나타내지 않는 이유는 무엇입니까?
Coder

3
@Coder, setcookie 기능을 수행하면 b.com에서 쿠키 헤더가 브라우저로 전송됩니다. a.com은 b.com에서 쿠키 헤더를 보낼 수 없습니다.
qbert220

예, 이것은 매우 안전하지 않지만 작동합니다. OP가 a.com과 b.com을 소유하고 쿠키가 사소한 경우에는 괜찮을 것입니다.
로켓은 빠르다

1
작동하지만 안전하지 않다는 대답에 더 잘 알 수 있습니다.
Roy Ling

2
어떻게 유튜브에 자신의 계정을 표시하기 위해 유튜브에 의해 생성 된 쿠키를 읽고 유튜브에 말할 수 있습니까?
타하 술탄 테 무리

55

최고 답변과 비슷하지만 페이지로 리디렉션하고 다시 리디렉션하는 대신 나쁜 사용자 경험을 유발하는 도메인 A에서 이미지를 설정할 수 있습니다.

<img src="http://www.example.com/cookie.php?val=123" style="display:none;">

그런 다음 cookie.php의 example.com 인 도메인 B에는 다음 코드가 있습니다.

<?php
    setcookie('a', $_GET['val']);
?>

Subin to Hattip


1
nice hack ... :)
sotn

16
아마도 매우 나쁜 생각 일 것입니다. 기본적으로 누구나 의도적으로 쿠키를 원하는 값으로 설정하도록 조작 된 GET 요청을 보내도록하여 의도적 인 쿠키 보호를 피하고 있습니다. 쿠키로 무엇을해야할지 모르겠지만 은행 잔고와 관련이 없기를 바랍니다.
Scott Stafford

은행 잔고가 포함되지 않았 음을 보증 할 수 있습니다. 그러나 좋은 지적 :)
Jonathan

2
이 경우 모든 사람이 고유 한 매개 변수로이 도메인을 호출 할 수있는 경우 다른 매개 변수를 추가하여 보안을 추가 할 수 있습니다. 데이터와 추가 소금으로 해시를 만들고 매개 변수로 전달하십시오. cookie.php에서 토큰을 재 작성하고 비교하여 $ _GET [ 'val']의 데이터를 확인하십시오.
Seba M

이런 식으로 GET을 보내면 AJAX도 사용할 수 있습니다.
user10398534

18

아마 당신은 Iframe이것을 위해 사용할 수 있습니다 . Facebook은 아마도이 기술을 사용합니다. 자세한 내용은 여기를 참조 하십시오 . Stackoverflow는 유사한 기술을 사용하지만 HTML5 로컬 저장소와 함께 블로그 에서 더 많은 내용을


1
iframe은 내 솔루션에 완벽하게 작동했습니다. 단순히 일반 요청과 같이 URL에 값을 포함시키고 쿠키 값으로 서버에서 응답합니다
Joel Davis

이 기능이 작동하려면 Access-Control-Allow-Origin이 올바르게 구성되어 있어야합니다.
user10398534

6

다른 도메인에 쿠키를 설정할 수 없습니다.

다른 도메인으로 데이터를 전달하려는 경우이를 URL로 인코딩 할 수 있습니다.

a.com  ->  b.com/redirect?info=some+info (and set cookie) -> b.com/other+page

4
URL에서 세션 쿠키를 설정하면 보안 위험이 있습니다. URL은 일반적으로 기록되며 공격자가 사용자 세션을 훔칠 수 있습니다
Dane Macaulay

6

적어도 직접적으로는 할 수 없습니다. 보안 상 위험 할 수 있습니다.

당신이 지정할 수 있지만 도메인의 속성을 , 사양은 "도메인 속성이 원본 서버를 포함 할 것이다 쿠키에 대한 범위를 지정하지 않는 사용자 에이전트가 쿠키를 거부합니다."라고

원본 서버는 a.com포함 b.com하고 포함하지 않으므로 설정할 수 없습니다.

b.com대신 쿠키를 설정 해야합니다 . 예를 들어 HTTP 리디렉션을 통해이 작업을 수행 할 수 b.com있습니다.


나는 이것이 오래된 반응이라는 것을 알고 있지만 이것이 왜 보안 위험이 될까요? 당신은 당신의 콘솔 또는 확장에 쿠키를 설정할 수 있습니까? 다른 도메인에 쿠키를 설정할 수 있다면 왜 중요한가요?
Timberman

@Timberman - 문제는 자바 스크립트를 웹 사이트에서 실행에 관한 되지 개발자 도구 및 하지 명시 적으로 설치 확장한다. 방문하는 사람 evil-hack.com 이 쿠키를 설정 their-favourite-website.com하여 해당 웹 사이트의 환경 설정을 변경할 수 있기 때문에 보안 위험 이 있습니다.
Quentin

이해하지만 보안 위험은 어떻습니까? 나는 현명하게 보안을 할 일이 없다고 확신합니까?
Timberman

@Timberman — 공격자의 사이트에서 완전히 다른 사이트의 환경 설정을 변경하는 데 문제가 없다면 더 명확하게 설명하는 방법을 모르겠습니다.
Quentin

문제가 있지만 보안 위험이 어떻게되는지 모르겠습니다. 자바 스크립트가 다른 도메인에 쿠키를 설정할 수 없어야하지만 동의 할 수 있다면 어떻게 보안 문제입니까?
Timberman

5

경우, 당신은 a.my-company.comb.my-company.com대신들 a.comb.com당신을 위해 쿠키를 발급 할 수 있습니다 .my-company.com도메인을 - 그것은 가능하고 도메인에 모두 전송됩니다.


1
a.my-company.com에서 b.my-company.com에 대한 쿠키를 만들 수 있습니까?
mahesh kajale

1
my-company.com이 공개 접미사 블랙홀 목록 에없는 경우 브라우저는 쿠키 설정을 시도하는 모든 시도를 자동으로 무시합니다! : '-(
Michael

5

RFC6265 참조 :

Domain 속성이 원본 서버를 포함하는 쿠키의 범위를 지정하지 않으면 사용자 에이전트는 쿠키를 거부합니다. 예를 들어, 사용자 에이전트는 도메인 속성이 "example.com"인 쿠키 또는 foo.example.com의 "foo.example.com"쿠키를 허용하지만 도메인 에이전트가 도메인 속성 인 쿠키는 허용하지 않습니다. "bar.example.com"또는 "baz.foo.example.com"

참고 : 보안상의 이유로 많은 사용자 에이전트가 "공개 접미사"에 해당하는 도메인 속성을 거부하도록 구성되어 있습니다. 예를 들어 일부 사용자 에이전트는 "com"또는 "co.uk"의 도메인 속성을 거부합니다. (자세한 내용은 5.3 절을 참조하십시오.)

그러나 이미지 / iframe 작동에 대한 위의 해결 방법은 불안정하기 때문에 권장하지 않습니다.


1

할 수는 없지만 ... 두 페이지를 모두 소유하고 있다면 ...

1) 쿼리 매개 변수를 통해 데이터를 보낼 수 있습니다 ( http://siteB.com/?key=value )

2) 사이트 A 내에 사이트 B의 iframe을 생성 할 수 있으며 한 장소에서 다른 장소로 게시물 메시지를 보낼 수 있습니다. 사이트 B는 사이트 B 쿠키의 소유자이므로 올바른 게시물 메시지를 처리하여 필요한 값을 설정할 수 있습니다. (다른 원치 않는 발신자가 자신에게 메시지를 보내지 않도록해야합니다! 사용자에게 달려 있으며,이를 방지하기 위해 사용하기로 결정한 메커니즘)


0

이 링크에는 솔루션 링크가 있습니다.

setcookie("TestCookie", "", time() - 3600, "/~rasmus/", "b.com", 1);

1
작동하지 않습니다. 사양 참조 : "도메인 속성이 원본 서버를 포함 할 쿠키의 범위를 지정하지 않으면 사용자 에이전트는 쿠키를 거부합니다."
Quentin

0

A에서 POST 요청을 보냅니다. 포스트 요청은 서버 측에만 있으며 클라이언트가 액세스 할 수 없습니다.

CURL (권장, 서버 측) 또는 숨겨진 양식 (클라이언트 측) a.comb.com사용하여 POST 요청을 보낼 수 있습니다 method="POST". 후자를 찾으면 사용자가 알고리즘을 이해하고 방해 할 수 없도록 JavaScript를 난독 처리 할 수 ​​있습니다.

b.com쿠키를 설정하기 위해 게이트웨이 를 설정하십시오.

<?php
    if (isset($_POST['data']) {
        setcookie('a', $_POST['data']);
        header("Location: b.com/landingpage");
    }
?>

보안을 한 단계 더 발전 시키려면 암호화 사이퍼를 사용하여 데이터 를 암호화 (on ) 및 암호 해독 (on ) 하는 기능을 양쪽 모두 ( a.comb.com) 에 구현하십시오 .a.comb.com

절대적으로 안전해야하는 작업을 수행하려는 경우 (예 : 로그인 세션 전송) oAuth를 시도 하거나 https://api.cloudianos.com/docs#v2/auth 에서 영감을 얻으십시오.

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