이름이 같은 여러 쿠키를 처리하는 방법은 무엇입니까?


92

예를 들어 "a"라는 쿠키로 설정하기 위해 다음 HTTP 헤더를 보내는 응용 프로그램이 있다고 가정 해 보겠습니다.

Set-Cookie: a=1;Path=/;Version=1
Set-Cookie: a=2;Path=/example;Version=1

/example서버에 액세스 하면 두 경로가 모두 유효하므로 "a"라는 두 개의 쿠키가 있습니다! 브라우저는 경로 정보를 보내지 않기 때문에 두 쿠키를 구별 할 수 없습니다.

Cookie: a=2; a=1

이 사건을 어떻게 처리해야합니까? 첫 번째를 선택 하시겠습니까? 모든 쿠키 값으로 목록을 만드시겠습니까? 아니면 그러한 경우가 개발자의 실수로 간주되어야합니까?


쿠키 이름이 중복되지 않도록 최선을 다하겠습니다 (할 수있는 모든 것을 읽으십시오). 대부분의 사람들은이 문제를 경험 한 적이 없습니다.

웹 사이트는 자체 쿠키 만 읽을 수 있습니다. 다른 웹 사이트 / 도메인의 쿠키를 읽을 수 없습니다. 이 보안은 브라우저에 의해 보장됩니다. 이것은 완전 초보자를위한 팁일 수 있습니다. (혼란 스러웠습니다)
Arun

답변:


38

에서 SitePoint에이 문서 :

동일한 이름의 여러 쿠키가 주어진 요청 URI와 일치하면 브라우저에서 하나를 선택합니다.

경로가 구체적 일수록 우선 순위가 높아집니다. 그러나 도메인을 포함한 다른 속성을 기반으로 한 우선 순위는 지정되지 않았으며 브라우저마다 다를 수 있습니다. 즉, ".example.org"및 "www.example.org"에 대해 동일한 이름의 쿠키를 설정 한 경우 어떤 쿠키가 다시 전송 될지 확신 할 수 없습니다.

편집 : 2010 년 의이 정보는 오래된 것으로 보입니다. 이제 브라우저가 여러 쿠키를 보낼 수 있습니다. 자세한 내용은 아래 @Nate의 답변을 참조하십시오.


9
그렇다면 여러 개의 동일한 쿠키를 어떻게 삭제할 수 있습니까? 나는 이틀 동안 이것을 망치고 중복 쿠키는 파괴되지 않는 것처럼 보입니다.
Bob Jones

13
@Brant 해당 기사는 약간 부정확 할 수 있습니다. 방금 Chrome이 동일한 이름 (그러나 다른 경로)의 쿠키 두 개를 다시 보내는 것을 보았으므로 "브라우저가 하나를 선택했습니다"가 반드시 사실은 아닙니다. 가장 깊은 경로 쿠키 인 BTW가 먼저 전송되었습니다. 그리고 또 다른 쿠키도 그 사이에 만들어졌습니다.
Jonas N

3
Firefox (15)는 동일한 이름의 쿠키 두 개를 보냅니다! 이 도메인에 대한 두 개의 쿠키가 발생하는 경우 .a.com와 호스트a.com
타하 자한 기르

실제로이 정보는 잘못되었습니다. @Nate의 대답은 올바른 것으로 표시되어야합니다.
Dan Milon 2014

5
404 : 유명한 @Nate의 답변을 찾을 수 없습니다.
d.popov

91

SitePoint에 대한 기사를 참조하는 대답은 완전히 완전하지 않습니다. RFC 6265를 참조하십시오 (공정하게 말하면 이 RFC는이 질문이 게시 된 후 2011 년에 릴리스되었으며, 이는 2000의 이전 RFC 2965 및 1997의 RFC 2109 를 대체합니다 ).

섹션 5.4 , 하위 섹션 2는 다음과 같이 말합니다.

사용자 에이전트는 다음 순서로 쿠키 목록을 정렬해야합니다.

  • 경로가 더 긴 쿠키는 경로가 더 짧은 쿠키보다 먼저 나열됩니다.

참고 : 모든 사용자 에이전트가 쿠키 목록을이 순서로 정렬하는 것은 아니지만이 순서는이 문서가 작성되었을 때의 일반적인 관행을 반영하며 역사적으로이 순서에 (잘못) 의존 한 서버가있었습니다.

섹션 4.2.2에도이 작은 보석이 있습니다 .

... 서버는 직렬화 순서에 의존해서는 안됩니다. 특히, 쿠키 헤더에 동일한 이름을 가진 두 개의 쿠키가 포함되어있는 경우 (예 : 다른 경로 또는 도메인 속성으로 설정된) 서버는 이러한 쿠키가 헤더에 나타나는 순서에 의존해서는 안됩니다.

예제 요청 쿠키 ( Cookie : a = 2; a = 1 )의 경로와 쿠키 집합주의 / 예 ( A = 2 )의 경로와 하나보다 긴 경로가 / ( A = 1 )과 너무 사양의 권장 사항과 일치하는 첫 번째 줄에 다시 전송됩니다. 따라서 첫 번째 값을 선택할 있다는 가정이 어느 정도 정확 합니다.

불행히도 RFC에서 사용되는 언어는 매우 구체적입니다. 단어의 사용은 SHOULDSHOULD이 NOT RFC에 모호성을 소개합니다. 이러한 규칙 표시 해야 따라야하지만,하지 않는 요구 사양에 준수 수 있습니다. 이에 대한 RFC를 꽤 잘 이해하고 있지만 실제 고객이 무엇을하는지 알아보기위한 조사를 수행하지는 않았습니다. HTTP 클라이언트 역할을하는 하나 이상의 브라우저 또는 기타 소프트웨어 가 Cookie : 헤더 에서 가장 긴 경로 쿠키 (예 : / example )를 먼저 보내지 않을 수 있습니다 .

쿠키 값을 제어 할 수있는 위치에 있고 솔루션을 완벽하게 만들고 싶다면 다음 중 하나를 선택하는 것이 가장 좋습니다.

  1. 다른 쿠키 이름을 사용하여 다음과 같은 특정 경로에서 재정의합니다.

    • 쿠키 설정 : a-global = 1; Path = /; Version = 1
    • 쿠키 설정 : a-example = 2; Path = / example; Version = 1
  2. 쿠키 값 자체에 필요한 경로 저장 :

    • 쿠키 설정 : a = 1 & path = /; Path = /; Version = 1
    • 쿠키 설정 : a = 2 & path = / example; Path = / example; Version = 1

이 두 가지 해결 방법 모두 사용 가능한 쿠키 목록과 요청 된 URL을 비교하여 원하는 쿠키 값을 선택하기 위해 서버에 추가 논리가 필요합니다. 너무 예쁘지 않습니다. 안타깝게도 RFC는 더 긴 경로가 더 짧은 경로의 쿠키를 완전히 재정의하도록 요구할 수있는 예지력을 가지고 있지 않았습니다 (예 : 귀하의 예에서는 Cookie : a = 2 only ).


2
이 망할 RFC에서 이것을 찾아 주셔서 감사합니다! //
아무도이

3
Wildfly 8.0은 쿠키의 순서에주의를 기울이고 첫 번째 쿠키를 사용하는 것 같습니다. 이를 통해 '중첩 된'컨텍스트에서 다른 앱을 실행할 수 있습니다. 그러나 일부 브라우저가 RFC 권장 사항을 따르지 않으면 실패합니다. JSESSIONID2와 같은 세션 쿠키의 다른 이름을 설정하는 올바른 방법입니다.
honzajde

2
귀하의 답변을 읽은 후 주요 브라우저를 테스트했습니다. 그리고 PHP (버전 7에서 테스트 됨)에서는 $ _COOKIE 변수로 설정된 첫 번째 쿠키 만 읽습니다.
Alexander Schranz

1
path=/;Path=/사양이 FRC-6265를 준수 합니까 ? 나는 그러한 언급을 찾지 못했습니다. Tomcat 은 ";"를 위협합니다. 잘못된 기호로 경로에
Hubbitus

1
@Hubbitus주의, 그것은 경로에 a=2&path=/example;Path=/example없습니다 ;.
Franklin Yu

2

같은 이름에 대해 여러 값을 갖는 것은 잘못된 것이 아닙니다. 원한다면 ... 값에 추가 컨텍스트를 포함 할 수도 있습니다.

그렇지 않은 경우 두 컨텍스트를 모두 원하는 경우 물론 다른 이름이 해결책입니다.

대안은보다 구체적인 경로에서도 동일한 경로 (및 도메인)로 동일한 쿠키 이름을 보내는 것입니다. 설정된 쿠키 지침은 해당 쿠키의 값을 덮어 씁니다.

이제 가장 중요한 부분 (작동 방식)을 알고 몇 가지 다른 방법으로 필요한 것을 달성 할 수 있으므로 질문에 대한 제 대답은 다음과 같습니다. 이것은 개발자 문제입니다.


0

여러 세션 ID를 사용하여 광범위하게이 작업을 수행하고 일관되게 작동하는 것처럼 보이는 애플리케이션을 확실히 알고 있습니다. 그러나 나는 브라우저가 쿠키가 설정된시기 / 설정된 경로 또는 앱이 각각을 일치 시키려고 시도하는지 여부에 따라 일관된 순서로 쿠키를 반환하기 때문에 알 수 없으며 알아낼 의도가 없습니다. 하나를 기존 세션에 추가합니다.

이 관행은 피하는 것이 좋습니다.

그러나 브라우저 (및 앱)가이 시나리오를 처리하는 방법을 정말로 알고 싶다면 테스트 장비를 구축하고 시도해보십시오.


2
서버는 브라우저에 의해 전송되는 내용을 제어 할 수 없습니다. 여전히 처리해야합니다.
Martin OConnor

0

Java / Scala 프레임 워크를 사용하는 경우 Play : 조심하세요! 요청에 이름이 같은 여러 쿠키가 포함 된 경우 Play는 그중 하나만 코드에 표시합니다.


-2

구분해야하는 경우 다른 키 값을 제공해야합니다.

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