중복 된 HTTP 응답 헤더가 허용됩니까?


123

중복 HTTP 응답 헤더가 표준에서 허용되는지 여부에 대한 사양을 찾지 못했지만 이것이 호환성 문제를 일으키는 지 알아야합니다.

다음과 같은 응답 헤더가 있다고 가정합니다.

HTTP/1.1 302 Moved Temporarily
Server: Apache-Coyote/1.1
X-Powered-By: Servlet 2.4; JBoss-4.0.3SP1 (build: CVSTag=JBoss_4_0_3_SP1 date=200510231054)/Tomcat-5.5
Cache-Control: no-cache
Cache-Control: no-store
Location: http://localhost:9876/foo.bar
Content-Language: en-US
Content-Length: 0
Date: Mon, 06 Dec 2010 21:18:26 GMT

Cache-Control값이 다른 두 개의 헤더가 있습니다. 브라우저는 항상 "Cache-Control : no-cache, no-store"처럼 작성된 것처럼 처리합니까?

답변:


157

여기에서 사용 가능한 HTTP RFC2616 은 다음과 같습니다.

동일한 필드 이름을 가진 여러 메시지 헤더 필드는 해당 헤더 필드의 전체 필드 값이 쉼표로 구분 된 목록 [즉, # (값)]으로 정의 된 경우에만 메시지에 존재할 수 있습니다. 메시지의 의미를 변경하지 않고 여러 헤더 필드를 하나의 "필드 이름 : 필드 값"쌍으로 결합 할 수 있어야합니다 (MUST). 각 후속 필드 값을 첫 번째 필드에 추가하고 각각 쉼표로 구분합니다. 따라서 동일한 필드 이름을 가진 헤더 필드가 수신되는 순서는 결합 된 필드 값의 해석에 중요하므로 프록시는 메시지가 전달 될 때 이러한 필드 값의 순서를 변경해서는 안됩니다.

따라서 전체 필드 값이 쉼표로 구분 된 값 목록으로 정의 된 경우 동일한 이름을 가진 여러 헤더가 괜찮습니다 (www-authenticate가 그런 경우).

Cache-control은 다음 과 같이 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9에 문서화되어 있습니다 .

Cache-Control   = "Cache-Control" ":" 1#cache-directive

#1cache-directive구문은 적어도 하나의 캐시 지시문 요소 목록을 정의합니다 (#values의 공식적인 정의는 여기를 참조하십시오 : 표기 규칙 및 일반 문법). )

그래서 네

Cache-Control: no-cache, no-store

(순서가 중요)

Cache-Control: no-cache
Cache-Control: no-store

2
빠른 응답에 감사드립니다, Simon! 그러나 RFC 2616에서 인용 된 단락이 Cache-Control에도 적용되지 않습니까? 내가 뭔가를 놓치고 있습니까?
Su Zhang

1
거의 100 % 정확합니다. 캐시 제어는 여러 값을 허용합니다 : Cache-Control = "Cache-Control" ":" 1#cache-directive. #이전에 주목하십시오 cache-directive. 이는 여러 값이 허용됨을 나타냅니다 (위의 정의에서 바로) ...
ircmaxell

1
"해당 헤더 필드에 대한 전체 필드 값이 쉼표로 구분 된 목록으로 정의 된 경우에만"-여러 값 이 쉼표로 구분 된 목록으로 정의 되어야 하는 것처럼 들립니다 . 즉, 별도의 헤더로 분할됩니다.
mpen 2014-01-23

2
@mark-여기서 "쉼표로 구분 된 목록으로 정의 됨"은 "BNF 문법에 쉼표로 구분 된 목록으로 정의 됨"을 의미합니다. Cache-control 필드는 실제로 그렇게 정의됩니다 (x # blahblah).
Simon Mourier 2014 년

2
다중 헤더 처리에 대해 설명하는 최신 RFC 7230의 섹션은 tools.ietf.org/html/rfc7230#section-3.2.2
Matthew Buckett

0

HSTS RFC6797은 쉼표로 구분 된 값으로 채워지지는 않지만 STS 헤더의 여러 인스턴스에 대한 동작을 정의하여 RFC2616 ( "if and only if"언어 위반)과 모순됩니다.

  "If a UA receives more than one STS header field in an HTTP
  response message over secure transport, then the UA MUST process
  only the first such header field."

틀 렸습니다. RFC6797은 쉼표로 구분 된 목록을 포함하는 것으로 STS 헤더를 정의하지 않습니다. 따라서 RFC 2616의 "if and only if"규칙은 동일하게 적용됩니다 (STS 헤더가 쉼표로 구분 된 목록을 취하는 것으로 정의되지 않았으므로 여러 STS 헤더가 허용되지 않음을 의미 함). RFC6797은 RFC2616이 공개 된 것처럼 보이는 규칙 위반의 결과가 무엇인지 비 결정적으로 만듭니다.
Frans
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.