답변:
현재 쿠키 사양은 RFC 6265로 , RFC 2109 및 RFC 2965 (RFC는 이제 "역사"로 표시됨) 를 대체 하고 실제 쿠키 사용 구문을 공식화합니다. 그것은 분명히 다음과 같이 말합니다 :
- 소개
...
역사적 이유로 쿠키에는 여러 가지 보안 및 개인 정보 보호 정책이 포함되어 있습니다. 예를 들어, 서버는 지정된 쿠키가 "보안"연결 용임을 나타내지 만 보안 속성은 활성 네트워크 공격자가있을 경우 무결성을 제공하지 않습니다. 마찬가지로, 웹 브라우저에서 사용하는 일반적인 "동일 출처 정책"이 다른 포트를 통해 검색된 컨텐츠를 분리하더라도 해당 호스트의 쿠키는 해당 호스트의 모든 포트에서 공유됩니다.
그리고 또한:
8.5. 약한 기밀 유지
쿠키는 포트 별 격리를 제공하지 않습니다 . 한 포트에서 실행되는 서비스가 쿠키를 읽을 수있는 경우 동일한 서버의 다른 포트에서 실행되는 서비스도 쿠키를 읽을 수 있습니다. 한 포트의 서비스에서 쿠키를 쓸 수있는 경우 동일한 서버의 다른 포트에서 실행되는 서비스가 쿠키를 쓸 수도 있습니다. 이러한 이유로 서버는 동일한 호스트의 다른 포트에서 상호 불신 서비스를 실행하고 쿠키를 사용하여 보안에 민감한 정보를 저장해서는 안됩니다.
RFC2965 3.3.1 에 따르면 (브라우저가 뒤따를 수도 있고 없을 수도 있음), 헤더 의 port
매개 변수를 통해 포트를 명시 적으로 지정하지 않으면 Set-Cookie
쿠키가 포트로 전송되거나 전송되지 않을 수 있습니다.
구글의 브라우저 보안 핸드북에 따르면 , 쿠키 범위는 기본적으로 현재 호스트 이름의 모든 URL로 제한되며 포트 또는 프로토콜 정보에는 제한되지 않습니다. 나중에 일부 라인 쿠키를 하나의 DNS 이름으로 만 제한 할 수있는 방법은 없으며 [...] 마찬가지로 특정 포트로 제한 할 수 없습니다. (또한 IE는 포트 번호를 동일 출처 정책 에 전혀 고려하지 않습니다 .)
따라서 여기에 잘 정의 된 동작에 의존하는 것이 안전하지 않은 것 같습니다.
이것은 정말 오래된 질문이지만 내가 사용한 해결 방법을 추가 할 것이라고 생각했습니다.
랩톱에서 두 가지 서비스를 실행하고 있습니다 (하나는 포트 3000과 다른 하나는 4000). ( http://localhost:3000
와 http://localhost:4000
) 사이를 이동하면 Chrome이 동일한 쿠키를 전달하며 각 서비스는 쿠키를 이해하지 못하고 새 쿠키를 생성합니다.
Chrome에 로컬 호스트 용 쿠키와 127.0.0.1 용 쿠키를 보관 한 후 http://localhost:3000
및 http://127.0.0.1:4000
에 액세스 하면 문제가 해결되었습니다.
다시 말하지만,이 시점에서 아무도 신경 쓰지 않을 수 있지만 내 상황에 쉽고 도움이되었습니다.
localhost
공유 할 수 없으며 127.0.0.1
그 반대도 마찬가지입니다. 그러나 포트에 관계없이 동일한 호스트 / 도메인의 쿠키는 공유 가능합니다.
쿠키 SOP (Same Origin Policy)에서 큰 회색 영역입니다.
이론적으로 도메인에서 포트 번호를 지정할 수 있으며 쿠키는 공유되지 않습니다. 실제로 이것은 여러 브라우저에서 작동하지 않으며 다른 문제가 발생합니다. 따라서 사이트가 일반 사용자 용이 아니며 사용할 브라우저를 제어 할 수있는 경우에만 가능합니다.
더 좋은 방법은 쿠키의 포트 번호에 의존하지 않고 동일한 IP에 대해 2 개의 도메인 이름을 얻는 것입니다.
문제점을 해결하는 다른 방법은 세션 쿠키의 이름을 포트 관련으로 만드는 것입니다. 예를 들면 다음과 같습니다.
코드는 웹 서버 구성에 액세스하여 서버가 사용하는 포트를 확인하고 그에 따라 쿠키 이름을 지정할 수 있습니다.
애플리케이션은 두 쿠키를 모두 수신하므로 포트에 해당하는 쿠키를 요청해야합니다.
쿠키 이름에 정확한 포트 번호를 지정할 필요는 없지만 더 편리합니다.
일반적으로 쿠키 이름은 사용하는 서버 인스턴스에 특정한 다른 매개 변수를 인코딩 할 수 있으므로 올바른 컨텍스트로 디코딩 할 수 있습니다.
같은 컴퓨터에서 두 개의 다른 장고 응용 프로그램을 실행하고 디버깅하려고하는 비슷한 문제가 발생했습니다.
나는이 명령으로 그들을 실행했다 :
./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
문제 해결됨 :)
127.0.0.1:8000
, 하나 localhost:8000
아마도 초 동안, 그리고 ::1:8000
(아마도 [::1]:8080
이제까지 호스트 파일을 터치하지 않고) 제합니다.
::1 app1 app2 app3 app4 app5 appN
선택 사항입니다.
쿠키는 포트에 따라 달라질 수 있도록 포트를 지정할 수 있습니다. 필요하지 않습니다. 웹 서버 / 응용 프로그램이이를 관리해야합니다.
출처 : German Wikipedia article , RFC2109 , Chapter 4.3.1
Port
는Set-Cookie
헤더에 있는 매개 변수를 제거하고 (실제로 아무도 실제로 사용하지 않았기 때문에) 동일한 호스트의 쿠키를 더 이상 포트에서 구별 할 수 없음을 매우 명확하게합니다.