HTTP 쿠키 포트가 구체적입니까?


355

하나의 컴퓨터에서 두 개의 HTTP 서비스가 실행 중입니다. 쿠키를 공유하는지 또는 브라우저가 두 서버 소켓을 구별하는지 여부를 알고 싶습니다.

답변:


329

현재 쿠키 사양은 RFC 6265로 , RFC 2109RFC 2965 (RFC는 이제 "역사"로 표시됨) 를 대체 하고 실제 쿠키 사용 구문을 공식화합니다. 그것은 분명히 다음과 같이 말합니다 :

  1. 소개

...

역사적 이유로 쿠키에는 여러 가지 보안 및 개인 정보 보호 정책이 포함되어 있습니다. 예를 들어, 서버는 지정된 쿠키가 "보안"연결 용임을 나타내지 만 보안 속성은 활성 네트워크 공격자가있을 경우 무결성을 제공하지 않습니다. 마찬가지로, 웹 브라우저에서 사용하는 일반적인 "동일 출처 정책"이 다른 포트를 통해 검색된 컨텐츠를 분리하더라도 해당 호스트의 쿠키는 해당 호스트의 모든 포트에서 공유됩니다.

그리고 또한:

8.5. 약한 기밀 유지

쿠키는 포트 별 격리를 제공하지 않습니다 . 한 포트에서 실행되는 서비스가 쿠키를 읽을 수있는 경우 동일한 서버의 다른 포트에서 실행되는 서비스도 쿠키를 읽을 수 있습니다. 한 포트의 서비스에서 쿠키를 쓸 수있는 경우 동일한 서버의 다른 포트에서 실행되는 서비스가 쿠키를 쓸 수도 있습니다. 이러한 이유로 서버는 동일한 호스트의 다른 포트에서 상호 불신 서비스를 실행하고 쿠키를 사용하여 보안에 민감한 정보를 저장해서는 안됩니다.


129

RFC2965 3.3.1 에 따르면 (브라우저가 뒤따를 수도 있고 없을 수도 있음), 헤더 의 port매개 변수를 통해 포트를 명시 적으로 지정하지 않으면 Set-Cookie쿠키가 포트로 전송되거나 전송되지 않을 수 있습니다.

구글의 브라우저 보안 핸드북에 따르면 , 쿠키 범위는 기본적으로 현재 호스트 이름의 모든 URL로 제한되며 포트 또는 프로토콜 정보에는 제한되지 않습니다. 나중에 일부 라인 쿠키를 하나의 DNS 이름으로 만 제한 할 수있는 방법은 없으며 [...] 마찬가지로 특정 포트로 제한 할 수 없습니다. (또한 IE는 포트 번호를 동일 출처 정책 에 전혀 고려하지 않습니다 .)

따라서 여기에 잘 정의 된 동작에 의존하는 것이 안전하지 않은 것 같습니다.


75
RFC 2965를 대체하는 RFC 6265PortSet-Cookie헤더에 있는 매개 변수를 제거하고 (실제로 아무도 실제로 사용하지 않았기 때문에) 동일한 호스트의 쿠키를 더 이상 포트에서 구별 할 수 없음을 매우 명확하게합니다.
Remy Lebeau

5
도메인이있는 포트가있는 경우 IE 9는도 후속 요청에 쿠키 다시 전송하지 않습니다
axk

3
쿠키의 SOP에서 여전히 포트를 고려하고있는 브라우저가 있습니까?
Bertuz

5
도메인에 포트가 있으면 쿠키가 쿠키를 설정하지 않습니다.
Pim Heijden

76

이것은 정말 오래된 질문이지만 내가 사용한 해결 방법을 추가 할 것이라고 생각했습니다.

랩톱에서 두 가지 서비스를 실행하고 있습니다 (하나는 포트 3000과 다른 하나는 4000). ( http://localhost:3000http://localhost:4000) 사이를 이동하면 Chrome이 동일한 쿠키를 전달하며 각 서비스는 쿠키를 이해하지 못하고 새 쿠키를 생성합니다.

Chrome에 로컬 호스트 용 쿠키와 127.0.0.1 용 쿠키를 보관 한 후 http://localhost:3000http://127.0.0.1:4000에 액세스 하면 문제가 해결되었습니다.

다시 말하지만,이 시점에서 아무도 신경 쓰지 않을 수 있지만 내 상황에 쉽고 도움이되었습니다.


1
쿠키는 호스트 / 도메인 이름과 연결되어 있으므로 쿠키를 localhost공유 할 수 없으며 127.0.0.1그 반대도 마찬가지입니다. 그러나 포트에 관계없이 동일한 호스트 / 도메인의 쿠키는 공유 가능합니다.
Remy Lebeau

3
물론 그렇습니다. 나는 (그리고 아마도 백만 명의 다른 개발자들) 항상 localhost를 사용하여 테스트합니다. : 추가 된 포트는 차이가 있습니다하지 않는 한 8080 : 로컬 호스트
데이비드 Balažic

53
또한 127.0.0.1, 127.0.0.2, 127.0.0.3 등을 사용할 수 있습니다 ... 모두 localhost를 의미합니다.
David Balažic 2016 년

3
나는 질문에 대답하지 않기 때문에 이것을 표명 할 수는 없지만 좋은 팁입니다. 감사합니다!
Martin T.

2
호스트 파일 (UNIX의 / etc / hosts)을 편집하려는 경우 localhost에 대해 원하는만큼 많은 이름을 가질 수 있습니다.
Silas S. Brown

20

쿠키 SOP (Same Origin Policy)에서 큰 회색 영역입니다.

이론적으로 도메인에서 포트 번호를 지정할 수 있으며 쿠키는 공유되지 않습니다. 실제로 이것은 여러 브라우저에서 작동하지 않으며 다른 문제가 발생합니다. 따라서 사이트가 일반 사용자 용이 아니며 사용할 브라우저를 제어 할 수있는 경우에만 가능합니다.

더 좋은 방법은 쿠키의 포트 번호에 의존하지 않고 동일한 IP에 대해 2 개의 도메인 이름을 얻는 것입니다.


9
더 이상 회색 영역이 아닙니다. 현재 쿠키 표준 인 RFC 6265 는 다른 포트를 사용하여 동일한 호스트에서 쿠키를 분리하는 기능을 제거함으로써 이에 대한 혼동을 제거합니다.
Remy Lebeau

18

문제점을 해결하는 다른 방법은 세션 쿠키의 이름을 포트 관련으로 만드는 것입니다. 예를 들면 다음과 같습니다.

  • 포트 8080에서 실행중인 서버의 경우 mysession8080
  • 포트 8000에서 실행되는 서버의 경우 mysession8000

코드는 웹 서버 구성에 액세스하여 서버가 사용하는 포트를 확인하고 그에 따라 쿠키 이름을 지정할 수 있습니다.

애플리케이션은 두 쿠키를 모두 수신하므로 포트에 해당하는 쿠키를 요청해야합니다.

쿠키 이름에 정확한 포트 번호를 지정할 필요는 없지만 더 편리합니다.

일반적으로 쿠키 이름은 사용하는 서버 인스턴스에 특정한 다른 매개 변수를 인코딩 할 수 있으므로 올바른 컨텍스트로 디코딩 할 수 있습니다.


9

IE 8에서는 쿠키 (로컬 호스트에 대해서만 확인)가 포트간에 공유됩니다. FF 10에서는 그렇지 않습니다.

독자가 각 시나리오를 테스트하기위한 하나 이상의 구체적인 옵션을 갖도록이 답변을 게시했습니다.


4

같은 컴퓨터에서 두 개의 다른 장고 응용 프로그램을 실행하고 디버깅하려고하는 비슷한 문제가 발생했습니다.

나는이 명령으로 그들을 실행했다 :

./manage.py runserver 8000
./manage.py runserver 8001

첫 번째 로그인 한 다음 두 번째 로그인 할 때 항상 첫 번째 로그인을했고 그 반대도 마찬가지였습니다.

/ etc / hosts 에 이것을 추가했습니다.

127.0.0.1    app1
127.0.0.1    app2

그런 다음이 명령으로 두 개의 앱을 시작했습니다.

./manage.py runserver app1:8000
./manage.py runserver app2:8001

문제 해결됨 :)


4
당신은 아마 사용할 수 있습니다 127.0.0.1:8000, 하나 localhost:8000아마도 초 동안, 그리고 ::1:8000(아마도 [::1]:8080이제까지 호스트 파일을 터치하지 않고) 제합니다.
트래비스 왓슨

1
한 줄에 넣을 수 있습니다.::1 app1 app2 app3 app4 app5 appN
aeroson

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