[http-headers] 중복 된 HTTP 응답 헤더가 허용됩니까?

중복 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”처럼 작성된 것처럼 처리합니까?



답변

여기에서 사용 가능한 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


답변

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."


답변