인터넷 엔지니어링 태스크 포스 (IETF) R. Fielding, 편집자
의견 요청: 9110 Adobe
폐기: 2818, 7230, 7231, 7232, 7233, 7235, 7538, 7615, 7694 M. Nottingham, 편집자
STD: 97 Fastly
갱신: 3864 J. Reschke, 편집자
범주: 표준 트랙 greenbytes
ISSN: 2070-1721 2022년 6월

HTTP 의미론


초록

하이퍼텍스트 전송 프로토콜 (HTTP)은 무상태 애플리케이션 수준 프로토콜로, 분산형 협업 하이퍼텍스트 정보 시스템을 위한 것입니다. 이 문서에서 설명하는 것은 HTTP의 전체 아키텍처이며, 공통 용어를 정립하고 여러 측면을 정의하는데, 이는 모든 버전에서 공유하는 프로토콜의 측면입니다. 이 정의에는 핵심 프로토콜 요소, 확장성 메커니즘 및 "http"와 "https" 통합 자원 식별자 (URI) 스킴이 포함됩니다.

이 문서는 RFC 3864를 갱신하며 폐기하는 문서는 RFC 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694 및 7230의 일부입니다.

이 메모의 상태

이 문서는 인터넷 표준 트랙 문서입니다.

이 문서는 인터넷 엔지니어링 태스크 포스 (IETF)의 산출물입니다. 이 문서가 나타내는 것은 IETF 커뮤니티의 합의입니다. 공개 검토를 거쳤으며 승인받은 사항은 인터넷 엔지니어링 운영 그룹 (IESG)의 발행 승인입니다. 추가 정보로, 인터넷 표준에 관한 내용은 다음에서 확인하실 수 있습니다. RFC 7841의 2절.

이 문서의 현재 상태, 정오표 및 제공 방법에 관한 정보는, 이 문서에 대한 피드백 제공 방법을 포함하여 다음에서 확인하실 수 있습니다. https://www.rfc-editor.org/info/rfc9110.

Copyright Notice

Copyright (c) 2022 IETF Trust and the persons identified as the document authors. All rights reserved.

This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.

This document may contain material from IETF Documents or IETF Contributions published or made publicly available before November 10, 2008. The person(s) controlling the copyright in some of this material may not have granted the IETF Trust the right to allow modifications of such material outside the IETF Standards Process. Without obtaining an adequate license from the person(s) controlling the copyright in such materials, this document may not be modified outside the IETF Standards Process, and derivative works of it may not be created outside the IETF Standards Process, except to format it for publication as an RFC or to translate it into languages other than English.

1. 소개

1.1. 목적

하이퍼텍스트 전송 프로토콜(HTTP)은 상태 비저장 애플리케이션 수준의 요청/응답 프로토콜 계열로서, 일반적인 인터페이스와 확장 가능한 의미론 및 네트워크 기반 하이퍼텍스트와의 유연한 상호작용을 가능하게 하는 자기 기술적 메시지를 공유하여 정보 시스템을 사용할 수 있도록 합니다.

HTTP는 제공되는 리소스의 유형과 관계없이 균일한 인터페이스를 제시하여 서비스가 구현되는 방식의 세부 정보를 클라이언트에게 숨깁니다. 마찬가지로 서버는 각 클라이언트의 목적을 알 필요가 없습니다. 요청은 특정 유형의 클라이언트나 미리 정해진 순서의 애플리케이션 단계와 연관시키지 않고 독립적으로 고려할 수 있습니다. 이를 통해 범용 구현을 효과적으로 사용할 수 있는 다양한 컨텍스트가 가능해지고, 상호작용의 복잡성이 줄어들며, 독립적인 시간에 따른 발전이 가능해집니다.

HTTP는 중개 프로토콜로 사용되도록 설계되기도 했으며, 여기에서 프록시와 게이트웨이는 비 HTTP 정보 시스템을 보다 일반적인 인터페이스로 변환할 수 있습니다.

이러한 유연성의 한 가지 결과는 인터페이스 뒤에서 발생하는 일을 기준으로 프로토콜을 정의할 수 없다는 것입니다. 대신 정의할 수 있는 것은 통신의 구문, 수신된 통신의 의도 및 수신자의 예상 동작으로 제한됩니다. 통신을 독립적으로 고려한다면 성공적인 동작은 서버가 제공하는 관찰 가능한 인터페이스에 대한 대응하는 변경으로 반영되어야 합니다. 그러나 여러 클라이언트가 병렬로 동작하고 서로 상충되는 목적을 가질 수도 있으므로, 그러한 변경 사항이 단일 응답의 범위를 넘어 관찰 가능해야 한다고 요구할 수는 없습니다.

1.2. 역사와 발전

HTTP는 1990년에 도입된 이래 월드 와이드 웹의 주요 정보 전송 프로토콜로 사용되어 왔습니다. 처음에는 지연 시간이 짧은 요청을 위한 간단한 메커니즘으로 시작했으며, 주어진 경로명으로 식별되는 것으로 추정되는 하이퍼텍스트 문서의 전송을 요청하는 단일 메서드(GET)를 사용했습니다. 웹이 성장하면서 HTTP는 요청과 응답을 메시지 안에 포함하고, MIME과 유사한 미디어 유형을 사용하여 임의의 데이터 형식을 전송하고, 중개자를 통해 요청을 라우팅하도록 확장되었습니다. 이러한 프로토콜은 최종적으로 HTTP/0.9 및 HTTP/1.0으로 정의되었습니다([HTTP/1.0] 참조).

HTTP/1.1은 기존의 텍스트 기반 메시징 구문과의 호환성을 유지하면서 프로토콜의 기능을 개선하고 상호운용성, 확장성 및 인터넷 전반에서의 견고성을 향상하도록 설계되었습니다. 여기에는 고정 및 동적(청크) 콘텐츠 모두를 위한 길이 기반 데이터 구분자, 콘텐츠 협상을 위한 일관된 프레임워크, 조건부 요청을 위한 불투명 검증자, 더 나은 캐시 일관성을 위한 캐시 제어, 부분 업데이트를 위한 범위 요청 및 기본 영구 연결이 포함되었습니다. HTTP/1.1은 1995년에 도입되었고 표준 트랙으로 1997년에 [RFC2068]로 게시되었으며, 이후 1999년에 [RFC2616]로 개정되었고, 2014년에 다시 개정되었습니다([RFC7230] 부터 [RFC7235]까지).

HTTP/2([HTTP/2])는 효율적인 필드 압축 및 서버 푸시를 사용하여 동시 HTTP 메시지를 교환할 수 있도록 기존 TLS 및 TCP 프로토콜 위에 다중화된 세션 계층을 도입했습니다. HTTP/3([HTTP/3])는 TCP 대신 UDP 위의 안전한 다중화 전송인 QUIC을 사용함으로써 동시 메시지에 더 큰 독립성을 제공합니다.

HTTP의 세 가지 주요 버전은 모두 이 문서에서 정의하는 의미론에 의존합니다. 각 버전에는 사용 컨텍스트에 따라 고유한 이점과 제한이 있기 때문에 서로를 폐기하지 않았습니다. 구현은 특정 컨텍스트에 가장 적합한 전송 및 메시징 구문을 선택할 것으로 예상됩니다.

이번 HTTP 개정판에서는 의미론(이 문서) 및 캐싱의 정의를 ([CACHING]) 현재 HTTP/1.1 메시징 구문([HTTP/1.1])과 분리하여 각 주요 프로토콜 버전이 동일한 핵심 의미론을 참조하면서 독립적으로 발전할 수 있도록 합니다.

1.3. 핵심 의미론

HTTP는 리소스(3.1절)의 유형, 성격 또는 구현과 관계없이 표현(3.2절)을 조작하거나 전송하는 메시지를 보내 리소스와 상호작용하기 위한 균일한 인터페이스를 제공합니다.

각 메시지는 요청 또는 응답입니다. 클라이언트는 자신의 의도를 전달하는 요청 메시지를 구성하고 식별된 오리진 서버를 향해 해당 메시지를 라우팅합니다. 서버는 요청을 수신 대기하고, 수신한 각 메시지를 구문 분석하며, 식별된 대상 리소스와 관련하여 메시지 의미론을 해석한 다음 해당 요청에 하나 이상의 응답 메시지로 응답합니다. 클라이언트는 수신한 응답을 검사하여 자신의 의도가 수행되었는지 확인하고, 상태 코드와 수신한 콘텐츠를 기반으로 다음에 수행할 작업을 결정합니다.

HTTP 의미론에는 각 요청 메서드(9절)에서 정의하는 의도, 요청 헤더 필드에 기술될 수 있는 해당 의미론의 확장, 응답을 설명하는 상태 코드(15절) 및 기타 제어 데이터와 응답 필드에 제공될 수 있는 리소스 메타데이터가 포함됩니다.

의미론에는 수신자가 콘텐츠를 어떻게 해석하도록 의도되었는지를 설명하는 표현 메타데이터, 콘텐츠 선택에 영향을 줄 수 있는 요청 헤더 필드 및 통칭하여 콘텐츠 협상이라고 하는 다양한 선택 알고리즘도 포함됩니다(12절).

1.4. 이 문서로 폐기된 사양

표 1
제목 참조 참조 위치
TLS를 통한 HTTP [RFC2818] B.1
HTTP/1.1 메시지 구문 및 라우팅 [*] [RFC7230] B.2
HTTP/1.1 의미론 및 콘텐츠 [RFC7231] B.3
HTTP/1.1 조건부 요청 [RFC7232] B.4
HTTP/1.1 범위 요청 [RFC7233] B.5
HTTP/1.1 인증 [RFC7235] B.6
HTTP 상태 코드 308(영구 리디렉션) [RFC7538] B.7
HTTP Authentication-Info 및 Proxy-Authentication-Info 응답 헤더 필드 [RFC7615] B.8
HTTP 클라이언트 시작 Content-Encoding [RFC7694] B.9

[*] 이 문서는 RFC 7230 중 HTTP/1.1 메시징 구문 및 연결 관리와 독립적인 부분만 폐기하며, RFC 7230의 나머지 부분은 "HTTP/1.1" [HTTP/1.1]에 의해 폐기됩니다.

2. 적합성

2.1. 구문 표기법

이 사양은 [RFC5234]의 확장 배커스-나우르 형식(ABNF) 표기법을 사용하며, [RFC7405]에 정의된 문자열의 대소문자 구분 표기법으로 확장합니다.

또한 5.6.1절에 정의된 목록 확장을 사용하며, 이를 통해 "#" 연산자를 사용하여 쉼표로 구분된 목록을 간결하게 정의할 수 있습니다("*" 연산자가 반복을 나타내는 방식과 유사합니다). 부록 A에서는 모든 목록 연산자를 표준 ABNF 표기법으로 확장한 전체 문법을 보여 줍니다.

관례상 "obs-" 접두사가 붙은 ABNF 규칙 이름은 역사적인 이유로 존재하는 폐기된 문법 규칙을 나타냅니다.

다음 핵심 규칙은 부록 B.1에 정의된 대로 [RFC5234]를 참조하여 포함됩니다. ALPHA (문자), CR (캐리지 리턴), CRLF (CR LF), CTL (제어 문자), DIGIT (10진수 0-9), DQUOTE (큰따옴표), HEXDIG (16진수 0-9/A-F/a-f), HTAB (수평 탭), LF (줄 바꿈), OCTET (임의의 8비트 데이터 시퀀스), SP (공백), VCHAR (임의의 가시 US-ASCII 문자).

5.6절에서는 필드 값을 위한 몇 가지 일반적인 구문 구성요소를 정의합니다.

이 사양에서는 "문자", "문자 인코딩 체계", "문자 집합", 및 "프로토콜 요소"라는 용어를 [RFC6365]에 정의된 의미로 사용합니다.

2.2. 요구사항 표기법

이 문서에서 핵심어 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", 및 "OPTIONAL"은 여기에서와 같이 모두 대문자로 표시된 경우에만 BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석해야 합니다.

이 사양은 HTTP 통신 참여자의 역할에 따라 적합성 기준을 대상으로 합니다. 따라서 요구사항은 송신자, 수신자, 클라이언트, 서버, 사용자 에이전트, 중개자, 오리진 서버, 프록시, 게이트웨이 또는 캐시에 해당 요구사항으로 제한되는 동작에 따라 적용됩니다. 추가 요구사항은 단일 통신의 범위를 넘어 적용되는 경우 구현, 리소스 소유자 및 프로토콜 요소 등록에 적용됩니다.

요구사항이 수신한 요소를 다운스트림으로 전달하는 구현이 아니라 프로토콜 요소를 생성하는 구현에만 적용되는 경우 "send" 대신 "generate"라는 동사를 사용합니다.

구현이 HTTP에서 수행하는 역할과 관련된 모든 요구사항을 준수하면 적합한 것으로 간주됩니다.

송신자는 해당 ABNF 규칙에 정의된 문법과 일치하지 않는 프로토콜 요소를 MUST NOT 생성해야 합니다. 주어진 메시지 내에서 송신자는 다른 역할의 참여자만 생성할 수 있는 프로토콜 요소나 구문 대안을 MUST NOT 생성해야 합니다(즉, 해당 메시지에서 송신자가 갖지 않는 역할).

HTTP 적합성에는 사용 중인 프로토콜 버전의 특정 메시징 구문에 대한 적합성과 전송된 프로토콜 요소의 의미론에 대한 적합성이 모두 포함됩니다. 예를 들어, HTTP/1.1에 적합하다고 주장하지만 HTTP/1.1 수신자에게 요구되는 기능을 인식하지 못하는 클라이언트는 그러한 주장에 따라 응답을 조정하는 서버와 상호운용할 수 없습니다. 콘텐츠 협상 및 사용자가 선택한 확장과 같이 사용자 선택을 반영하는 기능은 프로토콜 스트림을 넘어 애플리케이션 동작에 영향을 줄 수 있습니다. 사용자의 선택을 부정확하게 반영하는 프로토콜 요소를 전송하면 사용자를 혼란스럽게 하고 선택을 방해합니다.

구현이 의미론적 적합성을 충족하지 못하면 해당 구현의 메시지 수신자는 결국 그에 따라 동작을 조정하기 위한 우회 방법을 개발하게 됩니다. 수신자는 그러한 우회 방법이 문제가 있는 구현에만 제한되는 경우 이 프로토콜에 계속 적합하면서 해당 우회 방법을 MAY 사용할 수 있습니다. 예를 들어, 서버는 알려진 버그나 잘못 선택된 기본값에 맞게 자체 동작을 조정하기 위해 종종 User-Agent 필드 값의 일부를 검사하고, 사용자 에이전트는 종종 Server 필드 값을 검사합니다.

2.3. 길이 요구사항

수신자는 수신된 프로토콜 요소가 ABNF 문법에 적합하고 합리적인 버퍼 크기 내에 들어갈 것이라는 기대를 최소한으로 두고 방어적으로 구문 분석하는 것이 SHOULD 요구됩니다.

HTTP는 적절할 수 있는 길이가 배포 컨텍스트와 구현 목적에 따라 크게 달라지므로 많은 프로토콜 요소에 특정 길이 제한을 두지 않습니다. 따라서 송신자와 수신자 간의 상호운용성은 각 프로토콜 요소에 대해 합리적인 길이가 무엇인지에 관한 공통된 기대에 의존합니다. 또한 일부 프로토콜 요소에 대해 일반적으로 합리적인 길이라고 여겨지는 값은 지난 30년간의 HTTP 사용 과정에서 변화했으며 앞으로도 계속 변화할 것으로 예상됩니다.

최소한 수신자는 다른 메시지에서 동일한 프로토콜 요소에 대해 자신이 생성하는 값만큼 긴 프로토콜 요소 길이를 구문 분석하고 처리할 수 MUST 있어야 합니다. 예를 들어, 자체 리소스에 대한 매우 긴 URI 참조를 게시하는 오리진 서버는 그러한 참조가 대상 URI로 수신될 때 동일하게 구문 분석하고 처리할 수 있어야 합니다.

수신된 많은 프로토콜 요소는 해당 요소를 식별하고 다운스트림으로 전달하는 데 필요한 정도까지만 구문 분석됩니다. 예를 들어, 중개자는 수신된 필드를 필드 이름과 필드 값 구성요소로 구문 분석한 다음 필드 값 내부를 추가로 구문 분석하지 않고 필드를 전달할 수 있습니다.

2.4. 오류 처리

수신자는 송신자가 해당 의미론이 암시하는 내용을 잘못 구현한다고 수신자가 경험이나 구성을 통해 판단한 경우를 제외하고, 이 사양의 확장을 포함하여 이 사양에서 해당 요소에 대해 정의한 의미론에 따라 수신된 프로토콜 요소를 MUST 해석해야 합니다. 예를 들어, 특정 콘텐츠 코딩을 수신하면 실패하는 것으로 알려진 특정 구현 버전을 User-Agent 헤더 필드를 검사하여 확인한 경우 오리진 서버는 수신된 Accept-Encoding 헤더 필드의 내용을 무시할 수 있습니다.

달리 명시되지 않는 한 수신자는 잘못된 구성에서 사용 가능한 프로토콜 요소를 복구하려고 MAY 시도할 수 있습니다. HTTP는 서로 다른 프로토콜의 응용이 서로 다른 오류 처리 전략을 요구하므로 보안에 직접적인 영향을 미치는 경우를 제외하고 특정 오류 처리 메커니즘을 정의하지 않습니다. 예를 들어, 웹 브라우저는 Location 헤더 필드가 ABNF에 따라 구문 분석되지 않는 응답에서 투명하게 복구하려 할 수 있지만, 시스템 제어 클라이언트는 모든 형태의 오류 복구를 위험하다고 간주할 수 있습니다.

일부 요청은 기본 연결 실패가 발생할 경우 9.2.2절에 설명된 대로 클라이언트가 자동으로 다시 시도할 수 있습니다.

2.5. 프로토콜 버전

HTTP의 버전 번호는 "."(마침표 또는 소수점)으로 구분된 두 개의 십진 숫자로 구성됩니다. 첫 번째 숫자(주 버전)는 메시징 구문을 나타내고, 두 번째 숫자(부 버전)는 송신자가 적합한(향후 통신을 위해 이해할 수 있는) 해당 주 버전 내의 가장 높은 부 버전을 나타냅니다.

HTTP의 핵심 의미론은 프로토콜 버전 간에 변경되지 않지만 "전송 중" 표현은 변경될 수 있으므로, 전송 형식에 호환되지 않는 변경이 이루어지면 HTTP 버전 번호가 변경됩니다. 또한 HTTP는 정의된 확장 지점(16절)을 사용하여 버전을 변경하지 않고 프로토콜에 점진적이고 하위 호환되는 변경을 적용할 수 있습니다.

프로토콜 버전 전체는 해당 버전의 대응 사양에 명시된 요구사항 집합에 대한 송신자의 적합성을 나타냅니다. 예를 들어, "HTTP/1.1" 버전은 이 문서, "HTTP 캐싱" [CACHING] 및 "HTTP/1.1" [HTTP/1.1]의 결합된 사양으로 정의됩니다.

호환되지 않는 메시지 구문이 도입되면 HTTP의 주 버전 번호가 증가합니다. 프로토콜에 대한 변경으로 메시지 의미론이 추가되거나 송신자의 추가 기능이 암시되는 경우 부 버전 번호가 증가합니다.

부 버전은 송신자가 프로토콜의 하위 호환되는 하위 집합만 사용하고 있는 경우에도 송신자의 통신 기능을 알림으로써 수신자가 응답(서버의 경우)이나 향후 요청(클라이언트의 경우)에서 더 고급 기능을 사용할 수 있음을 알 수 있게 합니다.

HTTP의 주 버전이 부 버전을 정의하지 않는 경우 부 버전 "0"이 암시됩니다. "0"은 부 버전 식별자가 필요한 요소 내에서 해당 프로토콜을 참조할 때 사용됩니다.

3. 용어 및 핵심 개념

HTTP는 월드 와이드 웹(WWW) 아키텍처를 위해 만들어졌으며 시간이 지나면서 전 세계 하이퍼텍스트 시스템의 확장성 요구를 지원하도록 발전해 왔습니다. 해당 아키텍처의 상당 부분은 HTTP를 정의하는 데 사용되는 용어에 반영되어 있습니다.

3.1. 리소스

HTTP 요청의 대상을 리소스라고 합니다. HTTP는 리소스의 성격을 제한하지 않으며, 단지 리소스와 상호작용하는 데 사용할 수 있는 인터페이스를 정의합니다. 대부분의 리소스는 4절에 설명된 대로 URI(Uniform Resource Identifier)로 식별됩니다.

HTTP의 설계 목표 중 하나는 리소스 식별을 요청 의미론과 분리하는 것이며, 이는 요청 메서드(9절)와 몇 가지 요청 수정 헤더 필드에 요청 의미론을 부여함으로써 가능합니다. 리소스는 요청 메서드의 의미론과 일치하지 않는 방식으로 요청을 처리할 수 없습니다. 예를 들어 리소스의 URI가 안전하지 않은 의미론을 암시하더라도, 클라이언트는 안전한 메서드로 요청을 처리할 때 리소스가 안전하지 않은 동작을 피할 것으로 기대할 수 있습니다(9.2.1절 참조).

HTTP는 대상 리소스(7.1절)와 리소스 간의 관계를 나타내기 위해 URI(Uniform Resource Identifier) 표준 [URI]에 의존합니다.

3.2. 표현

표현은 주어진 리소스의 과거, 현재 또는 원하는 상태를 프로토콜을 통해 쉽게 전달할 수 있는 형식으로 반영하도록 의도된 정보입니다. 표현은 표현 메타데이터 집합과 잠재적으로 제한되지 않은 표현 데이터 스트림(8절)으로 구성됩니다.

HTTP는 리소스 자체를 전송하는 대신 전송 가능한 리소스 상태의 표현을 기준으로 통신을 정의하여 균일한 인터페이스 뒤에서 "정보 은닉"을 허용합니다. 이를 통해 URI로 식별되는 리소스는 "라구나 비치의 현재 날씨"와 같은 시간 함수 등을 포함한 무엇이든 될 수 있으며, 메시지가 생성되는 시점에 해당 리소스를 나타내는 정보를 제공할 수 있습니다 [REST].

균일한 인터페이스는 반대편의 독립적인 행위자에게 메시지를 전달하는 것을 통해서만 어떤 대상을 관찰하고 조작할 수 있는 창과 비슷합니다. 통신에서 해당 대상의 현재 또는 원하는 상태를 표현("대신함")하려면 공유된 추상화가 필요합니다. 표현이 하이퍼텍스트인 경우, 리소스 상태의 표현과 수신자의 향후 상호작용을 안내하는 데 도움이 되는 처리 지침을 모두 제공할 수 있습니다.

대상 리소스에는 각각 리소스의 현재 상태를 반영하도록 의도된 여러 표현이 제공되거나 이를 생성할 수 있습니다. 일반적으로 콘텐츠 협상(12절)에 기반한 알고리즘을 사용하여 이러한 표현 중 하나를 주어진 요청에 가장 적합한 것으로 선택합니다. 이 선택된 표현은 조건부 요청(13절)을 평가하고 GET(9.3.1절)에 대한 200 (OK), 206 (부분 콘텐츠) 및 304 (수정되지 않음) 응답의 콘텐츠를 구성하기 위한 데이터와 메타데이터를 제공합니다.

3.3. 연결, 클라이언트 및 서버

HTTP는 신뢰할 수 있는 전송 계층 또는 세션 계층 연결을 통해 작동하는 클라이언트/서버 프로토콜입니다.

HTTP 클라이언트는 하나 이상의 HTTP 요청을 전송하기 위해 서버에 연결을 설정하는 프로그램입니다. HTTP 서버는 HTTP 응답을 전송하여 HTTP 요청을 처리하기 위해 연결을 수락하는 프로그램입니다.

클라이언트와 서버라는 용어는 이러한 프로그램이 특정 연결에서 수행하는 역할만을 가리킵니다. 동일한 프로그램이 일부 연결에서는 클라이언트로, 다른 연결에서는 서버로 작동할 수 있습니다.

HTTP는 상태 비저장 프로토콜로 정의되며, 이는 각 요청 메시지의 의미론을 독립적으로 이해할 수 있고 연결과 그 위의 메시지 사이의 관계가 해당 메시지의 해석에 영향을 주지 않음을 의미합니다. 예를 들어, CONNECT 요청(9.3.6절)이나 Upgrade 헤더 필드가 있는 요청(7.8절)은 연결의 첫 번째 메시지뿐 아니라 언제든지 발생할 수 있습니다. 많은 구현은 프록시된 연결을 재사용하거나 여러 서버에 요청을 동적으로 부하 분산하기 위해 HTTP의 상태 비저장 설계에 의존합니다.

따라서 서버는 연결이 안전하게 보호되고 해당 에이전트 전용인 경우를 제외하고 동일한 연결상의 두 요청이 동일한 사용자 에이전트에서 온 것이라고 MUST NOT 가정해야 합니다. 일부 비표준 HTTP 확장(예: [RFC4559])은 이 요구사항을 위반하는 것으로 알려져 있으며, 그 결과 보안 및 상호운용성 문제가 발생합니다.

3.4. 메시지

HTTP는 연결을 통해 메시지를 교환하기 위한 상태 비저장 요청/응답 프로토콜입니다. 송신자와 수신자라는 용어는 각각 주어진 메시지를 전송하거나 수신하는 모든 구현을 가리킵니다.

클라이언트는 메서드(9절)와 요청 대상(7.1절)을 포함하는 요청 메시지 형태로 서버에 요청을 전송합니다. 요청에는 요청 수정자, 클라이언트 정보 및 표현 메타데이터를 위한 헤더 필드(6.3절), 메서드에 따라 처리하도록 의도된 콘텐츠(6.4절) 및 콘텐츠를 전송하는 동안 수집된 정보를 전달하기 위한 트레일러 필드 (6.5절)도 포함될 수 있습니다.

서버는 하나 이상의 응답 메시지를 전송하여 클라이언트의 요청에 응답하며, 각 메시지에는 상태 코드(15절)가 포함됩니다. 응답에는 서버 정보, 리소스 메타데이터 및 표현 메타데이터를 위한 헤더 필드, 상태 코드에 따라 해석할 콘텐츠 및 콘텐츠를 전송하는 동안 수집된 정보를 전달하기 위한 트레일러 필드도 포함될 수 있습니다.

3.5. 사용자 에이전트

사용자 에이전트라는 용어는 요청을 시작하는 다양한 클라이언트 프로그램을 가리킵니다.

가장 익숙한 사용자 에이전트 형태는 범용 웹 브라우저이지만, 이는 구현의 작은 일부에 불과합니다. 기타 일반적인 사용자 에이전트에는 스파이더 (웹을 탐색하는 로봇), 명령줄 도구, 전광판 화면, 가전제품, 저울, 전구, 펌웨어 업데이트 스크립트, 모바일 앱 및 다양한 형태와 크기의 통신 장치가 포함됩니다.

사용자 에이전트라고 해서 요청 시점에 사람이 소프트웨어 에이전트와 직접 상호작용하고 있음을 의미하지는 않습니다. 많은 경우 사용자 에이전트는 백그라운드에서 실행되고 나중에 검사할 수 있도록 결과를 저장하도록 설치되거나 구성됩니다(또는 흥미롭거나 오류가 있을 수 있는 결과의 일부만 저장합니다). 예를 들어 스파이더에는 일반적으로 시작 URI가 주어지고 하이퍼텍스트 그래프로 웹을 크롤링하면서 특정 동작을 따르도록 구성됩니다.

많은 사용자 에이전트는 사용자에게 대화형 제안을 하거나 보안 또는 개인정보 보호 문제에 대해 충분한 경고를 제공할 수 없거나 그렇게 하지 않도록 선택합니다. 이 사양에서 사용자에게 오류를 보고하도록 요구하는 몇 안 되는 경우에는 그러한 보고가 오류 콘솔이나 로그 파일에서만 관찰 가능해도 허용됩니다. 마찬가지로, 자동화된 작업을 진행하기 전에 사용자가 확인하도록 하는 요구사항은 사전 구성 선택, 런타임 옵션 또는 안전하지 않은 작업을 단순히 피하는 방식으로 충족할 수 있습니다. 사용자가 이미 해당 선택을 했다면 확인은 특정 사용자 인터페이스나 정상적인 처리의 중단을 의미하지 않습니다.

3.6. 오리진 서버

오리진 서버라는 용어는 주어진 대상 리소스에 대해 권위 있는 응답을 생성할 수 있는 프로그램을 가리킵니다.

가장 익숙한 형태의 오리진 서버는 대규모 공개 웹사이트입니다. 그러나 사용자 에이전트를 브라우저와 동일시하는 것처럼 모든 오리진 서버가 비슷하다고 생각하기 쉽습니다. 일반적인 오리진 서버에는 홈 자동화 장치, 구성 가능한 네트워크 구성요소, 사무기기, 자율 로봇, 뉴스 피드, 교통 카메라, 실시간 광고 선택기 및 주문형 비디오 플랫폼도 포함됩니다.

대부분의 HTTP 통신은 URI로 식별된 리소스의 표현에 대한 검색 요청(GET)으로 구성됩니다. 가장 간단한 경우에는 사용자 에이전트(UA)와 오리진 서버(O) 사이의 단일 양방향 연결(===)을 통해 이루어질 수 있습니다.

         요청   >
    UA ======================================= O
                                 <   응답

3.7. 중개자

HTTP는 일련의 연결을 통해 요청을 충족하기 위해 중개자를 사용할 수 있게 합니다. 일반적인 HTTP 중개자에는 프록시, 게이트웨이 및 터널의 세 가지 형태가 있습니다. 경우에 따라 하나의 중개자가 각 요청의 성격에 따라 동작을 전환하면서 오리진 서버, 프록시, 게이트웨이 또는 터널로 작동할 수 있습니다.

         >             >             >             >
    UA =========== A =========== B =========== C =========== O
               <             <             <             <

위 그림은 사용자 에이전트와 오리진 서버 사이에 세 개의 중개자(A, B, C)가 있음을 보여 줍니다. 전체 체인을 통과하는 요청 또는 응답 메시지는 네 개의 개별 연결을 통과합니다. 일부 HTTP 통신 옵션은 가장 가까운 비터널 이웃과의 연결에만, 체인의 끝점에만 또는 체인을 따라 있는 모든 연결에 적용될 수 있습니다. 그림은 선형이지만 각 참여자는 여러 통신을 동시에 수행할 수 있습니다. 예를 들어 B는 A 이외의 많은 클라이언트로부터 요청을 수신하거나, A의 요청을 처리하는 동시에 C 이외의 서버로 요청을 전달할 수 있습니다. 마찬가지로 이후 요청은 종종 부하 분산을 위한 동적 구성에 따라 다른 연결 경로를 통해 전송될 수 있습니다.

업스트림과 다운스트림이라는 용어는 메시지 흐름과 관련된 방향 요구사항을 설명하는 데 사용됩니다. 모든 메시지는 업스트림에서 다운스트림으로 흐릅니다. 인바운드와 아웃바운드라는 용어는 요청 경로와 관련된 방향 요구사항을 설명하는 데 사용됩니다. 인바운드는 "오리진 서버를 향함"을 의미하고, 아웃바운드는 "사용자 에이전트를 향함"을 의미합니다.

프록시는 일반적으로 로컬 구성 규칙을 통해 클라이언트가 선택하며, 일부 유형의 절대 URI에 대한 요청을 수신하고 HTTP 인터페이스를 통한 변환으로 해당 요청을 충족하려 시도하는 메시지 전달 에이전트입니다. "http" URI에 대한 프록시 요청과 같이 일부 변환은 최소한이지만, 다른 요청은 완전히 다른 애플리케이션 수준 프로토콜과의 변환을 요구할 수 있습니다. 프록시는 조직의 HTTP 요청을 보안 서비스, 주석 서비스 또는 공유 캐싱을 위해 공통 중개자를 통해 그룹화하는 데 자주 사용됩니다. 일부 프록시는 전달 중 선택된 메시지 또는 콘텐츠에 변환을 적용하도록 설계되며, 이는 7.7절에 설명되어 있습니다.

게이트웨이(일명 리버스 프록시)는 아웃바운드 연결에서는 오리진 서버 역할을 하지만 수신한 요청을 변환하여 다른 서버 또는 서버들로 인바운드 전달하는 중개자입니다. 게이트웨이는 레거시 또는 신뢰할 수 없는 정보 서비스를 캡슐화하고, 가속기 캐싱을 통해 서버 성능을 향상하며, 여러 시스템에 걸친 HTTP 서비스의 분할 또는 부하 분산을 가능하게 하는 데 자주 사용됩니다.

오리진 서버에 적용되는 모든 HTTP 요구사항은 게이트웨이의 아웃바운드 통신에도 적용됩니다. 게이트웨이는 이 사양의 범위를 벗어나는 HTTP의 비공개 확장을 포함하여 원하는 프로토콜을 사용해 인바운드 서버와 통신합니다. 그러나 타사 HTTP 서버와 상호운용하려는 HTTP-to-HTTP 게이트웨이는 게이트웨이의 인바운드 연결에 대한 사용자 에이전트 요구사항을 준수해야 합니다.

터널은 메시지를 변경하지 않고 두 연결 사이에서 블라인드 릴레이 역할을 합니다. 활성화된 후에는 터널이 HTTP 통신의 당사자로 간주되지 않지만, HTTP 요청에 의해 시작되었을 수 있습니다. 릴레이되는 연결의 양쪽 끝이 닫히면 터널은 더 이상 존재하지 않습니다. 터널은 전송 계층 보안(TLS, [TLS13])을 사용하여 공유 방화벽 프록시를 통한 기밀 통신을 설정하는 경우처럼 중개자를 통해 가상 연결을 확장하는 데 사용됩니다.

위의 중개자 범주는 HTTP 통신에 참여자로서 작동하는 경우만 고려합니다. 메시지 송신자의 인지나 허가 없이 HTTP 트래픽을 필터링하거나 리디렉션하면서 네트워크 프로토콜 스택의 하위 계층에서 작동할 수 있는 중개자도 있습니다. 네트워크 중개자는 프로토콜 수준에서 경로상 공격자와 구별할 수 없으며, HTTP 의미론을 잘못 위반하여 보안 결함이나 상호운용성 문제를 일으키는 경우가 많습니다.

예를 들어, 가로채기 프록시 [RFC3040](일반적으로 투명 프록시 [RFC1919]라고도 함)는 클라이언트가 선택하지 않는다는 점에서 HTTP 프록시와 다릅니다. 대신 가로채기 프록시는 나가는 TCP 포트 80 패킷(때로는 다른 일반적인 포트 트래픽도)을 필터링하거나 리디렉션합니다. 가로채기 프록시는 공용 네트워크 액세스 지점에서 흔히 볼 수 있으며, 비로컬 인터넷 서비스 사용을 허용하기 전에 계정 구독을 강제하는 수단이나 기업 방화벽 내에서 네트워크 사용 정책을 강제하는 데 사용됩니다.

3.8. 캐시

캐시는 이전 응답 메시지의 로컬 저장소와 메시지 저장, 검색 및 삭제를 제어하는 하위 시스템입니다. 캐시는 향후의 동등한 요청에서 응답 시간과 네트워크 대역폭 소비를 줄이기 위해 캐시 가능한 응답을 저장합니다. 모든 클라이언트 또는 서버는 캐시를 MAY 사용할 수 있지만, 터널로 작동하는 동안에는 캐시를 사용할 수 없습니다.

캐시의 효과는 체인을 따라 있는 참여자 중 하나가 해당 요청에 적용 가능한 캐시된 응답을 가지고 있는 경우 요청/응답 체인이 단축된다는 것입니다. 다음은 UA 또는 A에 의해 캐시되지 않은 요청에 대해 B가 O에서(C를 통해) 받은 이전 응답의 캐시된 사본을 가지고 있는 경우의 결과 체인을 보여 줍니다.

            >             >
        UA =========== A =========== B - - - - - - C - - - - - - O
                   <             <

캐시가 후속 요청에 응답할 때 사용할 수 있도록 응답 메시지의 사본을 저장할 수 있으면 응답은 캐시 가능합니다. 응답이 캐시 가능한 경우에도 해당 캐시된 응답을 특정 요청에 사용할 수 있는 시점에 대해 클라이언트 또는 오리진 서버가 추가 제약을 둘 수 있습니다. 캐시 동작과 캐시 가능한 응답에 대한 HTTP 요구사항은 [CACHING]에 정의되어 있습니다.

월드 와이드 웹 전반과 대규모 조직 내부에는 매우 다양한 캐시 아키텍처와 구성이 배포되어 있습니다. 여기에는 대역폭을 절약하고 지연 시간을 줄이기 위한 프록시 캐시의 국가적 계층 구조, 인기 사이트의 지역 및 전 세계 배포를 최적화하기 위해 게이트웨이 캐싱을 사용하는 콘텐츠 전송 네트워크, 캐시 항목을 브로드캐스트하거나 멀티캐스트하는 협업 시스템, 오프라인 또는 지연 시간이 긴 환경에서 사용할 수 있도록 미리 가져온 캐시 항목의 아카이브 등이 포함됩니다.

3.9. 메시지 교환 예

다음 예는 URI "http://www.example.com/hello.txt"에 대한 GET 요청(9.3.1절)의 일반적인 HTTP/1.1 메시지 교환을 보여 줍니다.

클라이언트 요청:

GET /hello.txt HTTP/1.1
User-Agent: curl/7.64.1
Host: www.example.com
Accept-Language: en, mi

서버 응답:

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain

Hello World! My content includes a trailing CRLF.

4. HTTP의 식별자

URI(Uniform Resource Identifier) [URI]는 HTTP 전반에서 리소스를 식별하는 수단으로 사용됩니다(3.1절).

4.1. URI 참조

URI 참조는 요청의 대상을 지정하고, 리디렉션을 나타내며, 관계를 정의하는 데 사용됩니다.

"URI-reference", "absolute-URI", "relative-part", "authority", "port", "host", "path-abempty", "segment" 및 "query"의 정의는 URI 일반 구문에서 채택됩니다. 비어 있지 않은 경로 구성요소를 포함할 수 있는 프로토콜 요소를 위해 "absolute-path" 규칙이 정의됩니다. (이 규칙은 빈 경로를 허용하는 RFC 3986의 path-abempty 규칙 및 "//"로 시작하는 경로를 허용하지 않는 path-absolute 규칙과 약간 다릅니다.) 프래그먼트 구성요소는 포함할 수 없지만 상대 URI를 포함할 수 있는 프로토콜 요소를 위해 "partial-URI" 규칙이 정의됩니다.

  URI-reference = <URI-reference, see [URI], Section 4.1>
  absolute-URI  = <absolute-URI, see [URI], Section 4.3>
  relative-part = <relative-part, see [URI], Section 4.2>
  authority     = <authority, see [URI], Section 3.2>
  uri-host      = <host, see [URI], Section 3.2.2>
  port          = <port, see [URI], Section 3.2.3>
  path-abempty  = <path-abempty, see [URI], Section 3.3>
  segment       = <segment, see [URI], Section 3.3>
  query         = <query, see [URI], Section 3.4>

  absolute-path = 1*( "/" segment )
  partial-URI   = relative-part [ "?" query ]

URI 참조를 허용하는 HTTP의 각 프로토콜 요소는 ABNF 생성식에서 해당 요소가 모든 형태의 참조(URI-reference)를 허용하는지, 절대 형식의 URI(absolute-URI)만 허용하는지, 경로와 선택적 쿼리 구성요소 (partial-URI)만 허용하는지 또는 위 항목의 조합을 허용하는지를 나타냅니다. 달리 명시되지 않는 한 URI 참조는 대상 URI(7.1절)를 기준으로 구문 분석됩니다.

모든 송신자와 수신자가 프로토콜 요소에서 최소한 8000옥텟 길이의 URI를 지원하는 것이 RECOMMENDED됩니다. 이는 일부 구조와 전송 표현(예: HTTP/1.1의 요청 라인)이 경우에 따라 필연적으로 더 커진다는 것을 의미합니다.

4.2. HTTP 관련 URI 스킴

IANA는 [BCP35]의 URI 스킴 레지스트리를 https://www.iana.org/assignments/uri-schemes/에서 관리합니다. 요청은 모든 URI 스킴을 대상으로 할 수 있지만, 다음 스킴은 HTTP 서버에 고유합니다.

표 2
URI 스킴 설명 절
http 하이퍼텍스트 전송 프로토콜 4.2.1
https 보안 하이퍼텍스트 전송 프로토콜 4.2.2

"http" 또는 "https" URI가 있다고 해서 식별된 오리진에 항상 연결을 수신 대기하는 HTTP 서버가 있다는 의미는 아닙니다. 서버의 존재 여부나 해당 서버가 현재 그 식별자를 리소스에 매핑하는지 여부와 관계없이 누구나 URI를 만들 수 있습니다. 등록된 이름과 IP 주소의 위임된 특성은 HTTP 서버의 존재 여부와 관계없이 연합 네임스페이스를 만듭니다.

4.2.1. http URI 스킴

"http" URI 스킴은 주어진 포트에서 TCP ([TCP]) 연결을 수신 대기하는 잠재적인 HTTP 오리진 서버가 관리하는 계층적 네임스페이스 내에서 식별자를 생성하기 위해 정의됩니다.

  http-URI = "http" "://" authority path-abempty [ "?" query ]

"http" URI의 오리진 서버는 호스트 식별자([URI], 3.2.2절)와 선택적 포트 번호([URI], 3.2.3절)를 포함하는 authority 구성요소로 식별됩니다. port 하위 구성요소가 비어 있거나 지정되지 않으면 TCP 포트 80 (WWW 서비스용 예약 포트)이 기본값입니다. 오리진은 식별된 리소스를 대상으로 하는 요청에 권위 있게 응답할 권한이 누구에게 있는지를 4.3.2절에 정의된 대로 결정합니다.

송신자는 빈 host 식별자가 있는 "http" URI를 MUST NOT 생성해야 합니다. 그러한 URI 참조를 처리하는 수신자는 이를 유효하지 않은 것으로 MUST 거부해야 합니다.

계층적 경로 구성요소와 선택적 쿼리 구성요소는 해당 오리진 서버의 네임스페이스 내 대상 리소스를 식별합니다.

4.2.2. https URI 스킴

"https" URI 스킴은 주어진 포트에서 TCP 연결을 수신 대기하고 HTTP 통신을 위해 보호된 TLS([TLS13]) 연결을 설정할 수 있는 잠재적인 오리진 서버가 관리하는 계층적 네임스페이스 내에서 식별자를 생성하기 위해 정의됩니다. 이 컨텍스트에서 보호됨은 구체적으로 서버가 식별된 authority를 대신하여 동작하는 것으로 인증되었고, 해당 서버와의 모든 HTTP 통신에 클라이언트와 서버 모두가 허용할 수 있는 기밀성 및 무결성 보호가 적용되었음을 의미합니다.

  https-URI = "https" "://" authority path-abempty [ "?" query ]

"https" URI의 오리진 서버는 호스트 식별자([URI], 3.2.2절)와 선택적 포트 번호([URI], 3.2.3절)를 포함하는 authority 구성요소로 식별됩니다. port 하위 구성요소가 비어 있거나 지정되지 않으면 TCP 포트 443 (TLS를 통한 HTTP용 예약 포트)이 기본값입니다. 오리진은 식별된 리소스를 대상으로 하는 요청에 권위 있게 응답할 권한이 누구에게 있는지를 4.3.3절에 정의된 대로 결정합니다.

송신자는 빈 host 식별자가 있는 "https" URI를 MUST NOT 생성해야 합니다. 그러한 URI 참조를 처리하는 수신자는 이를 유효하지 않은 것으로 MUST 거부해야 합니다.

계층적 경로 구성요소와 선택적 쿼리 구성요소는 해당 오리진 서버의 네임스페이스 내 대상 리소스를 식별합니다.

클라이언트는 "https" 리소스에 대한 HTTP 요청이 전달되기 전에 보호되도록 하고, 해당 요청에 대한 보호된 응답만 수락하도록 MUST 해야 합니다. 클라이언트와 서버가 허용할 수 있는 암호화 메커니즘의 정의는 일반적으로 협상되며 시간이 지나면서 변경될 수 있습니다.

"https" 스킴을 통해 제공되는 리소스는 "http" 스킴과 공유되는 식별성을 갖지 않습니다. 이들은 별도의 네임스페이스를 가진 서로 다른 오리진입니다. 그러나 Cookie 프로토콜 [COOKIE]처럼 동일한 host를 가진 모든 오리진에 적용되는 것으로 정의된 HTTP 확장은 한 서비스가 설정한 정보가 일치하는 host 도메인 그룹 내의 다른 서비스와의 통신에 영향을 미칠 수 있도록 합니다. 이러한 확장은 보호된 연결에서 얻은 정보가 보호되지 않은 컨텍스트에서 의도치 않게 교환되는 것을 방지하도록 매우 신중하게 설계해야 합니다.

4.2.3. http(s) 정규화 및 비교

"http" 또는 "https" 스킴이 있는 URI는 각 스킴에 대해 위에서 설명한 기본값을 사용하여 [URI]의 6절에 정의된 방법에 따라 정규화되고 비교됩니다.

HTTP는 동등성을 결정하기 위해 특정 방법을 사용할 것을 요구하지 않습니다. 예를 들어, 캐시 키는 단순 문자열로 비교하거나, 구문 기반 정규화 후 또는 스킴 기반 정규화 후 비교할 수 있습니다.

"http" 및 "https" URI의 스킴 기반 정규화( [URI]의 6.2.3절)에는 다음과 같은 추가 규칙이 적용됩니다.

  • 포트가 스킴의 기본 포트와 같으면 정규 형식에서는 port 하위 구성요소를 생략합니다.
  • OPTIONS 요청의 대상으로 사용되지 않는 경우 빈 path 구성요소는 "/"의 절대 경로와 동등하므로 정규 형식에서는 대신 "/" 경로를 제공합니다.
  • scheme과 host는 대소문자를 구분하지 않으며 일반적으로 소문자로 제공됩니다. 다른 모든 구성요소는 대소문자를 구분하여 비교됩니다.
  • "reserved" 집합에 속하지 않는 문자는 해당 퍼센트 인코딩된 옥텟과 동등합니다. 정규 형식에서는 이를 인코딩하지 않습니다(2.1절 및 2.2절의 [URI] 참조).

예를 들어 다음 세 URI는 동등합니다.

   http://example.com:80/~smith/home.html
   http://EXAMPLE.com/%7Esmith/home.html
   http://EXAMPLE.com:/%7esmith/home.html

정규화 후(어떤 방법을 사용하든) 동등한 두 HTTP URI는 동일한 리소스를 식별한다고 가정할 수 있으며, 모든 HTTP 구성요소가 정규화를 MAY 수행할 수 있습니다. 따라서 서로 다른 리소스는 정규화 후([URI]의 6.2절에 정의된 방법 중 하나를 사용하여) 동등한 HTTP URI로 식별하는 것을 SHOULD NOT 해야 합니다.

4.2.4. http(s) URI에서 userinfo 폐기

authority의 URI 일반 구문에는 URI에 사용자 인증 정보를 포함하기 위한 userinfo 하위 구성요소([URI], 3.2.1절)도 포함됩니다. 해당 하위 구성요소에서 "user:password" 형식의 사용은 폐기되었습니다.

일부 구현은 명령 호출 옵션, 구성 파일 또는 북마크 목록 등에서 인증 정보의 내부 구성을 위해 userinfo 구성요소를 사용하며, 이러한 사용은 사용자 식별자 또는 암호를 노출할 수 있습니다.

송신자는 "http" 또는 "https" URI 참조가 메시지 내에서 대상 URI 또는 필드 값으로 생성될 때 userinfo 하위 구성요소(및 그 "@" 구분자)를 MUST NOT 생성해야 합니다.

신뢰할 수 없는 소스에서 받은 "http" 또는 "https" URI 참조를 사용하기 전에 수신자는 userinfo를 구문 분석하고 그 존재를 오류로 취급하는 것이 SHOULD 요구됩니다. 이는 피싱 공격을 위해 authority를 숨기는 데 사용되고 있을 가능성이 높습니다.

4.2.5. 프래그먼트 식별자가 있는 http(s) 참조

프래그먼트 식별자는 [URI]의 3.5절에 정의된 대로 URI 스킴과 독립적으로 보조 리소스를 간접적으로 식별할 수 있도록 합니다. URI를 참조하는 일부 프로토콜 요소는 프래그먼트를 포함할 수 있지만 다른 요소는 그렇지 않습니다. 프래그먼트가 허용되는 요소에는 ABNF 규칙을 사용하여 이를 구분하고, 그렇지 않은 경우 프래그먼트를 제외하는 특정 규칙을 사용합니다.

4.3. 권위 있는 접근

권위 있는 접근은 식별된 리소스에 접근하기 위해 주어진 식별자를 역참조하되, 클라이언트가 권위 있다고 (리소스 소유자가 제어한다고) 믿는 방식으로 수행하는 것을 의미합니다. 접근이 허용되는지 결정하는 과정은 URI 스킴에서 정의하며, 일반 구문이 사용되는 경우 authority 구성요소와 같이 URI 구성요소 내의 데이터를 자주 사용합니다. 그러나 권위 있는 접근은 식별된 메커니즘으로 제한되지 않습니다.

4.3.1절에서는 이러한 사용을 지원하기 위해 origin 개념을 정의하며, 이어지는 하위 절에서는 피어가 origin을 나타낼 권한이 있음을 설정하는 방법을 설명합니다.

권한 설정과 관련된 보안 고려사항은 17.1절을 참조하십시오.

4.3.1. URI 오리진

주어진 URI의 오리진은 scheme과 host를 소문자로 정규화하고 port의 선행 0을 제거하도록 정규화한 후의 scheme, host 및 port의 세 값입니다. URI에서 port가 생략된 경우 해당 스킴의 기본 포트를 사용합니다. 예를 들어 URI

   https://Example.Com/happy.js

의 오리진은 다음과 같습니다.

   { "https", "example.com", "443" }

이는 port가 항상 포함된 정규화된 URI 접두사로도 설명할 수 있습니다.

   https://example.com:443

각 오리진은 자체 네임스페이스를 정의하고 해당 네임스페이스의 식별자가 리소스에 매핑되는 방식을 제어합니다. 다시 말해 오리진이 유효한 요청에 시간에 걸쳐 일관되게 응답하는 방식이 사용자가 URI와 연결할 의미론을 결정하며, 이러한 의미론의 유용성이 궁극적으로 이러한 메커니즘을 사용자가 향후 참조하고 접근할 수 있는 리소스로 변환합니다.

두 오리진은 scheme, host 또는 port가 다르면 서로 다릅니다. 동일한 엔터티가 서로 다른 두 오리진을 제어하는 것으로 확인되더라도, 해당 오리진 아래의 두 네임스페이스는 해당 오리진에 대한 권한 있는 서버가 명시적으로 별칭을 지정하지 않는 한 서로 다릅니다.

Origin은 이 문서의 범위를 넘어 HTML 및 관련 웹 프로토콜에서도 사용되며, [RFC6454]에 설명되어 있습니다.

4.3.2. http 오리진

HTTP는 전송 프로토콜과 독립적이지만 "http" 스킴(4.2.1절)은 authority 구성요소에서 식별된 host의 지정된 포트에서 TCP 연결을 수신 대기하는 오리진 서버를 제어하는 주체와 authority를 연결하는 데 특화되어 있습니다. 이는 클라이언트별 이름 확인 메커니즘과 경로상 공격자로부터 보호되지 않을 수 있는 통신 모두에 의존하므로 매우 약한 의미의 authority입니다. 그럼에도 신뢰할 수 있는 환경에서 일관되게 확인하기 위해 "http" 식별자를 오리진 서버에 바인딩하는 데 충분한 최소 수준입니다.

host 식별자가 IP 주소로 제공된 경우 오리진 서버는 해당 IP 주소에서 지정된 TCP 포트의 수신기(있는 경우)입니다. host가 등록된 이름인 경우 등록된 이름은 DNS와 같은 이름 확인 서비스에서 적절한 오리진 서버의 주소를 찾는 데 사용되는 간접 식별자입니다.

"http" URI가 표시된 리소스에 접근해야 하는 컨텍스트에서 사용되는 경우, 클라이언트는 host 식별자를 IP 주소로 확인하고, 해당 주소의 지정된 포트에 TCP 연결을 설정한 다음, 클라이언트의 대상 URI(7.1절)와 일치하는 요청 대상을 포함하는 HTTP 요청 메시지를 해당 연결로 전송하여 접근을 MAY 시도할 수 있습니다.

서버가 그러한 요청에 15절에 설명된 비임시 HTTP 응답 메시지로 응답하면 해당 응답은 클라이언트의 요청에 대한 권위 있는 응답으로 간주됩니다.

그러나 위 방법이 권위 있는 응답을 얻는 유일한 수단은 아니며, 권위 있는 응답이 항상 필요하다는 의미도 아닙니다([CACHING] 참조). 예를 들어 Alt-Svc 헤더 필드 [ALTSVC]를 사용하면 오리진 서버가 해당 오리진에 대해서도 권위 있는 다른 서비스를 식별할 수 있습니다. "http"로 식별된 리소스에 대한 접근은 이 문서의 범위 밖에 있는 프로토콜에서도 제공할 수 있습니다.

4.3.3. https 오리진

"https" 스킴(4.2.2절)은 클라이언트가 식별된 오리진 서버에 대해 신뢰할 수 있다고 판단하는 인증서에 대응하는 개인 키를 서버가 사용할 수 있는 능력을 기반으로 authority를 연결합니다. 클라이언트는 일반적으로 사전 설정되거나 구성된 신뢰 앵커에서 전달되는 신뢰 체인을 바탕으로 인증서를 신뢰할 수 있다고 판단합니다(4.3.4절).

HTTP/1.1 이하에서 클라이언트는 해당 URI 오리진의 host에 명시적으로 연결된, 성공적으로 설정되고 보호된 연결을 통해 통신하는 경우에만 서버에 authority를 부여합니다. 연결 설정과 인증서 검증은 authority의 증거로 사용됩니다.

HTTP/2와 HTTP/3에서 클라이언트는 URI 오리진의 host가 서버 인증서에 있는 host 중 하나와 일치하고 클라이언트가 해당 URI에 대해 그 host로 연결을 열 수 있다고 판단하는 경우, 성공적으로 설정되고 보호된 연결을 통해 통신 중인 서버에 authority를 부여합니다. 실제로 클라이언트는 오리진의 host가 설정된 연결과 동일한 서버 IP 주소를 포함하는지 확인하기 위해 DNS 질의를 수행합니다. 이 제한은 오리진 서버가 동등한 ORIGIN 프레임 [RFC8336]을 전송하여 제거할 수 있습니다.

요청 대상의 host 및 port 값은 각 HTTP 요청에 전달되어 오리진을 식별하고 동일한 서버가 제어할 수 있는 다른 네임스페이스와 구별합니다(7.2절). 인증서의 개인 키에 대한 제어권을 제공받은 모든 서비스가 대응하는 "https" 네임스페이스를 관리할 동등한 책임이 있거나, 최소한 잘못 전달된 것으로 보이는 요청을 거부할 준비가 되어 있도록 하는 것은 오리진의 책임입니다(7.4절).

오리진 서버는 그렇게 할 authority가 있더라도 특정 대상 URI에 대한 요청을 처리하지 않을 수 있습니다. 예를 들어 host가 서로 다른 포트(예: 443 및 8000)에서 별도의 서비스를 운영하는 경우, 네트워크 공격자가 한 포트에 대한 연결을 다른 포트에서 수신되도록 할 수 있으므로 연결이 보호된 후에도 오리진 서버에서 대상 URI를 확인해야 합니다. 대상 URI를 확인하지 않으면 그러한 공격자가 하나의 대상 URI(예: "https://example.com/foo")에 대한 응답을 다른 포트(예: "https://example.com:8000/foo")에서 온, 겉보기에는 권위 있는 응답으로 대체할 수 있습니다.

"https" 스킴은 authority를 연결할 때 TCP와 연결된 포트 번호에 의존하지 않습니다. 둘 다 보호된 통신 외부에 있으므로 결정적인 것으로 신뢰할 수 없기 때문입니다. 따라서 HTTP 통신은 4.2.2절에 정의된 대로 보호된 모든 채널에서 이루어질 수 있으며, 여기에는 TCP를 사용하지 않는 프로토콜도 포함됩니다.

"https" URI가 표시된 리소스에 접근해야 하는 컨텍스트에서 사용되는 경우, 클라이언트는 host 식별자를 IP 주소로 확인하고, 해당 주소의 지정된 포트에 TCP 연결을 설정하고, 기밀성과 무결성 보호를 적용하여 TCP 위에서 TLS를 성공적으로 시작함으로써 연결을 종단 간 보호한 다음, 클라이언트의 대상 URI(7.1절)와 일치하는 요청 대상을 포함하는 HTTP 요청 메시지를 해당 연결로 전송하여 접근을 MAY 시도할 수 있습니다.

서버가 그러한 요청에 15절에 설명된 비임시 HTTP 응답 메시지로 응답하면 해당 응답은 클라이언트의 요청에 대한 권위 있는 응답으로 간주됩니다.

그러나 위 방법이 권위 있는 응답을 얻는 유일한 수단은 아니며, 권위 있는 응답이 항상 필요하다는 의미도 아닙니다([CACHING] 참조).

4.3.4. https 인증서 검증

URI를 역참조하기 위한 보호된 연결을 설정하려면 클라이언트는 서비스의 식별성이 URI의 오리진 서버와 허용 가능한 방식으로 일치하는지 MUST 검증해야 합니다. 인증서 검증은 경로상 공격자나 이름 확인을 제어하는 공격자가 서버를 가장하는 것을 방지하는 데 사용됩니다. 이 과정에서는 클라이언트가 신뢰 앵커 집합으로 구성되어 있어야 합니다.

일반적으로 클라이언트는 [RFC6125]의 6절에 정의된 검증 과정을 사용하여 서비스 식별성을 MUST 검증해야 합니다. 클라이언트는 서비스의 host에서 참조 식별성을 MUST 구성해야 합니다. host가 리터럴 IP 주소(4.3.5절)이면 참조 식별성은 IP-ID이고, 그렇지 않으면 host는 이름이며 참조 식별성은 DNS-ID입니다.

클라이언트는 CN-ID 유형의 참조 식별성을 MUST NOT 사용하지 마십시오. [RFC6125]의 6.2.1절에 언급된 대로, CN-ID 유형의 참조 식별성은 이전 클라이언트에서 사용될 수 있습니다.

클라이언트는 대체 형태의 서버 식별성 검증을 허용하도록 특별히 구성될 수 있습니다. 예를 들어 클라이언트는 주소와 host 이름이 동적인 서버에 연결하면서, 서비스가 대상 URI의 오리진과 일치하는 인증서 대신 특정 인증서(또는 외부에서 정의된 참조 식별성과 일치하는 인증서)를 제공할 것으로 예상할 수 있습니다.

특별한 경우 클라이언트가 서버의 식별성을 단순히 무시하는 것이 적절할 수 있지만, 그러면 연결이 능동적 공격에 노출된다는 점을 이해해야 합니다.

인증서가 대상 URI의 오리진에 유효하지 않은 경우 사용자 에이전트는 진행하기 전에 사용자에게 확인을 받거나(3.5절 참조) 잘못된 인증서 오류와 함께 연결을 종료하도록 MUST 해야 합니다. 자동화된 클라이언트는 오류를 적절한 감사 로그(사용 가능한 경우)에 MUST 기록하고 연결을 종료하는 것이 SHOULD 요구됩니다(잘못된 인증서 오류와 함께). 자동화된 클라이언트는 이 검사를 비활성화하는 구성 설정을 MAY 제공할 수 있지만, 이를 활성화하는 설정을 MUST 제공해야 합니다.

4.3.5. IP-ID 참조 식별성

"https" URI의 "host" 필드에서 IP 주소 리터럴을 사용해 식별되는 서버는 IP-ID 유형의 참조 식별성을 갖습니다. IP 버전 4 주소는 "IPv4address" ABNF 규칙을 사용하고, IP 버전 6 주소는 "IPv6address" 옵션이 있는 "IP-literal" 생성식을 사용합니다. [URI]의 3.2.2절을 참조하십시오. IP-ID의 참조 식별성에는 IP 주소를 디코딩한 바이트가 포함됩니다.

IP 버전 4 주소는 4옥텟이고 IP 버전 6 주소는 16옥텟입니다. 다른 IP 버전에 대해서는 IP-ID 사용이 정의되지 않습니다. 인증서 subjectAltName 확장의 iPAddress 선택 항목은 IP 버전을 명시적으로 포함하지 않으므로 주소 길이에 의존하여 버전을 구분합니다. [RFC5280]의 4.2.1.6절을 참조하십시오.

IP-ID 유형의 참조 식별성은 주소가 인증서의 subjectAltName 확장에 있는 iPAddress 값과 동일하면 일치합니다.

5. 필드

HTTP는 등록된 키 네임스페이스를 가진 확장 가능한 이름/값 쌍 형태로 데이터를 제공하기 위해 필드를 사용합니다. 필드는 메시지(6절)의 헤더 및 트레일러 섹션 내에서 송수신됩니다.

5.1. 필드 이름

필드 이름은 대응하는 필드 값에 해당 이름으로 정의된 의미론이 있음을 표시합니다. 예를 들어 Date 헤더 필드는 6.6.1절에서 해당 필드가 나타나는 메시지의 생성 타임스탬프를 포함하는 것으로 정의됩니다.

필드 이름은 대소문자를 구분하지 않으며 "Hypertext Transfer Protocol (HTTP) Field Name Registry"에 등록하는 것이 바람직합니다. 16.3.1절을 참조하십시오.

필드 해석은 동일한 주 HTTP 버전의 부 버전 사이에서 변경되지 않지만, 그러한 필드가 없을 때 수신자의 기본 동작은 변경될 수 있습니다. 달리 명시되지 않는 한 필드는 모든 HTTP 버전에 대해 정의됩니다. 특히 Host 및 Connection 필드는 HTTP/1.1에 적합함을 알리는지 여부와 관계없이 모든 HTTP 구현이 인식하는 것이 바람직합니다.

정의된 의미론상 인식하지 못하는 수신자가 안전하게 무시할 수 있는 경우 새 필드는 프로토콜 버전을 변경하지 않고 도입할 수 있습니다. 16.3절을 참조하십시오.

프록시는 필드 이름이 Connection 헤더 필드(7.6.1절)에 나열되어 있거나 프록시가 그러한 필드를 차단하거나 달리 변환하도록 특별히 구성된 경우를 제외하고, 인식하지 못하는 헤더 필드를 MUST 전달해야 합니다. 다른 수신자는 인식하지 못하는 헤더 및 트레일러 필드를 SHOULD 무시해야 합니다. 이러한 요구사항을 준수하면 배포된 중개자를 업데이트하거나 제거하지 않고 HTTP 기능을 확장할 수 있습니다.

5.2. 필드 라인과 결합된 필드 값

필드 섹션은 임의 개수의 필드 라인으로 구성되며, 각각 필드를 식별하는 필드 이름(5.1절 참조)과 해당 필드 인스턴스에 대한 데이터를 전달하는 필드 라인 값을 갖습니다.

필드 이름이 섹션에 한 번만 존재하는 경우 해당 필드의 결합된 필드 값은 대응하는 필드 라인 값으로 구성됩니다. 필드 이름이 섹션 내에서 반복되는 경우 결합된 필드 값은 해당 섹션의 대응하는 필드 라인 값 목록을 순서대로 연결하되, 각 필드 라인 값을 쉼표로 구분한 것으로 구성됩니다.

예를 들어 다음 섹션은

Example-Field: Foo, Bar
Example-Field: Baz

두 개의 필드 라인을 포함하며 둘 다 필드 이름이 "Example-Field"입니다. 첫 번째 필드 라인의 필드 라인 값은 "Foo, Bar"이고 두 번째 필드 라인 값은 "Baz"입니다. "Example-Field"의 필드 값은 "Foo, Bar, Baz" 목록입니다.

5.3. 필드 순서

수신자는 필드 섹션 내에서 동일한 필드 이름을 가진 여러 필드 라인을, 메시지의 의미론을 변경하지 않고 각 후속 필드 라인 값을 초기 필드 라인 값에 순서대로 추가하되 쉼표(",")와 선택적 공백(OWS, 5.6.3절에 정의됨)으로 구분하여 하나의 필드 라인으로 MAY 결합할 수 있습니다. 일관성을 위해 쉼표 SP를 사용하십시오.

따라서 동일한 이름의 필드 라인이 수신되는 순서는 필드 값 해석에 중요합니다. 프록시는 메시지를 전달할 때 이러한 필드 라인 값의 순서를 MUST NOT 변경해야 합니다.

이는 아래에 언급된 잘 알려진 예외를 제외하고, 송신자는 해당 필드의 정의가 여러 필드 라인 값을 쉼표로 구분된 목록으로 다시 결합하는 것을 허용하지 않는 한(즉, 필드 정의의 적어도 하나의 대안이 쉼표로 구분된 목록을 허용하는 경우, 예를 들어 5.6.1절에 정의된 #(values) ABNF 규칙처럼), 메시지(헤더 또는 트레일러)의 동일한 이름으로 여러 필드 라인을 생성하거나 동일한 이름의 필드 라인이 이미 메시지에 존재할 때 필드 라인을 추가하는 것을 MUST NOT 해야 함을 의미합니다.

필드 이름이 서로 다른 필드 라인이 섹션에서 수신되는 순서는 중요하지 않습니다. 그러나 구현이 메시지를 처리하지 않을지 가능한 한 빨리 결정할 수 있도록 요청의 Host 및 응답의 Date와 같이 추가 제어 데이터를 포함하는 헤더 필드를 먼저 전송하는 것이 좋습니다.

서버는 전체 요청 헤더 섹션을 수신할 때까지 대상 리소스에 요청을 MUST NOT 적용해야 합니다. 이후 헤더 필드 라인에는 조건, 인증 자격 증명 또는 요청 처리에 영향을 줄 수 있는 의도적으로 오해를 유발하는 중복 헤더 필드가 포함될 수 있기 때문입니다.

5.4. 필드 제한

HTTP는 2절에 설명된 대로 각 필드 라인, 필드 값의 길이나 헤더 또는 트레일러 섹션 전체의 길이에 미리 정의된 제한을 두지 않습니다. 실제로는 개별 길이에 대한 다양한 임시 제한이 발견되며, 이는 흔히 특정 필드의 의미론에 따라 달라집니다.

처리하려는 크기보다 큰 요청 헤더 필드 라인, 필드 값 또는 필드 집합을 수신한 서버는 적절한 4xx(클라이언트 오류) 상태 코드로 MUST 응답해야 합니다. 이러한 헤더 필드를 무시하면 요청 스머글링 공격에 대한 서버의 취약성이 증가합니다( [HTTP/1.1]의 11.2절).

클라이언트는 필드 의미론상 삭제된 값이 메시지 프레이밍이나 응답 의미론을 변경하지 않고 안전하게 무시될 수 있는 경우, 처리하려는 크기보다 큰 수신된 필드 라인을 MAY 버리거나 잘라낼 수 있습니다.

5.5. 필드 값

HTTP 필드 값은 필드의 문법으로 정의된 형식의 문자 시퀀스로 구성됩니다. 각 필드의 문법은 일반적으로 ABNF([RFC5234])를 사용하여 정의됩니다.

필드 값에는 선행 또는 후행 공백이 포함되지 않습니다. 특정 HTTP 버전에서 그러한 공백이 메시지에 나타나는 것을 허용하는 경우 필드 구문 분석 구현은 필드 값을 평가하기 전에 그러한 공백을 MUST 제외해야 합니다.

필드 값은 일반적으로 US-ASCII 문자 범위로 제한됩니다. [USASCII]. 더 넓은 범위의 문자가 필요한 필드는 [RFC8187]에 정의된 것과 같은 인코딩을 사용할 수 있습니다. 역사적으로 HTTP는 ISO-8859-1 문자 집합의 텍스트가 포함된 필드 콘텐츠를 허용했으며 [ISO-8859-1], 다른 문자 집합은 [RFC2047] 인코딩을 통해서만 지원했습니다. 새로 정의된 필드에 대한 사양은 해당 값을 가시 US-ASCII 옥텟(VCHAR), SP 및 HTAB으로 제한하는 것이 SHOULD 요구됩니다. 수신자는 필드 콘텐츠에서 허용되는 다른 옥텟(즉, obs-text)을 불투명 데이터로 취급하는 것이 SHOULD 요구됩니다.

CR, LF 또는 NUL 문자를 포함하는 필드 값은 구현이 이러한 문자를 구문 분석하고 해석하는 방식이 다양하므로 유효하지 않고 위험합니다. 필드 값에서 CR, LF 또는 NUL을 수신한 수신자는 메시지를 거부하거나 각 문자를 SP로 대체한 후 해당 메시지를 추가 처리하거나 전달하도록 MUST 해야 합니다. 다른 CTL 문자를 포함하는 필드 값도 유효하지 않습니다. 그러나 수신자는 안전한 컨텍스트(예: 다운스트림 HTTP 파서에서 처리되지 않는 애플리케이션별 인용 문자열) 안에 나타나는 경우 견고성을 위해 그러한 문자를 MAY 유지할 수 있습니다.

필드 값으로 하나의 멤버만 예상하는 필드는 싱글턴 필드라고 합니다.

필드 값으로 여러 멤버를 허용하는 필드는 목록 기반 필드라고 합니다. 5.6.1절의 목록 연산자 확장은 여러 멤버를 포함할 수 있는 필드 값을 정의하기 위한 공통 표기법으로 사용됩니다.

쉼표(",")가 멤버 사이의 구분자로 사용되므로 멤버 내부의 데이터로 허용되는 경우 주의해서 처리해야 합니다. 이는 목록 기반 필드와 싱글턴 필드 모두에 해당합니다. 싱글턴 필드가 여러 멤버와 함께 잘못 전송될 수 있고, 이러한 오류를 감지하면 상호운용성이 향상되기 때문입니다. HTTP-date 또는 URI-reference 요소 안처럼 멤버 내부에 쉼표가 포함될 것으로 예상되는 필드는 해당 데이터 안의 쉼표를 잠재적인 목록 구분자와 구별할 수 있도록 해당 요소 주변에 구분자를 사용해 정의하는 것이 바람직합니다.

예를 들어 텍스트 형식의 날짜와 URI(둘 다 쉼표를 포함할 수 있음)는 다음과 같은 목록 기반 필드 값에서 안전하게 전달할 수 있습니다.

Example-URIs: "http://example.com/a.html,foo",
              "http://without-a-comma.example.com/"
Example-Dates: "Sat, 04 May 1996", "Wed, 14 Sep 2005"

큰따옴표 구분자는 거의 항상 quoted-string 생성식(5.6.4절)과 함께 사용된다는 점에 유의하십시오. 큰따옴표 안에서 다른 구문을 사용하면 불필요한 혼란을 일으킬 가능성이 높습니다.

많은 필드(예: Content-Type, 8.3절에 정의됨)는 매개변수 값에 대해 인용되지 않은(token) 구문과 인용된(quoted-string) 구문을 모두 허용하는 매개변수용 공통 구문(5.6.6절)을 사용합니다. 공통 구문을 사용하면 수신자가 기존 파서 구성요소를 재사용할 수 있습니다. 두 형식을 모두 허용하는 경우 매개변수 값의 의미는 token으로 수신되든 인용 문자열로 수신되든 동일한 것이 바람직합니다.

5.6. 필드 값을 정의하기 위한 공통 규칙

5.6.1. 목록(#rule ABNF 확장)

[RFC5234]의 ABNF 규칙에 대한 #rule 확장은 일부 목록 기반 필드 값 정의의 가독성을 향상하는 데 사용됩니다.

쉼표로 구분된 요소 목록을 정의하기 위해 "*"와 유사한 "#" 구문이 정의됩니다. 전체 형식은 "<n>#<m>element"이며, 최소 <n>개에서 최대 <m>개의 요소를 나타내고 각 요소는 하나의 쉼표(",")와 선택적 공백(OWS, 5.6.3절에 정의됨)으로 구분됩니다.

5.6.1.1. 송신자 요구사항

목록 구문을 사용하는 모든 생성식에서 송신자는 빈 목록 요소를 MUST NOT 생성해야 합니다. 즉, 송신자는 다음 구문을 충족하는 목록을 생성해야 합니다.

  1#element => element *( OWS "," OWS element )

그리고:

  #element => [ 1#element ]

그리고 n >= 1 및 m > 1인 경우:

  <n>#<m>element => element <n-1>*<m-1>( OWS "," OWS element )

부록 A에서는 목록 구문을 확장한 후 송신자용으로 수집된 ABNF를 보여 줍니다.

5.6.1.2. 수신자 요구사항

빈 요소는 존재하는 요소 수에 포함되지 않습니다. 수신자는 합리적인 수의 빈 목록 요소를 구문 분석하고 무시하도록 MUST 해야 합니다. 값을 병합하는 송신자의 일반적인 실수를 처리하기에는 충분하지만 서비스 거부 메커니즘으로 사용될 정도로 많아서는 안 됩니다. 즉 수신자는 다음 구문을 충족하는 목록을 MUST 허용해야 합니다.

  #element => [ element ] *( OWS "," OWS [ element ] )

빈 목록 요소가 존재할 수 있으므로 RFC 5234 ABNF는 목록 요소의 카디널리티를 강제할 수 없으며, 그 결과 모든 경우가 카디널리티가 지정되지 않은 것처럼 매핑됩니다.

예를 들어 다음 ABNF 생성식이 주어진 경우:

  example-list      = 1#example-list-elmt
  example-list-elmt = token ; 5.6.2절 참조

다음은 example-list의 유효한 값입니다(구분을 위해 존재할 뿐인 큰따옴표는 포함하지 않음).

  "foo,bar"
  "foo ,bar,"
  "foo , ,bar,charlie"

반대로 다음 값은 example-list 생성식에서 비어 있지 않은 요소가 하나 이상 필요하므로 유효하지 않습니다.

  ""
  ","
  ",   ,"

5.6.2. 토큰

토큰은 공백이나 구분자를 포함하지 않는 짧은 텍스트 식별자입니다.

  token          = 1*tchar

  tchar          = "!" / "#" / "$" / "%" / "&" / "'" / "*"
                 / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~"
                 / DIGIT / ALPHA
                 ; 구분자를 제외한 모든 VCHAR

많은 HTTP 필드 값은 공백이나 특정 구분 문자로 분리되는 공통 구문 구성요소를 사용하여 정의됩니다. 구분자는 token에서 허용되지 않는 US-ASCII 가시 문자 집합(DQUOTE 및 "(),/:;<=>?@[\]{}")에서 선택됩니다.

5.6.3. 공백

이 사양은 선형 공백 사용을 나타내기 위해 세 가지 규칙을 사용합니다. OWS (선택적 공백), RWS (필수 공백), BWS ("잘못된" 공백).

OWS 규칙은 0개 이상의 선형 공백 옥텟이 나타날 수 있는 곳에 사용됩니다. 가독성을 높이기 위해 선택적 공백을 사용하는 것이 바람직한 프로토콜 요소에서는 송신자가 선택적 공백을 하나의 SP로 생성하는 것이 SHOULD 요구됩니다. 그렇지 않은 경우 송신자는 인플레이스 메시지 필터링 중 유효하지 않거나 원하지 않는 프로토콜 요소를 덮어쓰는 데 필요한 경우를 제외하고 선택적 공백을 생성하지 않는 것이 SHOULD NOT 요구됩니다.

RWS 규칙은 필드 토큰을 구분하기 위해 최소 하나의 선형 공백 옥텟이 필요한 경우에 사용됩니다. 송신자는 RWS를 하나의 SP로 생성하는 것이 SHOULD 요구됩니다.

OWS와 RWS는 하나의 SP와 동일한 의미론을 가집니다. OWS 또는 RWS로 정의된 것으로 알려진 모든 콘텐츠는 이를 해석하거나 메시지를 다운스트림으로 전달하기 전에 하나의 SP로 MAY 대체할 수 있습니다.

BWS 규칙은 역사적인 이유로만 문법에서 선택적 공백을 허용하는 곳에 사용됩니다. 송신자는 메시지에서 BWS를 MUST NOT 생성해야 합니다. 수신자는 그러한 잘못된 공백을 구문 분석하고 프로토콜 요소를 해석하기 전에 제거하도록 MUST 해야 합니다.

BWS에는 의미론이 없습니다. BWS로 정의된 것으로 알려진 모든 콘텐츠는 이를 해석하거나 메시지를 다운스트림으로 전달하기 전에 제거할 수 MAY 있습니다.

  OWS            = *( SP / HTAB )
                 ; 선택적 공백
  RWS            = 1*( SP / HTAB )
                 ; 필수 공백
  BWS            = OWS
                 ; "잘못된" 공백

5.6.4. 인용 문자열

텍스트 문자열은 큰따옴표로 인용된 경우 하나의 값으로 구문 분석됩니다.

  quoted-string  = DQUOTE *( qdtext / quoted-pair ) DQUOTE
  qdtext         = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text

백슬래시 옥텟("\")은 quoted-string과 comment 구문 안에서 단일 옥텟 인용 메커니즘으로 사용할 수 있습니다. quoted-string의 값을 처리하는 수신자는 quoted-pair를 백슬래시 다음의 옥텟으로 대체한 것처럼 MUST 처리해야 합니다.

  quoted-pair    = "\" ( HTAB / SP / VCHAR / obs-text )

송신자는 해당 문자열 안에 나타나는 DQUOTE 및 백슬래시 옥텟을 인용하는 데 필요한 경우를 제외하고 quoted-string에서 quoted-pair를 생성하지 않는 것이 SHOULD NOT 요구됩니다. 송신자는 주석 안에 나타나는 괄호["(" 및 ")"]와 백슬래시 옥텟을 인용하는 데 필요한 경우를 제외하고 주석에서 quoted-pair를 생성하지 않는 것이 SHOULD NOT 요구됩니다.

5.6.5. 주석

일부 HTTP 필드에는 주석 텍스트를 괄호로 둘러싸 주석을 포함할 수 있습니다. 주석은 필드 값 정의의 일부로 "comment"를 포함하는 필드에서만 허용됩니다.

  comment        = "(" *( ctext / quoted-pair / comment ) ")"
  ctext          = HTAB / SP / %x21-27 / %x2A-5B / %x5D-7E / obs-text

5.6.6. 매개변수

매개변수는 이름/값 쌍의 인스턴스이며, 항목에 보조 정보를 추가하기 위한 공통 구문으로 필드 값에서 자주 사용됩니다. 각 매개변수는 일반적으로 바로 앞의 세미콜론으로 구분됩니다.

매개변수 이름은 대소문자를 구분하지 않습니다. 매개변수 값은 매개변수 이름의 의미론에 따라 대소문자를 구분할 수도 있고 구분하지 않을 수도 있습니다. 매개변수의 예와 일부 동등한 형식은 미디어 유형(8.3.1절) 및 Accept 헤더 필드(12.5.1절)에서 볼 수 있습니다.

token 생성식과 일치하는 매개변수 값은 token으로 또는 quoted-string 안에서 전송할 수 있습니다. 인용된 값과 인용되지 않은 값은 동등합니다.

5.6.7. 날짜/시간 형식

1995년 이전에는 서버가 타임스탬프를 전달하는 데 일반적으로 사용하는 세 가지 형식이 있었습니다. 이전 구현과의 호환성을 위해 세 형식 모두 여기에서 정의됩니다. 선호되는 형식은 인터넷 메시지 형식 [RFC5322]에서 사용하는 날짜 및 시간 사양의 고정 길이 단일 시간대 하위 집합입니다.

선호되는 형식의 예는 다음과 같습니다.

Sun, 06 Nov 1994 08:49:37 GMT    ; IMF-fixdate

폐기된 두 형식의 예는 다음과 같습니다.

Sunday, 06-Nov-94 08:49:37 GMT   ; 폐기된 RFC 850 형식
Sun Nov  6 08:49:37 1994         ; ANSI C의 asctime() 형식

HTTP 필드에서 타임스탬프 값을 구문 분석하는 수신자는 세 가지 HTTP-date 형식을 모두 MUST 허용해야 합니다. 송신자가 HTTP-date로 정의된 하나 이상의 타임스탬프를 포함하는 필드를 생성할 때 송신자는 해당 타임스탬프를 IMF-fixdate 형식으로 MUST 생성해야 합니다.

HTTP-date 값은 시간을 협정 세계시 (UTC)의 한 시점으로 나타냅니다. 처음 두 형식은 UTC 명칭의 전신인 그리니치 평균시의 세 글자 약어 "GMT"로 UTC를 나타냅니다. asctime 형식의 값은 UTC인 것으로 간주됩니다.

시계는 현재 UTC 시점의 합리적인 근삿값을 제공할 수 있는 구현입니다. 시계 구현은 UTC와 동기화하기 위해 NTP ([RFC5905]) 또는 이와 유사한 프로토콜을 사용하는 것이 바람직합니다.

선호되는 형식:

  IMF-fixdate  = day-name "," SP date1 SP time-of-day SP GMT
  ; 형식의 고정 길이/시간대/대문자 표기 하위 집합
  ; [RFC5322]의 3.3절 참조

  day-name     = %s"Mon" / %s"Tue" / %s"Wed"
               / %s"Thu" / %s"Fri" / %s"Sat" / %s"Sun"

  date1        = day SP month SP year
               ; 예: 02 Jun 1982

  day          = 2DIGIT
  month        = %s"Jan" / %s"Feb" / %s"Mar" / %s"Apr"
               / %s"May" / %s"Jun" / %s"Jul" / %s"Aug"
               / %s"Sep" / %s"Oct" / %s"Nov" / %s"Dec"
  year         = 4DIGIT

  GMT          = %s"GMT"

  time-of-day  = hour ":" minute ":" second
               ; 00:00:00 - 23:59:60 (윤초)

  hour         = 2DIGIT
  minute       = 2DIGIT
  second       = 2DIGIT

폐기된 형식:

  rfc850-date  = day-name-l "," SP date2 SP time-of-day SP GMT
  date2        = day "-" month "-" 2DIGIT
               ; 예: 02-Jun-82

  day-name-l   = %s"Monday" / %s"Tuesday" / %s"Wednesday"
               / %s"Thursday" / %s"Friday" / %s"Saturday"
               / %s"Sunday"

HTTP-date는 대소문자를 구분합니다. [CACHING]의 4.2절은 캐시 수신자에 대해 이를 완화한다는 점에 유의하십시오.

송신자는 문법에서 SP로 명시적으로 포함된 것 외에 HTTP-date에 추가 공백을 MUST NOT 생성하지 마십시오. day-name, day, month, year 및 time-of-day의 의미론은 같은 이름의 인터넷 메시지 형식 구문에 대해 정의된 것과 동일합니다([RFC5322], 3.3절).

두 자리 연도를 사용하는 rfc850-date 형식의 타임스탬프 값을 수신한 수신자는 현재보다 50년 넘게 미래인 것으로 보이는 타임스탬프를 마지막 두 자리가 같은 가장 최근의 과거 연도를 나타내는 것으로 MUST 해석해야 합니다.

타임스탬프 값의 수신자는 필드 정의에서 달리 제한하지 않는 한 타임스탬프를 견고하게 구문 분석하는 것이 권장됩니다. 예를 들어 메시지는 인터넷 메시지 형식에서 정의한 날짜 및 시간 사양 중 하나를 생성할 수 있는 비 HTTP 소스에서 HTTP를 통해 전달되기도 합니다.

6. 메시지 추상화

HTTP의 각 주요 버전은 메시지를 전달하기 위한 자체 구문을 정의합니다. 이 절에서는 이러한 메시지 특성, 공통 구조 및 의미론 전달 능력을 일반화하여 HTTP 메시지를 위한 추상 데이터 유형을 정의합니다. 이 추상화는 HTTP 버전과 독립적인 송신자와 수신자의 요구사항을 정의하는 데 사용되므로, 한 버전의 메시지를 의미를 변경하지 않고 다른 버전을 통해 중계할 수 있습니다.

메시지는 다음으로 구성됩니다.

  • 메시지를 설명하고 라우팅하기 위한 제어 데이터,
  • 해당 제어 데이터를 확장하고 송신자, 메시지, 콘텐츠 또는 컨텍스트에 관한 추가 정보를 전달하기 위한 이름/값 쌍의 headers 조회 테이블,
  • 잠재적으로 제한 없는 콘텐츠 스트림, 그리고
  • 콘텐츠를 전송하는 동안 얻은 정보를 전달하기 위한 이름/값 쌍의 trailers 조회 테이블.

프레이밍과 제어 데이터가 먼저 전송되고, 그 뒤에 headers 테이블의 필드를 포함하는 헤더 섹션이 이어집니다. 메시지에 콘텐츠가 포함된 경우 콘텐츠는 헤더 섹션 뒤에 전송되며, 그 뒤에 trailers 테이블의 필드를 포함할 수 있는 트레일러 섹션이 이어질 수 있습니다.

메시지는 스트림으로 처리될 것으로 예상되며, 해당 스트림의 목적과 계속되는 처리는 읽는 동안 드러납니다. 따라서 제어 데이터는 수신자가 즉시 알아야 할 내용을 설명하고, 헤더 필드는 콘텐츠를 수신하기 전에 알아야 할 내용을 설명하며, 콘텐츠(있는 경우)는 수신자가 메시지 의미론을 충족하기 위해 원하거나 필요로 하는 내용을 포함하는 것으로 간주되고, 트레일러 필드는 콘텐츠를 보내기 전에는 알 수 없었던 선택적 메타데이터를 제공합니다.

메시지는 자기 기술적이도록 의도됩니다. 수신자가 메시지에 대해 알아야 하는 모든 내용은 전송 중 압축되거나 생략된 부분을 디코딩하거나 재구성한 뒤, 송신자의 현재 애플리케이션 상태(이전 메시지를 통해 설정됨)를 이해할 필요 없이 메시지 자체를 살펴봄으로써 결정할 수 있습니다. 그러나 클라이언트는 대응하는 응답을 구문 분석, 해석 또는 캐싱할 때 요청에 관한 정보를 MUST 유지해야 합니다. 예를 들어 HEAD 메서드에 대한 응답은 GET 응답의 시작 부분과 똑같아 보이지만 같은 방식으로 구문 분석할 수 없습니다.

이 메시지 추상화는 일부 버전에서는 찾을 수 없는 기능을 포함하여 여러 HTTP 버전에 걸친 일반화임에 유의하십시오. 예를 들어 트레일러는 HTTP/1.1 청크 전송 코딩에서 콘텐츠 뒤의 트레일러 섹션으로 도입되었습니다. HTTP/2와 HTTP/3에는 각 스트림을 종료하는 헤더 블록 내에 이에 해당하는 기능이 있습니다.

6.1. 프레이밍 및 완전성

메시지 프레이밍은 각 메시지가 시작하고 끝나는 방식을 나타내어 각 메시지를 동일한 연결상의 다른 메시지나 노이즈와 구별할 수 있게 합니다. HTTP의 각 주요 버전은 자체 프레이밍 메커니즘을 정의합니다.

HTTP/0.9 및 초기 HTTP/1.0 배포에서는 응답을 종료하기 위해 기본 연결의 종료를 사용했습니다. 하위 호환성을 위해 이러한 암시적 프레이밍은 HTTP/1.1에서도 허용됩니다. 그러나 연결이 일찍 닫히면 암시적 프레이밍은 불완전한 응답을 구별하지 못할 수 있습니다. 이러한 이유로 거의 모든 최신 구현은 길이로 구분된 메시지 데이터 시퀀스 형태의 명시적 프레이밍을 사용합니다.

프레이밍으로 지정된 모든 옥텟을 사용할 수 있을 때 메시지는 완전한 것으로 간주됩니다. 명시적 프레이밍을 사용하지 않는 경우 기본 연결의 종료로 끝나는 응답 메시지는, 전송 수준 오류가 완전하지 않음을 나타내지 않는 한 불완전한 응답과 구별할 수 없더라도 완전한 것으로 간주됩니다.

6.2. 제어 데이터

메시지는 주된 목적을 설명하는 제어 데이터로 시작합니다. 요청 메시지 제어 데이터에는 요청 메서드(9절), 요청 대상(7.1절) 및 프로토콜 버전(2.5절)이 포함됩니다. 응답 메시지 제어 데이터에는 상태 코드(15절), 선택적 이유 구문 및 프로토콜 버전이 포함됩니다.

HTTP/1.1([HTTP/1.1]) 이하에서는 제어 데이터가 메시지의 첫 번째 줄로 전송됩니다. HTTP/2([HTTP/2]) 및 HTTP/3([HTTP/3])에서는 제어 데이터가 예약된 이름 접두사(예: ":authority")를 가진 의사 헤더 필드로 전송됩니다.

모든 HTTP 메시지에는 프로토콜 버전이 있습니다. 사용 중인 버전에 따라 메시지 안에서 명시적으로 식별되거나 메시지가 수신되는 연결에서 추론될 수 있습니다. 수신자는 해당 버전 정보를 사용하여 해당 송신자와의 이후 통신에 대한 제한이나 가능성을 결정합니다.

메시지가 중개자에 의해 전달될 때 프로토콜 버전은 해당 중개자가 사용하는 버전을 반영하도록 갱신됩니다. Via 헤더 필드(7.6.3절)는 전달된 메시지 내에서 업스트림 프로토콜 정보를 전달하는 데 사용됩니다.

클라이언트는 서버가 지원하는 것으로 알려진 가장 높은 버전의 주 버전보다 높지 않으면서 클라이언트가 적합한 가장 높은 버전과 동일한 요청 버전을 SHOULD 전송해야 합니다. 클라이언트는 자신이 적합하지 않은 버전을 MUST NOT 전송해야 합니다.

서버가 HTTP 사양을 잘못 구현하는 것으로 알려진 경우, 클라이언트는 적어도 하나의 정상 요청을 시도하고 응답 상태 코드 또는 헤더 필드(예: Server)를 통해 서버가 더 높은 요청 버전을 부적절하게 처리함을 확인한 후에만 더 낮은 요청 버전을 MAY 전송할 수 있습니다.

서버는 요청에서 수신한 주 버전 이하인 버전 중 서버가 적합한 가장 높은 버전과 동일한 응답 버전을 SHOULD 전송해야 합니다. 서버는 자신이 적합하지 않은 버전을 MUST NOT 전송해야 합니다. 서버는 어떤 이유로든 클라이언트의 주 프로토콜 버전에 대한 서비스를 거부하려는 경우 505 (HTTP 버전이 지원되지 않음) 응답을 전송할 수 있습니다.

수신자가 구현하는 주 버전 번호와 구현하는 것보다 높은 부 버전 번호를 가진 메시지를 수신한 경우, 수신자는 해당 주 버전에서 자신이 적합한 가장 높은 부 버전인 것처럼 메시지를 SHOULD 처리해야 합니다. 아직 더 높은 버전에 대한 지원을 나타내지 않은 수신자에게 더 높은 부 버전의 메시지가 전송된 경우, 동일한 주 버전의 모든 구현이 안전하게 처리할 수 있을 정도로 충분히 하위 호환된다고 수신자는 가정할 수 있습니다.

6.3. 헤더 필드

콘텐츠보다 먼저 송수신되는 필드(5절)를 "헤더 필드"(구어적으로는 단순히 "헤더")라고 합니다.

메시지의 헤더 섹션은 헤더 필드 라인의 시퀀스로 구성됩니다. 각 헤더 필드는 메시지 의미론을 수정하거나 확장하고, 송신자를 설명하고, 콘텐츠를 정의하거나 추가 컨텍스트를 제공할 수 있습니다.

6.4. 콘텐츠

HTTP 메시지는 종종 완전하거나 부분적인 표현을 메시지 콘텐츠로 전송합니다. 이는 메시지 프레이밍으로 구분되어 헤더 섹션 뒤에 전송되는 옥텟 스트림입니다.

콘텐츠의 이 추상적 정의는 메시지 프레이밍에서 추출된 후의 데이터를 반영합니다. 예를 들어 HTTP/1.1 메시지 본문([HTTP/1.1]의 6절)은 청크 전송 코딩으로 인코딩된 데이터 스트림, 즉 데이터 청크의 시퀀스, 길이가 0인 청크 하나 및 트레일러 섹션으로 구성될 수 있지만, 동일한 메시지의 콘텐츠에는 전송 코딩이 디코딩된 후의 데이터 스트림만 포함됩니다. 청크 길이, 청크 프레이밍 구문 또는 트레일러 필드(6.5절)는 포함되지 않습니다.

6.4.1. 콘텐츠 의미론

요청에서 콘텐츠의 목적은 메서드 의미론(9절)에 의해 정의됩니다.

예를 들어 PUT 요청(9.3.4절)의 콘텐츠에 있는 표현은 요청이 성공적으로 적용된 후 대상 리소스의 원하는 상태를 나타내는 반면, POST 요청의 콘텐츠에 있는 표현 (9.3.3절)은 대상 리소스가 처리할 정보를 나타냅니다.

응답에서 콘텐츠의 목적은 요청 메서드, 응답 상태 코드(15절) 및 해당 콘텐츠를 설명하는 응답 필드에 의해 정의됩니다. 예를 들어 GET(9.3.1절)에 대한 200 (OK) 응답의 콘텐츠는 메시지 생성 날짜(6.6.1절) 시점에 관찰된 대상 리소스의 현재 상태를 나타내는 반면, POST에 대한 동일한 상태 코드의 응답 콘텐츠는 처리 결과 또는 처리를 적용한 후 대상 리소스의 새로운 상태를 나타낼 수 있습니다.

GET에 대한 206 (부분 콘텐츠) 응답의 콘텐츠는 선택된 표현의 단일 부분 또는 해당 표현의 여러 부분을 포함하는 멀티파트 메시지 본문을 포함하며, 이는 15.3.7절에 설명되어 있습니다.

오류 상태 코드가 있는 응답 메시지는 일반적으로 오류 상태와 이를 해결하기 위해 권장되는 단계를 설명하도록 오류 조건을 나타내는 콘텐츠를 포함합니다.

HEAD 요청 메서드(9.3.2절)에 대한 응답에는 콘텐츠가 포함되지 않습니다. 관련 응답 헤더 필드는 요청 메서드가 GET(9.3.1절)이었다면 그 값이 무엇이었을지만 나타냅니다.

CONNECT 요청 메서드(9.3.6절)에 대한 2xx (성공) 응답은 콘텐츠를 갖는 대신 연결을 터널 모드로 전환합니다.

모든 1xx (정보성), 204 (콘텐츠 없음) 및 304 (수정되지 않음) 응답에는 콘텐츠가 포함되지 않습니다.

그 밖의 모든 응답에는 콘텐츠가 포함되지만, 해당 콘텐츠의 길이는 0일 수 있습니다.

6.4.2. 콘텐츠 식별

완전하거나 부분적인 표현이 메시지 콘텐츠로 전송될 때, 송신자가 제공하거나 수신자가 해당 특정 표현에 대응하는 리소스의 식별자를 결정하는 것이 바람직한 경우가 많습니다. 예를 들어 "현재 날씨 보고서" 리소스에 GET 요청을 하는 클라이언트는 반환된 콘텐츠에 특화된 식별자(예: "20210720T1711 시점의 라구나 비치 날씨 보고서")를 원할 수 있습니다. 이는 시간이 지남에 따라 표현이 변경될 것으로 예상되는 리소스의 콘텐츠를 공유하거나 북마크하는 데 유용할 수 있습니다.

요청 메시지의 경우:

  • 요청에 Content-Location 헤더 필드가 있으면, 송신자는 콘텐츠가 Content-Location 필드 값으로 식별되는 리소스의 표현이라고 주장합니다. 그러나 그러한 주장은 다른 수단(이 사양에서는 정의하지 않음)으로 검증할 수 없는 한 신뢰할 수 없습니다. 이 정보는 개정 이력 링크에는 여전히 유용할 수 있습니다.
  • 그렇지 않으면 콘텐츠는 HTTP에 의해 식별되지 않지만, 더 구체적인 식별자가 콘텐츠 자체에 제공될 수 있습니다.

응답 메시지의 경우 일치하는 항목을 찾을 때까지 다음 규칙을 순서대로 적용합니다.

  1. 요청 메서드가 HEAD이거나 응답 상태 코드가 204 (콘텐츠 없음) 또는 304 (수정되지 않음)이면 응답에 콘텐츠가 없습니다.
  2. 요청 메서드가 GET이고 응답 상태 코드가 200 (OK)이면 콘텐츠는 대상 리소스의 표현입니다(7.1절).
  3. 요청 메서드가 GET이고 응답 상태 코드가 203 (비권위 정보)이면 콘텐츠는 중개자가 제공한 대상 리소스의 잠재적으로 수정되거나 향상된 표현입니다.
  4. 요청 메서드가 GET이고 응답 상태 코드가 206 (부분 콘텐츠)이면 콘텐츠는 대상 리소스 표현의 하나 이상의 부분입니다.
  5. 응답에 Content-Location 헤더 필드가 있고 그 필드 값이 대상 URI와 동일한 URI에 대한 참조이면, 콘텐츠는 대상 리소스의 표현입니다.
  6. 응답에 Content-Location 헤더 필드가 있고 그 필드 값이 대상 URI와 다른 URI에 대한 참조이면, 송신자는 콘텐츠가 Content-Location 필드 값으로 식별된 리소스의 표현이라고 주장합니다. 그러나 그러한 주장은 다른 수단(이 사양에서는 정의하지 않음)으로 검증할 수 없는 한 신뢰할 수 없습니다.
  7. 그렇지 않으면 콘텐츠는 HTTP에 의해 식별되지 않지만, 더 구체적인 식별자가 콘텐츠 자체에 제공될 수 있습니다.

6.5. 트레일러 필드

트레일러 섹션 안에 위치한 필드(5절)를 "트레일러 필드"(구어적으로는 단순히 "트레일러")라고 합니다. 트레일러 필드는 메시지 무결성 검사, 디지털 서명, 전달 지표 또는 후처리 상태 정보를 제공하는 데 유용할 수 있습니다.

트레일러 필드는 헤더 섹션이 완료된 시점에 알려진 메시지 의미론과 모순되지 않도록 헤더 섹션의 필드와 별도로 처리하고 저장하는 것이 바람직합니다. 특정 헤더 필드의 존재 여부는 트레일러가 수신되기 전에 메시지 전체의 라우팅 또는 처리에 대한 선택에 영향을 줄 수 있습니다. 이러한 선택은 이후 트레일러 필드를 발견하더라도 되돌릴 수 없습니다.

6.5.1. 트레일러 사용 제한

트레일러 섹션은 사용 중인 HTTP 버전에서 지원되고 명시적 프레이밍 메커니즘으로 활성화된 경우에만 가능합니다. 예를 들어 HTTP/1.1의 청크 전송 코딩은 콘텐츠 뒤에 트레일러 섹션을 전송할 수 있도록 합니다( [HTTP/1.1]의 7.1.2절).

메시지 프레이밍, 라우팅, 인증, 요청 수정자, 응답 제어 또는 콘텐츠 형식을 설명하는 필드처럼 콘텐츠를 수신하기 전에 평가해야 하므로 많은 필드는 헤더 섹션 밖에서 처리할 수 없습니다. 송신자는 대응하는 헤더 필드 이름의 정의가 해당 필드를 트레일러에서 전송할 수 있도록 허용한다는 것을 알고 있지 않는 한 트레일러 필드를 MUST NOT 생성해야 합니다.

한 프로토콜 버전에서 다른 버전으로 메시지를 전달하는 중개자는 트레일러 필드를 처리하기 어려울 수 있습니다. 전송 중 전체 메시지를 버퍼링할 수 있다면 일부 중개자는 전달하기 전에 트레일러 필드를 헤더 섹션에 (적절하게) 병합할 수 있습니다. 그러나 대부분의 경우 트레일러는 단순히 버려집니다. 수신자는 대응하는 헤더 필드 정의를 이해하고 해당 정의가 트레일러 필드 값을 안전하게 병합할 수 있는 방법을 명시적으로 허용하고 정의하지 않는 한 트레일러 필드를 헤더 섹션에 MUST NOT 병합해야 합니다.

요청의 TE 헤더 필드(10.1.4절)에 "trailers" 키워드가 있으면 클라이언트가 자신과 모든 다운스트림 클라이언트를 대신하여 트레일러 필드를 수락할 의향이 있음을 나타냅니다. 중개자가 보낸 요청의 경우 이는 모든 다운스트림 클라이언트가 전달된 응답에서 트레일러 필드를 수락할 의향이 있음을 의미합니다. "trailers"가 있다고 해서 클라이언트가 응답의 특정 트레일러 필드를 처리한다는 의미는 아니며, 단지 어떤 클라이언트도 트레일러 섹션을 버리지 않는다는 의미입니다.

트레일러 필드가 전송 중 버려질 가능성이 있으므로 서버는 사용자 에이전트가 수신해야 한다고 판단하는 트레일러 필드를 SHOULD NOT 생성하는 것이 좋습니다.

6.5.2. 트레일러 필드 처리

"Trailer" 헤더 필드(6.6.2절)는 트레일러 섹션에서 전송될 가능성이 있는 필드를 나타내기 위해 전송할 수 있으며, 이를 통해 수신자는 콘텐츠를 처리하기 전에 해당 필드의 수신에 대비할 수 있습니다. 예를 들어 필드 이름이 콘텐츠를 수신하는 동안 동적 체크섬을 계산하고 트레일러 필드 값을 수신하는 즉시 검사해야 함을 나타내는 경우 유용할 수 있습니다.

헤더 필드와 마찬가지로 이름이 같은 트레일러 필드는 수신된 순서대로 처리됩니다. 동일한 이름의 여러 트레일러 필드 라인은 여러 값을 멤버 목록으로 추가하는 것과 동등한 의미론을 가집니다. 메시지 중 두 번 이상 생성될 수 있는 트레일러 필드는 각 멤버 값이 수신된 필드 라인당 한 번만 처리되더라도 목록 기반 필드로 MUST 정의되어야 합니다.

메시지 끝에서 수신자는 수신된 트레일러 필드 집합을 헤더 필드와 유사하지만 별개인 이름/값 쌍의 데이터 구조로 MAY 취급할 수 있습니다. 추가 처리 요구사항이 있다면 트레일러에서 사용하도록 의도된 필드의 필드 사양에 정의할 수 있습니다.

6.6. 메시지 메타데이터

메시지가 언제 어떻게 생성되었는지와 같이 메시지 자체를 설명하는 필드는 요청과 응답 모두에 나타날 수 있습니다.

6.6.1. Date

"Date" 헤더 필드는 메시지가 생성된 날짜와 시간을 나타내며, [RFC5322]의 3.6.1절에 정의된 Origination Date Field(orig-date)와 동일한 의미론을 가집니다. 필드 값은 5.6.7절에 정의된 HTTP-date입니다.

예시는 다음과 같습니다.

Date: Tue, 15 Nov 1994 08:12:31 GMT

Date 헤더 필드를 생성하는 송신자는 필드 값을 메시지 생성 날짜와 시간에 대한 가장 좋은 근삿값으로 SHOULD 생성해야 합니다. 이론적으로 날짜는 메시지 콘텐츠를 생성하기 직전의 시점을 나타내는 것이 바람직합니다. 실제로 송신자는 메시지 생성 중 언제든 날짜 값을 생성할 수 있습니다.

5.6.7절에 정의된 시계를 가진 오리진 서버는 모든 2xx (성공), 3xx (리디렉션) 및 4xx (클라이언트 오류) 응답에서 Date 헤더 필드를 MUST 생성해야 하며, 1xx (정보성) 및 5xx (서버 오류) 응답에서 Date 헤더 필드를 MAY 생성할 수 있습니다.

시계가 없는 오리진 서버는 Date 헤더 필드를 MUST NOT 생성해야 합니다.

시계가 있는 수신자가 Date 헤더 필드가 없는 응답 메시지를 수신한 경우 수신 시각을 MUST 기록하고 해당 메시지가 캐시되거나 다운스트림으로 전달되면 메시지의 헤더 섹션에 대응하는 Date 헤더 필드를 추가해야 합니다.

시계가 있는 수신자가 유효하지 않은 Date 헤더 필드 값을 가진 응답을 수신한 경우 해당 값을 응답이 수신된 시각으로 MAY 대체할 수 있습니다.

사용자 에이전트는 요청에 Date 헤더 필드를 MAY 전송할 수 있지만, 일반적으로 서버에 유용한 정보를 전달한다고 판단되지 않는 한 그렇게 하지 않습니다. 예를 들어 HTTP의 사용자 지정 애플리케이션은 서버가 사용자 에이전트와 서버 시계의 차이를 바탕으로 사용자의 요청 해석을 조정할 것으로 예상되는 경우 Date를 전달할 수 있습니다.

6.6.2. Trailer

"Trailer" 헤더 필드는 송신자가 해당 메시지 안에서 트레일러 필드로 전송할 것으로 예상하는 필드 이름 목록을 제공합니다. 이를 통해 수신자는 콘텐츠 처리를 시작하기 전에 표시된 메타데이터의 수신에 대비할 수 있습니다.

예를 들어 송신자는 콘텐츠가 스트리밍되는 동안 서명을 계산하고 최종 서명을 트레일러 필드로 제공할 것임을 나타낼 수 있습니다. 이를 통해 수신자는 콘텐츠를 수신하면서 동일한 검사를 즉시 수행할 수 있습니다.

메시지에서 하나 이상의 트레일러 필드를 생성하려는 송신자는 해당 메시지의 헤더 섹션에 Trailer 헤더 필드를 SHOULD 생성하여 트레일러에 어떤 필드가 있을 수 있는지 나타내야 합니다.

중개자가 전송 중 트레일러 섹션을 버리면 Trailer 필드는 어떤 메타데이터가 손실되었는지에 대한 단서를 제공할 수 있지만, Trailer 송신자가 항상 이름이 지정된 필드를 실제로 전송한다는 보장은 없습니다.

7. HTTP 메시지 라우팅

HTTP 요청 메시지 라우팅은 대상 리소스, 클라이언트의 프록시 구성 및 인바운드 연결의 설정 또는 재사용에 따라 각 클라이언트가 결정합니다. 대응하는 응답 라우팅은 동일한 연결 체인을 따라 클라이언트로 돌아갑니다.

7.1. 대상 리소스 결정

HTTP는 매우 다양한 애플리케이션에서 사용되지만 대부분의 클라이언트는 범용 웹 브라우저와 동일한 리소스 식별 메커니즘 및 구성 기법에 의존합니다. 통신 옵션이 클라이언트 구성에 하드코딩된 경우에도 그 결합된 효과를 URI 참조(4.1절)로 생각할 수 있습니다.

URI 참조는 대상 URI를 얻기 위해 절대 형식으로 해석됩니다. 프래그먼트 식별자는 클라이언트 측 처리용으로 예약되어 있으므로 대상 URI는 참조의 프래그먼트 구성요소가 있다면 이를 제외합니다([URI], 3.5절).

대상 리소스에 대한 작업을 수행하기 위해 클라이언트는 수신자가 동일한 리소스를 식별할 수 있도록 구문 분석된 대상 URI의 충분한 구성요소를 포함하는 요청 메시지를 전송합니다. 역사적인 이유로 구문 분석된 대상 URI 구성요소는 통칭하여 요청 대상이라고 하며, 메시지 제어 데이터와 Host 헤더 필드(7.2절) 안에 전송됩니다.

요청 대상 구성요소가 메서드별 형식인 특이한 경우가 두 가지 있습니다.

  • CONNECT(9.3.6절)의 경우 요청 대상은 터널 대상의 host 이름과 port 번호이며 콜론으로 구분됩니다.
  • OPTIONS(9.3.7절)의 경우 요청 대상은 단일 별표("*")일 수 있습니다.

자세한 내용은 각 메서드 정의를 참조하십시오. 이러한 형식은 다른 메서드와 함께 MUST NOT 사용해야 합니다.

클라이언트의 요청을 수신하면 서버는 로컬 구성과 수신 연결 컨텍스트에 따라 수신된 구성요소에서 대상 URI를 재구성합니다. 이 재구성은 각 주요 프로토콜 버전별로 다릅니다. 예를 들어 [HTTP/1.1]의 3.3절에서는 서버가 HTTP/1.1 요청의 대상 URI를 결정하는 방법을 정의합니다.

7.2. Host 및 :authority

요청의 "Host" 헤더 필드는 대상 URI의 host 및 port 정보를 제공하여, 오리진 서버가 여러 host 이름에 대한 요청을 처리하는 동안 리소스를 구분할 수 있게 합니다.

HTTP/2 [HTTP/2] 및 HTTP/3 [HTTP/3]에서는 Host 헤더 필드가 경우에 따라 요청 제어 데이터의 ":authority" 의사 헤더 필드로 대체됩니다.

  Host = uri-host [ ":" port ] ; 4절

대상 URI의 authority 정보는 요청 처리에 중요합니다. 사용자 에이전트는 해당 정보를 ":authority" 의사 헤더 필드로 보내지 않는 한 요청에 Host 헤더 필드를 MUST 생성해야 합니다. Host를 전송하는 사용자 에이전트는 이를 요청의 헤더 섹션에서 첫 번째 필드로 SHOULD 전송해야 합니다.

예를 들어 오리진 서버에 <http://www.example.org/pub/WWW/>에 대한 GET 요청은 다음과 같이 시작됩니다.

GET /pub/WWW/ HTTP/1.1
Host: www.example.org

host 및 port 정보는 애플리케이션 수준 라우팅 메커니즘 역할을 하므로 공유 캐시를 오염시키거나 요청을 의도하지 않은 서버로 리디렉션하려는 악성 코드의 흔한 표적이 됩니다. 가로채기 프록시가 host에 유효한 IP 주소를 가로챈 연결이 대상으로 하는지 먼저 확인하지 않고 요청을 내부 서버로 리디렉션하기 위해 host 및 port 정보에 의존하거나, 공유 캐시의 캐시 키로 사용하는 경우 특히 취약합니다.

7.3. 인바운드 요청 라우팅

대상 URI와 오리진이 결정되면 클라이언트는 원하는 의미론을 달성하기 위해 네트워크 요청이 필요한지, 필요하다면 해당 요청을 어디로 보낼지 결정합니다.

7.3.1. 캐시로

클라이언트에 캐시 [CACHING]가 있고 요청을 캐시가 충족할 수 있다면 일반적으로 요청은 먼저 해당 캐시로 전달됩니다.

7.3.2. 프록시로

요청이 캐시로 충족되지 않으면 일반적인 클라이언트는 요청을 충족하기 위해 프록시를 사용할지 결정하도록 구성을 확인합니다. 프록시 구성은 구현에 따라 다르지만, URI 접두사 일치, 선택적 authority 일치 또는 둘 모두를 기반으로 하는 경우가 많으며, 프록시 자체는 일반적으로 "http" 또는 "https" URI로 식별됩니다.

"http" 또는 "https" 프록시가 적용되는 경우 클라이언트는 해당 프록시에 대한 연결을 설정(또는 재사용)하여 인바운드로 연결한 다음 클라이언트의 대상 URI와 일치하는 요청 대상을 포함하는 HTTP 요청 메시지를 전송합니다.

7.3.3. 오리진으로

적용 가능한 프록시가 없으면 일반적인 클라이언트는 식별된 리소스에 접근하기 위해 (대상 URI의 스킴에 특정한) 처리 루틴을 호출합니다. 이 작업의 수행 방식은 대상 URI 스킴에 따라 달라지며 관련 사양에서 정의됩니다.

4.3.2절에서는 식별된 오리진 서버에 인바운드 연결을 설정(또는 재사용)하고 클라이언트의 대상 URI와 일치하는 요청 대상을 포함하는 HTTP 요청 메시지를 전송하여 "http" 리소스에 접근하는 방법을 정의합니다.

4.3.3절에서는 식별된 오리진에 권한이 있는 오리진 서버에 인바운드 보호 연결을 설정(또는 재사용)하고, 클라이언트의 대상 URI와 일치하는 요청 대상을 포함하는 HTTP 요청 메시지를 전송하여 "https" 리소스에 접근하는 방법을 정의합니다.

7.4. 잘못 전달된 요청 거부

서버가 요청을 수신하고 대상 URI를 결정할 수 있을 정도로 구문 분석하면, 서버는 요청을 직접 처리할지, 다른 서버로 전달할지, 클라이언트를 다른 리소스로 리디렉션할지, 오류로 응답할지 또는 연결을 끊을지 결정합니다. 이 결정은 요청이나 연결 컨텍스트에 관한 어떤 요소의 영향도 받을 수 있지만, 특히 서버가 해당 대상 URI에 대한 요청을 처리하도록 구성되었는지와 연결 컨텍스트가 해당 요청에 적합한지를 대상으로 합니다.

예를 들어 요청이 의도적으로 또는 실수로 잘못 전달되어 수신된 Host 헤더 필드의 정보가 연결의 host 또는 port와 다를 수 있습니다. 연결이 신뢰할 수 있는 게이트웨이에서 온 경우 이러한 불일치가 예상될 수 있지만, 그렇지 않으면 보안 필터를 우회하거나, 서버를 속여 비공개 콘텐츠를 전달하게 하거나, 캐시를 오염시키려는 시도를 나타낼 수 있습니다. 메시지 라우팅과 관련된 보안 고려사항은 17절을 참조하십시오.

연결이 신뢰할 수 있는 게이트웨이에서 온 경우를 제외하고, 대상 URI에 대한 스킴별 요구사항이 충족되지 않으면 오리진 서버는 요청을 MUST 거부해야 합니다. 특히 "https" 리소스에 대한 요청은 4.2.2절에 정의된 대로 해당 대상 URI의 오리진에 유효한 인증서를 통해 보호된 연결로 수신되지 않은 경우 MUST 거부되어야 합니다.

응답의 421 (잘못 전달된 요청) 상태 코드는 요청이 잘못 전달된 것으로 보여 오리진 서버가 이를 거부했음을 나타냅니다(15.5.20절).

7.5. 응답 상관관계

하나의 연결을 여러 요청/응답 교환에 사용할 수 있습니다. 요청과 응답 메시지를 상관시키는 데 사용하는 메커니즘은 버전에 따라 다릅니다. 일부 HTTP 버전은 메시지의 암시적 순서를 사용하고 다른 버전은 명시적 식별자를 사용합니다.

상태 코드와 관계없이(임시 응답 포함) 모든 응답은 요청이 수신된 후 언제든 전송될 수 있으며, 요청이 아직 완료되지 않은 경우도 포함됩니다. 응답은 대응하는 요청이 완료되기 전에 완료될 수 있습니다(6.1절). 마찬가지로 클라이언트는 응답을 위해 특정 시간만큼 기다릴 것으로 예상되지 않습니다. 클라이언트(중개자 포함)는 합리적인 시간 내에 응답을 받지 못하면 요청을 포기할 수 있습니다.

관련 요청을 아직 전송하는 동안 응답을 수신한 클라이언트는 명시적으로 반대 지시를 받지 않는 한 해당 요청을 계속 전송하는 것이 SHOULD 요구됩니다(예: [HTTP/1.1]의 9.5절 및 [HTTP/2]의 6.4절 참조).

7.6. 메시지 전달

3.7절에 설명된 대로 중개자는 HTTP 요청과 응답의 처리에서 다양한 역할을 할 수 있습니다. 일부 중개자는 성능이나 가용성을 개선하는 데 사용됩니다. 다른 중개자는 접근 제어나 콘텐츠 필터링에 사용됩니다. HTTP 스트림에는 파이프 앤 필터 아키텍처와 유사한 특성이 있으므로, 중개자가 스트림의 어느 방향을 향상(또는 방해)할 수 있는 범위에는 본질적인 제한이 없습니다.

중개자는 프로토콜 요소를 인식하지 못하더라도 (예: 새로운 메서드, 상태 코드 또는 필드 이름) 메시지를 전달할 것으로 예상됩니다. 그래야 다운스트림 수신자의 확장성이 유지되기 때문입니다.

터널 역할을 하지 않는 중개자는 Connection 헤더 필드를 7.6.1절에 명시된 대로 MUST 구현하고, 수신 연결만을 대상으로 하는 필드는 전달에서 제외해야 합니다.

중개자는 무한 요청 루프로부터 보호되지 않는 한 메시지를 자기 자신에게 MUST NOT 전달해야 합니다. 일반적으로 중개자는 별칭, 로컬 변형 또는 리터럴 IP 주소를 포함한 자체 서버 이름을 인식하고 그러한 요청에 직접 응답하는 것이 바람직합니다.

HTTP 메시지는 점진적 처리 또는 다운스트림 전달을 위해 스트림으로 구문 분석할 수 있습니다. 그러나 일부 구현은 네트워크 효율성, 보안 검사 또는 콘텐츠 변환을 위해 메시지 전달을 버퍼링하거나 지연하므로 송신자와 수신자는 부분 메시지의 점진적 전달에 의존할 수 없습니다.

7.6.1. Connection

"Connection" 헤더 필드를 사용하면 송신자가 현재 연결에 원하는 제어 옵션을 나열할 수 있습니다.

연결 옵션은 대소문자를 구분하지 않습니다.

Connection 이외의 필드가 현재 연결을 위한 또는 현재 연결에 관한 제어 정보를 제공하는 데 사용되는 경우, 송신자는 대응하는 필드 이름을 Connection 헤더 필드 안에 MUST 나열해야 합니다. 일부 HTTP 버전은 그러한 정보에 필드를 사용하는 것을 금지하므로 Connection 필드를 허용하지 않는다는 점에 유의하십시오.

중개자는 메시지를 전달하기 전에 수신된 Connection 헤더 필드를 MUST 구문 분석하고, 이 필드의 각 connection-option에 대해 connection-option과 동일한 이름을 가진 모든 헤더 또는 트레일러 필드를 메시지에서 제거한 다음 Connection 헤더 필드 자체를 제거해야 합니다(또는 전달된 메시지에 대한 중개자 자체의 제어 옵션으로 대체해야 합니다).

따라서 Connection 헤더 필드는 즉시 수신자만을 대상으로 하는 필드("홉별")와 체인의 모든 수신자를 대상으로 하는 필드("종단 간")를 구분하는 선언적 방법을 제공하여 메시지가 자기 기술적이도록 하고 향후 연결별 확장이 이전 중개자에 의해 무분별하게 전달될 우려 없이 배포될 수 있도록 합니다.

또한 중개자는 해당 필드의 의미론을 적용한 후 connection-option으로 나타나는지 여부와 관계없이 전달 전에 제거해야 하는 것으로 알려진 필드를 SHOULD 제거하거나 대체해야 합니다. 여기에는 다음이 포함되지만 이에 한정되지는 않습니다.

송신자는 콘텐츠의 모든 수신자를 대상으로 하는 필드에 대응하는 연결 옵션을 MUST NOT 전송해야 합니다. 예를 들어 Cache-Control은 연결 옵션으로 절대 적절하지 않습니다([CACHING]의 5.2절).

연결 옵션은 메시지에 존재하는 필드와 항상 대응하지는 않습니다. 연결 옵션과 관련된 매개변수가 없으면 연결별 필드가 필요하지 않을 수 있기 때문입니다. 반대로 대응하는 연결 옵션 없이 수신된 연결별 필드는 일반적으로 중개자가 필드를 부적절하게 전달했음을 나타내며 수신자는 이를 무시하는 것이 바람직합니다.

필드에 대응하지 않는 새로운 연결 옵션을 정의할 때 사양 작성자는 나중의 충돌을 피하기 위해 대응하는 필드 이름을 미리 예약하는 것이 바람직합니다. 이러한 예약된 필드 이름은 "Hypertext Transfer Protocol (HTTP) Field Name Registry"(16.3.1절)에 등록됩니다.

7.6.2. Max-Forwards

"Max-Forwards" 헤더 필드는 TRACE(9.3.8절) 및 OPTIONS(9.3.7절) 요청 메서드와 함께 요청이 프록시에 의해 전달될 수 있는 횟수를 제한하는 메커니즘을 제공합니다. 이는 클라이언트가 체인 중간에서 실패하거나 루프하는 것으로 보이는 요청을 추적하려고 할 때 유용할 수 있습니다.

Max-Forwards 값은 이 요청 메시지를 앞으로 전달할 수 있는 남은 횟수를 나타내는 십진 정수입니다.

Max-Forwards 헤더 필드를 포함하는 TRACE 또는 OPTIONS 요청을 수신한 각 중개자는 요청을 전달하기 전에 그 값을 확인하고 갱신하도록 MUST 해야 합니다. 수신된 값이 0이면 중개자는 요청을 전달하지 MUST NOT 해야 하며, 대신 중개자가 최종 수신자로서 MUST 응답해야 합니다. 수신된 Max-Forwards 값이 0보다 크면 중개자는 전달된 메시지에 갱신된 Max-Forwards 필드를 MUST 생성해야 하며, 그 필드 값은 a) 수신된 값을 1만큼 감소시킨 값 또는 b) 수신자가 지원하는 Max-Forwards의 최대값 중 더 작은 값이어야 합니다.

수신자는 다른 요청 메서드와 함께 수신된 Max-Forwards 헤더 필드를 MAY 무시할 수 있습니다.

7.6.3. Via

"Via" 헤더 필드는 요청의 경우 사용자 에이전트와 서버 사이, 응답의 경우 오리진 서버와 클라이언트 사이에 존재하는 중간 프로토콜 및 수신자를 나타내며, 이메일의 "Received" 헤더 필드( [RFC5322]의 3.6.7절)와 유사합니다. Via는 메시지 전달을 추적하고, 요청 루프를 방지하며, 요청/응답 체인에 있는 송신자의 프로토콜 기능을 식별하는 데 사용할 수 있습니다.

Via 필드 값의 각 멤버는 메시지를 전달한 프록시 또는 게이트웨이를 나타냅니다. 각 중개자는 메시지를 수신한 방법에 대한 자체 정보를 추가하므로 최종 결과는 전달 수신자의 순서에 따라 정렬됩니다.

프록시는 아래에 설명된 대로 자신이 전달하는 각 메시지에 적절한 Via 헤더 필드를 MUST 전송해야 합니다. HTTP-to-HTTP 게이트웨이는 각 인바운드 요청 메시지에 적절한 Via 헤더 필드를 MUST 전송해야 하며, 전달된 응답 메시지에는 Via 헤더 필드를 MAY 전송할 수 있습니다.

각 중개자에 대해 received-protocol은 메시지의 업스트림 송신자가 사용한 프로토콜과 프로토콜 버전을 나타냅니다. 따라서 Via 필드 값은 요청/응답 체인의 알려진 프로토콜 기능을 기록하여 다운스트림 수신자가 계속 볼 수 있게 합니다. 이는 응답이나 이후 요청에서 어떤 하위 비호환 기능을 안전하게 사용할 수 있는지 결정하는 데 유용할 수 있으며, 2.5절에 설명되어 있습니다. 간결성을 위해 수신 프로토콜이 HTTP인 경우 protocol-name은 생략됩니다.

received-by 부분은 일반적으로 이후 메시지를 전달한 수신 서버 또는 클라이언트의 host 및 선택적 port 번호입니다. 그러나 실제 host가 민감한 정보로 간주되면 송신자는 이를 가명으로 MAY 대체할 수 있습니다. port가 제공되지 않은 경우 수신자는 received-protocol에 기본 port가 있다면 해당 기본 port에서 수신된 것으로 MAY 해석할 수 있습니다.

송신자는 User-Agent 및 Server 헤더 필드와 유사하게 각 수신자의 소프트웨어를 식별하는 주석을 MAY 생성할 수 있습니다. 그러나 Via의 주석은 선택적이며, 수신자는 메시지를 전달하기 전에 이를 MAY 제거할 수 있습니다.

예를 들어 HTTP/1.0 사용자 에이전트에서 코드명 "fred"인 내부 프록시로 요청 메시지가 전송되고, 이 프록시는 HTTP/1.1을 사용하여 p.example.net의 공용 프록시로 요청을 전달하며, 해당 프록시는 요청을 www.example.com의 오리진 서버로 전달하여 완료할 수 있습니다. 그러면 www.example.com이 수신한 요청에는 다음 Via 헤더 필드가 있습니다.

Via: 1.0 fred, 1.1 p.example.net

네트워크 방화벽을 통과하는 포털로 사용되는 중개자는 명시적으로 허용되지 않는 한 방화벽 영역 안의 host 이름과 port를 전달하지 않는 것이 SHOULD NOT 요구됩니다. 허용되지 않은 경우 그러한 중개자는 방화벽 뒤에 있는 host의 각 received-by host를 해당 host에 적절한 가명으로 SHOULD 대체해야 합니다.

중개자는 항목의 received-protocol 값이 동일한 경우 Via 헤더 필드 목록 멤버의 순서 있는 하위 시퀀스를 하나의 멤버로 MAY 결합할 수 있습니다. 예:

Via: 1.0 ricky, 1.1 ethel, 1.1 fred, 1.0 lucy

다음과 같이 축약할 수 있습니다.

Via: 1.0 ricky, 1.1 mertz, 1.0 lucy

송신자는 모든 멤버가 동일한 조직의 통제하에 있고 host가 이미 가명으로 대체된 경우가 아니면 여러 목록 멤버를 SHOULD NOT 결합해야 합니다. 송신자는 서로 다른 received-protocol 값을 가진 멤버를 MUST NOT 결합해야 합니다.

7.7. 메시지 변환

일부 중개자에는 메시지와 콘텐츠를 변환하는 기능이 포함되어 있습니다. 예를 들어 프록시는 캐시 공간을 절약하거나 느린 링크의 트래픽 양을 줄이기 위해 이미지 형식 사이를 변환할 수 있습니다. 그러나 이러한 변환이 의료 영상이나 과학 데이터 분석과 같은 중요한 애플리케이션을 위한 콘텐츠에 적용될 때, 특히 수신된 콘텐츠가 원본과 동일한지 확인하기 위해 무결성 검사나 디지털 서명을 사용하는 경우 운영 문제가 발생할 수 있습니다.

HTTP-to-HTTP 프록시가 의미론적으로 중요한 방식으로 메시지를 수정하도록 설계되거나 구성된 경우 변환 프록시라고 합니다(즉, 일반적인 HTTP 처리에 필요한 변경을 넘어 원래 송신자에게 중요하거나 다운스트림 수신자에게 잠재적으로 중요한 방식으로 메시지를 변경하는 수정). 예를 들어 변환 프록시는 공유 주석 서버(로컬 주석 데이터베이스에 대한 참조를 포함하도록 응답을 수정함), 악성 코드 필터, 형식 트랜스코더 또는 개인정보 보호 필터 역할을 할 수 있습니다. 이러한 변환은 프록시를 선택한 클라이언트(또는 클라이언트 조직)가 원하는 것으로 간주됩니다.

프록시가 정규화된 도메인 이름이 아닌 host 이름을 가진 대상 URI를 수신하면 요청을 전달할 때 수신한 host 이름에 자체 도메인을 MAY 추가할 수 있습니다. 대상 URI에 정규화된 도메인 이름이 포함된 경우 프록시는 host 이름을 MUST NOT 변경해야 합니다.

프록시는 전달 프로토콜에서 요구하는 경우를 제외하고 수신된 대상 URI를 다음 인바운드 서버로 전달할 때 "absolute-path" 및 "query" 부분을 MUST NOT 수정해야 합니다. 예를 들어 HTTP/1.1을 통해 오리진 서버로 요청을 전달하는 프록시는 빈 경로를 "/"([HTTP/1.1]의 3.2.1절) 또는 "*"([HTTP/1.1]의 3.2.4절)로 요청 메서드에 따라 대체합니다.

프록시는 no-transform 캐시 지시어( [CACHING]의 5.2.2.6절)가 포함된 응답 메시지의 콘텐츠(6.4절)를 MUST NOT 변환해야 합니다. 이는 전송 코딩의 추가 또는 제거([HTTP/1.1]의 7절)와 같이 콘텐츠를 변경하지 않는 메시지 변환에는 적용되지 않는다는 점에 유의하십시오.

프록시는 no-transform 캐시 지시어를 포함하지 않는 메시지의 콘텐츠를 MAY 변환할 수 있습니다. 200 (OK) 응답의 콘텐츠를 변환하는 프록시는 응답 상태 코드를 203 (비권위 정보)(15.3.4절)로 변경하여 변환이 적용되었음을 다운스트림 수신자에게 알릴 수 있습니다.

프록시는 필드의 정의가 그러한 수정을 명시적으로 허용하거나 개인정보 보호 또는 보안을 위해 수정이 필요하다고 판단되는 경우를 제외하고, 통신 체인의 끝점, 리소스 상태 또는 선택된 표현(콘텐츠 제외)에 관한 정보를 제공하는 헤더 필드를 SHOULD NOT 수정해야 합니다.

7.8. Upgrade

"Upgrade" 헤더 필드는 동일한 연결에서 HTTP/1.1에서 다른 프로토콜로 전환하기 위한 간단한 메커니즘을 제공하도록 의도되었습니다.

클라이언트는 최종 응답을 보내기 전에 서버가 이름이 지정된 하나 이상의 프로토콜로 전환하도록 요청하기 위해 요청의 Upgrade 헤더 필드에 선호도 내림차순으로 프로토콜 이름 목록을 MAY 전송할 수 있습니다. 서버는 해당 연결에서 현재 프로토콜을 계속 사용하려는 경우 수신된 Upgrade 헤더 필드를 MAY 무시할 수 있습니다. Upgrade를 사용하여 프로토콜 변경을 강제할 수는 없습니다.

프로토콜 이름은 선호되는 대소문자 형식으로 등록되지만, 수신자는 각 protocol-name을 지원되는 프로토콜과 일치시킬 때 대소문자를 구분하지 않는 비교를 SHOULD 사용해야 합니다.

101 (프로토콜 전환) 응답을 전송하는 서버는 연결이 전환될 새로운 프로토콜을 나타내기 위해 Upgrade 헤더 필드를 MUST 전송해야 합니다. 여러 프로토콜 계층이 전환되는 경우 송신자는 프로토콜을 계층 오름차순으로 MUST 나열해야 합니다. 서버는 대응하는 요청의 Upgrade 헤더 필드에서 클라이언트가 나타내지 않은 프로토콜로 MUST NOT 전환해야 합니다. 서버는 클라이언트가 나타낸 선호 순서를 MAY 무시하고 요청의 성격이나 서버의 현재 부하 등 다른 요소를 기반으로 새 프로토콜을 선택할 수 있습니다.

426 (업그레이드 필요) 응답을 전송하는 서버는 허용 가능한 프로토콜을 선호도 내림차순으로 나타내기 위해 Upgrade 헤더 필드를 MUST 전송해야 합니다.

서버는 향후 요청에 적절한 경우 나열된 프로토콜로 업그레이드하는 기능을 지원한다고 알리기 위해 다른 모든 응답에서 선호도 내림차순으로 Upgrade 헤더 필드를 MAY 전송할 수 있습니다.

다음은 클라이언트가 전송한 가상의 예입니다.

GET /hello HTTP/1.1
Host: www.example.com
Connection: upgrade
Upgrade: websocket, IRC/6.9, RTA/x11

프로토콜 변경 후 애플리케이션 수준 통신의 기능과 성격은 선택된 새 프로토콜에 전적으로 의존합니다. 그러나 101 (프로토콜 전환) 응답을 전송한 직후 서버는 새 프로토콜 내에서 이에 해당하는 요청을 수신한 것처럼 원래 요청에 계속 응답할 것으로 예상됩니다(즉, 프로토콜이 변경된 후에도 서버에는 충족해야 할 미처리 요청이 남아 있으며, 요청을 반복하도록 요구하지 않고 이를 수행할 것으로 예상됩니다).

예를 들어 GET 요청에서 Upgrade 헤더 필드를 수신하고 서버가 프로토콜을 전환하기로 결정한 경우, 먼저 HTTP/1.1에서 101 (프로토콜 전환) 메시지로 응답한 다음 즉시 대상 리소스에 대한 GET 응답에 해당하는 새 프로토콜의 메시지를 이어서 전송합니다. 이를 통해 추가 왕복 지연 없이 연결을 HTTP와 동일한 의미론을 가진 프로토콜로 업그레이드할 수 있습니다. 수신된 메시지 의미론을 새 프로토콜이 준수할 수 없는 한 서버는 프로토콜을 MUST NOT 전환해야 합니다. OPTIONS 요청은 모든 프로토콜이 준수할 수 있습니다.

다음은 위 가상 요청에 대한 응답 예입니다.

HTTP/1.1 101 Switching Protocols
Connection: upgrade
Upgrade: websocket

[... 적절한 응답과 함께 데이터 스트림이 websocket으로 전환됨
(새 프로토콜에서 정의됨) "GET /hello" 요청에 대한 ...]

Upgrade 송신자는 중개자에게 이 필드를 전달하지 않도록 알리기 위해 Connection 헤더 필드(7.6.1절)에 "Upgrade" 연결 옵션도 MUST 전송해야 합니다. HTTP/1.0 요청에서 Upgrade 헤더 필드를 수신한 서버는 해당 Upgrade 필드를 MUST 무시해야 합니다.

클라이언트는 요청 메시지를 완전히 전송할 때까지 연결에서 업그레이드된 프로토콜을 사용할 수 없습니다(즉, 클라이언트는 메시지를 보내는 도중 프로토콜을 변경할 수 없습니다). 서버가 Upgrade 및 "100-continue" 기대(10.1.1절)를 가진 Expect 헤더 필드를 모두 수신하면, 서버는 101 (프로토콜 전환) 응답을 전송하기 전에 100 (계속) 응답을 MUST 전송해야 합니다.

Upgrade 헤더 필드는 기존 연결 위의 프로토콜 전환에만 적용됩니다. 기본 연결(전송) 프로토콜을 전환하거나 기존 통신을 다른 연결로 전환하는 데 사용할 수 없습니다. 이러한 목적에는 3xx (리디렉션) 응답(15.4절)을 사용하는 것이 더 적절합니다.

이 사양은 2.5절의 HTTP 버전 규칙과 이 사양의 향후 업데이트에서 정의된 하이퍼텍스트 전송 프로토콜 계열이 사용할 프로토콜 이름 "HTTP"만 정의합니다. 추가 프로토콜 이름은 16.7절에 정의된 등록 절차를 사용하여 등록하는 것이 바람직합니다.

8. 표현 데이터 및 메타데이터

8.1. 표현 데이터

HTTP 메시지와 관련된 표현 데이터는 메시지의 콘텐츠로 제공되거나 메시지 의미론 및 대상 URI에 의해 참조됩니다. 표현 데이터는 표현 메타데이터 헤더 필드로 정의된 형식과 인코딩을 따릅니다.

표현 데이터의 데이터 유형은 Content-Type 및 Content-Encoding 헤더 필드를 통해 결정됩니다. 이들은 2계층의 순서가 있는 인코딩 모델을 정의합니다.

  representation-data := Content-Encoding( Content-Type( data ) )

8.2. 표현 메타데이터

표현 헤더 필드는 표현에 관한 메타데이터를 제공합니다. 메시지에 콘텐츠가 포함되어 있으면 표현 헤더 필드는 해당 데이터를 해석하는 방법을 설명합니다. HEAD 요청에 대한 응답에서 표현 헤더 필드는 동일한 요청이 GET이었다면 콘텐츠에 포함되었을 표현 데이터를 설명합니다.

8.3. Content-Type

"Content-Type" 헤더 필드는 관련 표현의 미디어 유형을 나타냅니다. 이는 메시지 콘텐츠에 포함된 표현 또는 메시지 의미론에 따라 결정되는 선택된 표현입니다. 표시된 미디어 유형은 데이터 형식과 Content-Encoding으로 표시된 콘텐츠 코딩을 디코딩한 후 수신된 메시지 의미론의 범위 내에서 수신자가 해당 데이터를 처리하도록 의도된 방법을 모두 정의합니다.

미디어 유형은 8.3.1절에 정의되어 있습니다. 필드의 예는 다음과 같습니다.

Content-Type: text/html; charset=ISO-8859-4

콘텐츠를 포함하는 메시지를 생성하는 송신자는 포함된 표현의 의도된 미디어 유형을 알 수 없는 경우가 아니라면 해당 메시지에 Content-Type 헤더 필드를 SHOULD 생성해야 합니다. Content-Type 헤더 필드가 없으면 수신자는 "application/octet-stream"([RFC2046], 4.5.1절)의 미디어 유형을 가정하거나 데이터를 검사하여 유형을 결정할 MAY 수 있습니다.

실제로 리소스 소유자가 주어진 표현에 올바른 Content-Type을 제공하도록 오리진 서버를 항상 올바르게 구성하는 것은 아닙니다. 일부 사용자 에이전트는 콘텐츠를 검사하고 특정 경우 수신된 유형을 재정의합니다(예: [Sniffing] 참조). 이러한 "MIME 스니핑"은 데이터에 대해 잘못된 결론을 내릴 위험이 있으며, 이로 인해 사용자가 추가적인 보안 위험(예: "권한 상승")에 노출될 수 있습니다. 또한 서로 다른 미디어 유형이 공통 데이터 형식을 공유하고 데이터가 처리되도록 의도된 방식만 다른 경우가 많으므로 데이터만 검사해서는 구별할 수 없습니다. 스니핑을 구현하는 경우 구현자는 사용자가 이를 비활성화할 수 있는 수단을 제공하는 것이 권장됩니다.

Content-Type은 싱글턴 필드로 정의되지만, 때때로 잘못하여 여러 번 생성되어 목록처럼 보이는 결합된 필드 값이 만들어집니다. 수신자는 목록에서 구문상 유효한 마지막 멤버를 사용하여 이 오류를 처리하려는 경우가 많으며, 서로 다른 구현의 오류 처리 동작이 다르면 잠재적인 상호운용성 및 보안 문제가 발생할 수 있습니다.

8.3.1. 미디어 유형

HTTP는 개방적이고 확장 가능한 데이터 타이핑 및 유형 협상을 제공하기 위해 Content-Type(8.3절) 및 Accept(12.5.1절) 헤더 필드에서 미디어 유형 [RFC2046]을 사용합니다. 미디어 유형은 데이터 형식과 메시지 컨텍스트에 따라 해당 데이터를 처리하는 방법을 나타내는 다양한 처리 모델을 모두 정의합니다.

type 및 subtype 토큰은 대소문자를 구분하지 않습니다.

type/subtype 뒤에는 이름/값 쌍 형식의 세미콜론으로 구분된 매개변수(5.6.6절)가 MAY 올 수 있습니다. 매개변수의 존재 여부는 미디어 유형 레지스트리 내 정의에 따라 미디어 유형 처리에 중요할 수 있습니다. 매개변수 값은 매개변수 이름의 의미론에 따라 대소문자를 구분할 수도 있고 구분하지 않을 수도 있습니다.

예를 들어 다음 미디어 유형들은 UTF-8 문자 인코딩 체계로 인코딩된 HTML 텍스트 데이터를 설명하는 데 동등하지만, 일관성을 위해 첫 번째 형식이 선호됩니다 ("charset" 매개변수 값은 [RFC2046], 4.1.2절에서 대소문자를 구분하지 않는 것으로 정의됨).

  text/html;charset=utf-8
  Text/HTML;Charset="utf-8"
  text/html; charset="utf-8"
  text/html;charset=UTF-8

미디어 유형은 [BCP13]에 정의된 절차에 따라 IANA에 등록하는 것이 바람직합니다.

8.3.2. 문자 집합

HTTP는 텍스트 표현의 문자 인코딩 체계([RFC6365], 2절)를 나타내거나 협상하기 위해 charset 이름을 사용합니다. 이 문서에서 정의하는 필드에서 charset 이름은 매개변수(Content-Type)에 나타나거나, Accept-Encoding의 경우 일반 token 형식으로 나타납니다. 두 경우 모두 charset 이름은 대소문자를 구분하지 않고 비교됩니다.

Charset 이름은 [RFC2978]의 2절에 정의된 절차에 따라 IANA "Character Sets" 레지스트리(https://www.iana.org/assignments/character-sets)에 등록하는 것이 바람직합니다.

8.3.3. 멀티파트 유형

MIME은 여러 "multipart" 유형, 즉 하나의 메시지 본문 안에 하나 이상의 표현을 캡슐화하는 유형을 제공합니다. 모든 멀티파트 유형은 [RFC2046]의 5.1.1절에 정의된 공통 구문을 공유하고, 미디어 유형 값의 일부로 boundary 매개변수를 포함합니다. 메시지 본문 자체가 프로토콜 요소이므로 송신자는 본문 부분 사이의 줄 바꿈을 나타내는 데 CRLF만 MUST 생성해야 합니다.

HTTP 메시지 프레이밍은 멀티파트 boundary를 메시지 본문 길이의 표시로 사용하지 않지만, 콘텐츠를 생성하거나 처리하는 구현에서 사용할 수 있습니다. 예를 들어 "multipart/form-data" 유형은 [RFC7578]에 설명된 대로 요청에서 양식 데이터를 전달하는 데 자주 사용되며, "multipart/byteranges" 유형은 이 사양에서 일부 206 (부분 콘텐츠) 응답에 사용하도록 정의됩니다(15.3.7절 참조).

8.4. Content-Encoding

"Content-Encoding" 헤더 필드는 미디어 유형에 내재된 코딩 외에 어떤 콘텐츠 코딩이 표현에 적용되었는지, 따라서 Content-Type 헤더 필드가 참조하는 미디어 유형의 데이터를 얻기 위해 어떤 디코딩 메커니즘을 적용해야 하는지를 나타냅니다. Content-Encoding은 기본 미디어 유형의 식별성을 잃지 않고 표현 데이터를 압축할 수 있도록 하는 데 주로 사용됩니다.

사용 예는 다음과 같습니다.

Content-Encoding: gzip

표현에 하나 이상의 인코딩이 적용되었다면 해당 인코딩을 적용한 송신자는 콘텐츠 코딩을 적용된 순서대로 나열하는 Content-Encoding 헤더 필드를 MUST 생성해야 합니다. "identity"라는 코딩은 Accept-Encoding에서 특별한 역할을 위해 예약되어 있으므로 포함하지 않는 것이 SHOULD NOT 요구됩니다.

인코딩 매개변수에 관한 추가 정보는 이 사양에서 정의하지 않은 다른 헤더 필드로 제공할 수 있습니다.

Transfer-Encoding( [HTTP/1.1]의 6.1절)과 달리 Content-Encoding에 나열된 코딩은 표현의 특성입니다. 표현은 코딩된 형식을 기준으로 정의되며, 메타데이터 정의에서 달리 명시하지 않는 한 표현에 관한 다른 모든 메타데이터도 코딩된 형식에 관한 것입니다. 일반적으로 표현은 렌더링 또는 이와 유사한 용도로 사용하기 직전에만 디코딩됩니다.

미디어 유형에 항상 압축되는 데이터 형식과 같은 내재적 인코딩이 포함되어 있다면, 해당 인코딩이 콘텐츠 코딩 중 하나와 동일한 알고리즘이더라도 Content-Encoding에서 다시 명시하지 않습니다. 그러한 콘텐츠 코딩은 어떤 특이한 이유로 표현을 만들기 위해 두 번째로 적용되는 경우에만 나열됩니다. 마찬가지로 오리진 서버는 일부 사용자 에이전트가 각 응답을 처리할 때 다르게 동작하기 때문에 (예: 자동 압축 해제 및 콘텐츠 렌더링 대신 "다른 이름으로 저장..." 대화 상자를 열기) 동일한 데이터를 Content-Type의 일부로 코딩이 정의되었는지 또는 Content-Encoding으로 정의되었는지만 다른 여러 표현으로 게시할 수 있습니다.

요청 메시지의 표현에 허용되지 않는 콘텐츠 코딩이 있으면 오리진 서버는 415 (지원되지 않는 미디어 유형) 상태 코드로 MAY 응답할 수 있습니다.

8.4.1. 콘텐츠 코딩

콘텐츠 코딩 값은 표현에 적용되었거나 적용될 수 있는 인코딩 변환을 나타냅니다. 콘텐츠 코딩은 기본 미디어 유형의 식별성과 정보를 잃지 않으면서 표현을 압축하거나 다른 유용한 방식으로 변환할 수 있도록 하는 데 주로 사용됩니다. 흔히 표현은 코딩된 형식으로 저장되고 직접 전송된 다음 최종 수신자에 의해서만 디코딩됩니다.

모든 콘텐츠 코딩은 대소문자를 구분하지 않으며 16.6절에 설명된 대로 "HTTP Content Coding Registry"에 등록하는 것이 바람직합니다.

Content-coding 값은 Accept-Encoding(12.5.3절) 및 Content-Encoding(8.4절) 헤더 필드에서 사용됩니다.

8.4.1.1. Compress 코딩

"compress" 코딩은 UNIX 파일 압축 프로그램 "compress"가 일반적으로 생성하는 적응형 Lempel-Ziv-Welch(LZW) 코딩 [Welch]입니다. 수신자는 "x-compress"를 "compress"와 동등한 것으로 SHOULD 간주해야 합니다.

8.4.1.2. Deflate 코딩

"deflate" 코딩은 Lempel-Ziv(LZ77) 압축 알고리즘과 Huffman 코딩의 조합을 사용하는 "deflate" 압축 데이터 스트림 [RFC1951]을 포함하는 "zlib" 데이터 형식 [RFC1950]입니다.

8.4.1.3. Gzip 코딩

"gzip" 코딩은 gzip 파일 압축 프로그램이 일반적으로 생성하는 32비트 순환 중복 검사(CRC)를 사용하는 LZ77 코딩 [RFC1952]입니다. 수신자는 "x-gzip"을 "gzip"과 동등한 것으로 SHOULD 간주해야 합니다.

8.5. Content-Language

"Content-Language" 헤더 필드는 표현이 대상으로 하는 독자의 자연어를 설명합니다. 이는 표현 내에서 사용되는 모든 언어와 일치하지 않을 수 있습니다.

언어 태그는 8.5.1절에 정의되어 있습니다. Content-Language의 주된 목적은 사용자가 자신이 선호하는 언어에 따라 표현을 식별하고 구별할 수 있도록 하는 것입니다. 따라서 콘텐츠가 덴마크어를 읽을 수 있는 독자만을 대상으로 한다면 적절한 필드는

Content-Language: da

Content-Language가 지정되지 않은 경우 기본값은 콘텐츠가 모든 언어 독자를 대상으로 한다는 것입니다. 이는 송신자가 이를 특정 자연어에 특화된 것으로 간주하지 않거나, 어떤 언어를 대상으로 하는지 송신자가 알지 못한다는 의미일 수 있습니다.

여러 독자를 대상으로 하는 콘텐츠에는 여러 언어를 MAY 나열할 수 있습니다. 예를 들어 "와이탕이 조약"을 원래 마오리어와 영어 버전으로 동시에 제시한 경우에는 다음이 필요합니다.

Content-Language: mi, en

그러나 표현 안에 여러 언어가 있다고 해서 여러 언어권 독자를 대상으로 한다는 의미는 아닙니다. 예를 들어 "라틴어 첫 수업"과 같은 초급 언어 교재는 명백히 영어를 읽을 수 있는 독자가 사용하도록 의도되어 있습니다. 이 경우 Content-Language에는 "en"만 포함하는 것이 적절합니다.

Content-Language는 모든 미디어 유형에 MAY 적용할 수 있으며, 텍스트 문서에만 한정되지 않습니다.

8.5.1. 언어 태그

[RFC5646]에 정의된 언어 태그는 인간이 다른 인간에게 정보를 전달하기 위해 말하거나 쓰거나 그 밖의 방식으로 표현하는 자연어를 식별합니다. 컴퓨터 언어는 명시적으로 제외됩니다.

HTTP는 Accept-Language 및 Content-Language 헤더 필드에서 언어 태그를 사용합니다. Accept-Language는 12.5.4절에 정의된 더 넓은 language-range 생성식을 사용하는 반면, Content-Language는 아래에 정의된 language-tag 생성식을 사용합니다.

  language-tag = <Language-Tag, see [RFC5646], Section 2.1>

언어 태그는 하나 이상의 대소문자를 구분하지 않는 하위 태그의 시퀀스이며, 각 태그는 하이픈 문자("-", %x2D)로 구분됩니다. 대부분의 경우 언어 태그는 관련 언어의 넓은 계열을 식별하는 기본 언어 하위 태그(예: "en" = 영어)로 구성되며, 선택적으로 해당 언어의 범위를 세분화하거나 좁히는 일련의 하위 태그가 뒤따릅니다(예: "en-CA" = 캐나다에서 사용하는 영어 변종). 언어 태그 안에는 공백이 허용되지 않습니다. 예시 태그는 다음과 같습니다.

  fr, en-US, es-419, az-Arab, x-pig-latin, man-Nkoo-GN

자세한 정보는 [RFC5646]을 참조하십시오.

8.6. Content-Length

"Content-Length" 헤더 필드는 관련 표현의 데이터 길이를 음이 아닌 십진 정수 옥텟 수로 나타냅니다. 표현을 콘텐츠로 전송할 때 Content-Length는 프레이밍을 구분하는 데 사용할 수 있도록 포함된 데이터의 양을 구체적으로 나타냅니다(예: [HTTP/1.1]의 6.2절). 다른 경우 Content-Length는 선택된 표현의 현재 길이를 나타내며, 수신자가 전송 시간을 추정하거나 이전에 저장된 표현과 비교하는 데 사용할 수 있습니다.

예시는 다음과 같습니다.

Content-Length: 3495

메서드가 포함된 콘텐츠에 의미를 정의하고 Transfer-Encoding을 전송하지 않는 경우 사용자 에이전트는 요청에 Content-Length를 SHOULD 전송해야 합니다. 예를 들어 사용자 에이전트는 일반적으로 값이 0(빈 콘텐츠를 나타냄)이더라도 POST 요청에 Content-Length를 전송합니다. 요청 메시지에 콘텐츠가 없고 메서드 의미론이 그러한 데이터를 예상하지 않는 경우 사용자 에이전트는 Content-Length 헤더 필드를 SHOULD NOT 전송해야 합니다.

서버는 HEAD 요청(9.3.2절)에 대한 응답에 Content-Length 헤더 필드를 MAY 전송할 수 있습니다. 그러나 동일한 요청이 GET 메서드를 사용했다면 응답 콘텐츠로 전송되었을 옥텟의 십진수 개수와 필드 값이 같지 않은 경우 서버는 그러한 응답에 Content-Length를 MUST NOT 전송해야 합니다.

서버는 조건부 GET 요청(15.4.5절)에 대한 304 (수정되지 않음) 응답에 Content-Length 헤더 필드를 MAY 전송할 수 있습니다. 그러나 해당 필드 값이 동일한 요청에 대한 200 (OK) 응답의 콘텐츠로 전송되었을 십진수 옥텟 수와 같지 않다면 서버는 그러한 응답에 Content-Length를 MUST NOT 전송해야 합니다.

서버는 1xx (정보성) 또는 204 (콘텐츠 없음) 상태 코드가 있는 모든 응답에 Content-Length 헤더 필드를 MUST NOT 전송해야 합니다. 서버는 CONNECT 요청(9.3.6절)에 대한 모든 2xx (성공) 응답에도 Content-Length 헤더 필드를 MUST NOT 전송해야 합니다.

위에서 정의한 경우를 제외하고, Transfer-Encoding이 없으며 전체 헤더 섹션을 전송하기 전에 콘텐츠 크기를 알고 있는 경우 오리진 서버는 Content-Length 헤더 필드를 SHOULD 전송해야 합니다. 이를 통해 다운스트림 수신자는 전송 진행률을 측정하고, 수신된 메시지가 언제 완료되는지 알며, 추가 요청에 연결을 재사용할 수 있습니다.

0 이상의 모든 Content-Length 필드 값은 유효합니다. 콘텐츠 길이에 미리 정의된 제한이 없으므로 수신자는 잠재적으로 큰 십진수를 예상하고 정수 변환 오버플로에 따른 구문 분석 오류나 정수 변환으로 인한 정밀도 손실을 방지하도록 MUST 해야 합니다(17.5절).

Content-Length는 HTTP/1.1에서 메시지 구분에 사용되므로 직접 연결이 HTTP/1.1을 사용하지 않더라도 그 필드 값은 다운스트림 수신자가 메시지를 구문 분석하는 방식에 영향을 줄 수 있습니다. 메시지가 다운스트림 중개자에 의해 전달되는 경우 수신된 메시지 프레이밍과 일치하지 않는 Content-Length 필드 값은 요청 스머글링 또는 응답 분할로 인해 보안 실패를 일으킬 수 있습니다.

따라서 송신자는 잘못된 것으로 알려진 Content-Length 헤더 필드 값을 가진 메시지를 MUST NOT 전달해야 합니다.

마찬가지로 송신자는 위의 ABNF와 일치하지 않는 Content-Length 헤더 필드 값을 가진 메시지를 MUST NOT 전달해야 합니다. 단, 동일한 십진수 값이 쉼표로 구분된 목록으로 반복된 Content-Length 헤더 필드 값 (예: "Content-Length: 42, 42")의 수신자는 이를 유효하지 않은 메시지로 거부하거나 해당 유효하지 않은 필드 값을 십진수 값의 단일 인스턴스로 MAY 대체할 수 있습니다. 이는 업스트림 메시지 처리기가 중복 값을 생성하거나 결합했음을 나타낼 가능성이 높기 때문입니다.

8.7. Content-Location

"Content-Location" 헤더 필드는 이 메시지의 콘텐츠에 있는 표현에 대응하는 특정 리소스의 식별자로 사용할 수 있는 URI를 참조합니다. 즉 이 메시지가 생성된 시점에 해당 URI에 대해 GET 요청을 수행했다면 200 (OK) 응답에는 이 메시지의 콘텐츠로 포함된 것과 동일한 표현이 포함되었을 것입니다.

필드 값은 absolute-URI 또는 partial-URI입니다. 후자의 경우(4절) 참조되는 URI는 대상 URI를 기준으로 합니다([URI], 5절).

Content-Location 값은 대상 URI(7.1절)를 대체하는 것이 아닙니다. 이는 표현 메타데이터입니다. [RFC2557]의 4절에서 MIME 본문 부분에 정의한 같은 이름의 헤더 필드와 동일한 구문과 의미론을 가집니다. 그러나 HTTP 메시지에 나타나는 경우 HTTP 수신자에게 몇 가지 특별한 의미가 있습니다.

Content-Location이 2xx (성공) 응답 메시지에 포함되고 그 값이 절대 형식으로 변환한 후 대상 URI와 동일한 URI를 참조한다면, 수신자는 메시지 생성 날짜가 나타내는 시점에 해당 콘텐츠가 그 리소스의 현재 표현이라고 MAY 간주할 수 있습니다. GET(9.3.1절) 또는 HEAD(9.3.2절) 요청의 경우 이는 서버가 Content-Location을 제공하지 않았을 때의 기본 의미론과 동일합니다. PUT(9.3.4절)이나 POST(9.3.3절) 같은 상태 변경 요청의 경우 서버의 응답이 해당 리소스의 새 표현을 포함한다는 의미이며, 이로써 동작에 관해서만 보고할 수 있는 표현(예: "성공했습니다!")과 구별됩니다. 이를 통해 작성 애플리케이션은 후속 GET 요청 없이 로컬 사본을 갱신할 수 있습니다.

Content-Location이 2xx (성공) 응답 메시지에 포함되고 그 필드 값이 대상 URI와 다른 URI를 참조한다면, 오리진 서버는 해당 URI가 포함된 표현에 대응하는 다른 리소스의 식별자라고 주장합니다. 이러한 주장은 두 식별자가 동일한 리소스 소유자를 공유하는 경우에만 신뢰할 수 있지만, 이는 HTTP를 통해 프로그램적으로 결정할 수 없습니다.

  • GET 또는 HEAD 요청에 대한 응답의 경우 이는 대상 URI가 콘텐츠 협상 대상인 리소스를 참조하고, Content-Location 필드 값이 선택된 표현을 위한 더 구체적인 식별자임을 나타냅니다.
  • 상태 변경 메서드에 대한 201 (생성됨) 응답에서 Location 필드 값과 동일한 Content-Location 필드 값은 이 콘텐츠가 새로 생성된 리소스의 현재 표현임을 나타냅니다.
  • 그렇지 않으면 이러한 Content-Location은 이 콘텐츠가 요청된 작업의 상태를 보고하는 표현이며 동일한 보고서를 주어진 URI에서 향후 GET으로 접근할 수 있음을 나타냅니다. 예를 들어 POST 요청으로 수행된 구매 트랜잭션은 200 (OK) 응답의 콘텐츠로 영수증 문서를 포함할 수 있습니다. Content-Location 필드 값은 향후 동일한 영수증의 사본을 검색하기 위한 식별자를 제공합니다.

요청 메시지에서 Content-Location을 전송하는 사용자 에이전트는 해당 값이 사용자 에이전트가 처음 포함된 표현의 콘텐츠를 얻은 위치를 참조한다고 말하는 것입니다(해당 사용자 에이전트가 수정하기 전). 즉 사용자 에이전트는 원래 표현의 소스로 돌아가는 링크를 제공합니다.

요청 메시지에서 Content-Location 필드를 수신한 오리진 서버는 해당 정보를 표현의 일부로 그대로 저장할 메타데이터가 아니라 일시적인 요청 컨텍스트로 MUST 취급해야 합니다. 오리진 서버는 해당 컨텍스트를 요청 처리에 활용하거나 소스 링크 또는 버전 관리 메타데이터와 같은 다른 용도를 위해 저장할 MAY 수 있습니다. 그러나 오리진 서버는 그러한 컨텍스트 정보를 사용하여 요청 의미론을 변경해서는 MUST NOT 됩니다.

예를 들어 클라이언트가 협상된 리소스에 PUT 요청을 수행하고 오리진 서버가 그 PUT을 (리디렉션 없이) 수락하면 해당 리소스의 새 상태는 그 PUT에서 제공한 하나의 표현과 일치할 것으로 예상됩니다. Content-Location은 협상된 표현 중 하나만 갱신하기 위한 역방향 콘텐츠 선택 식별자 형태로 사용할 수 없습니다. 사용자 에이전트가 후자의 의미론을 원했다면 PUT을 Content-Location URI에 직접 적용했을 것입니다.

8.8. 검증자 필드

리소스 메타데이터가 사전 조건(13.1절) 내에서 조건부 요청(13절)을 만드는 데 사용될 수 있으면 이를 검증자라고 합니다. 검증자 필드는 선택된 표현(3.2절)의 현재 검증자를 전달합니다.

안전한 요청에 대한 응답에서 검증자 필드는 오리진 서버가 응답을 처리하면서 선택한 선택된 표현을 설명합니다. 메서드와 상태 코드 의미론에 따라 특정 응답의 선택된 표현이 응답 콘텐츠로 포함된 표현과 반드시 동일한 것은 아닙니다.

상태 변경 요청에 대한 성공적인 응답에서 검증자 필드는 요청을 처리한 결과 이전 선택된 표현을 대체한 새 표현을 설명합니다.

예를 들어 201 (생성됨) 응답의 ETag 필드는 새로 생성된 리소스 표현의 엔터티 태그를 전달하여 이후 조건부 요청에서 해당 엔터티 태그를 검증자로 사용해 "업데이트 손실" 문제를 방지할 수 있도록 합니다.

이 사양에서는 리소스 상태를 관찰하고 사전 조건을 검사하는 데 일반적으로 사용하는 두 가지 형태의 메타데이터를 정의합니다. 수정 날짜(8.8.2절)와 불투명 엔터티 태그(8.8.3절)입니다. 리소스 상태를 반영하는 추가 메타데이터는 Web Distributed Authoring and Versioning [WEBDAV]과 같이 이 사양의 범위를 벗어나는 다양한 HTTP 확장에서 정의되었습니다.

8.8.1. 약한 검증자와 강한 검증자

검증자에는 강한 검증자와 약한 검증자 두 종류가 있습니다. 약한 검증자는 생성하기 쉽지만 비교에는 훨씬 덜 유용합니다. 강한 검증자는 비교에 이상적이지만 효율적으로 생성하기가 매우 어렵거나 때로는 불가능할 수 있습니다. 모든 형태의 리소스에 동일한 강도의 검증자를 따르도록 강제하는 대신 HTTP는 사용 중인 검증자 유형을 노출하고 약한 검증자를 사전 조건으로 사용할 수 있는 시점을 제한합니다.

강한 검증자는 GET에 대한 200 (OK) 응답의 콘텐츠에서 관찰 가능한 표현 데이터의 변경이 발생할 때마다 값이 변경되는 표현 메타데이터입니다.

강한 검증자는 표현 데이터의 변경 이외의 이유로도 변경될 수 있습니다. 예를 들어 표현 메타데이터의 의미론적으로 중요한 부분(Content-Type)이 변경되는 경우입니다. 그러나 원격 캐시와 작성 도구에 저장된 응답을 무효화해야 할 때만 값을 변경하는 것이 오리진 서버에 가장 유리합니다.

캐시 항목은 만료 시간과 관계없이 임의로 긴 기간 동안 유지될 수 있습니다. 따라서 캐시는 아주 오래전에 얻은 검증자를 사용하여 항목을 검증하려 할 수 있습니다. 강한 검증자는 시간이 지나는 동안 특정 리소스와 관련된 모든 표현의 모든 버전에 걸쳐 고유합니다. 그러나 서로 다른 리소스의 표현 사이에서도 고유하다는 의미는 없습니다(즉, 동일한 강한 검증자가 여러 리소스의 표현에 동시에 사용될 수 있으며, 그렇다고 해당 표현들이 동등하다는 의미는 아닙니다).

실제로 다양한 강한 검증자가 사용됩니다. 가장 좋은 것은 엄격한 개정 제어를 기반으로 하며, 표현의 각 변경마다 GET으로 표현에 접근할 수 있게 되기 전에 고유한 노드 이름과 개정 식별자가 항상 할당됩니다. 표현 데이터에 적용한 충돌 저항 해시 함수도 응답 헤더 필드가 전송되기 전에 데이터를 사용할 수 있고 검증 요청이 수신될 때마다 다이제스트를 다시 계산할 필요가 없다면 충분합니다. 그러나 리소스에 메타데이터만 다른 서로 다른 표현이 있는 경우, 예를 들어 동일한 데이터 형식을 공유하는 미디어 유형 간 콘텐츠 협상에서 발생할 수 있는 경우 오리진 서버는 해당 표현을 구별하기 위한 추가 정보를 검증자에 포함해야 합니다.

반대로 약한 검증자는 표현 데이터가 변경될 때마다 변경되지 않을 수 있는 표현 메타데이터입니다. 이러한 약점은 값 계산 방식의 제한(예: 시계 해상도), 가능한 모든 리소스 표현에 대해 고유성을 보장할 수 없음, 또는 리소스 소유자가 고유한 데이터 시퀀스 대신 스스로 정한 동등성 집합에 따라 표현을 그룹화하려는 의도 때문에 발생할 수 있습니다.

오리진 서버는 이전 표현이 현재 표현의 대체물로 허용되지 않는다고 판단할 때마다 약한 엔터티 태그를 SHOULD 변경해야 합니다. 즉 약한 엔터티 태그는 오리진 서버가 캐시에 오래된 응답을 무효화하도록 하려는 때마다 변경하는 것이 바람직합니다.

예를 들어 동적 측정값에 따라 콘텐츠가 매초 변경되는 일기예보 표현은 캐시된 표현이 합리적인 기간 동안 유효하도록 동일한 약한 검증자를 가진 동등한 표현 집합(오리진 서버의 관점에서)으로 그룹화할 수 있습니다 (서버 부하 또는 날씨 품질에 따라 동적으로 조정할 수도 있음). 마찬가지로 표현 수정 시간이 1초 해상도로만 정의되어 있고 한 초 안에 표현이 두 번 수정되고 그 수정 사이에 검색될 수 있다면 약한 검증자가 될 수 있습니다.

마찬가지로 검증자가 특정 리소스의 둘 이상의 표현에서 동시에 공유되고 해당 표현들의 표현 데이터가 동일하지 않다면 약한 검증자입니다. 예를 들어 오리진 서버가 gzip 콘텐츠 코딩이 적용된 표현과 콘텐츠 코딩이 없는 표현에 동일한 검증자를 전송한다면 그 검증자는 약합니다. 그러나 두 개의 동시 표현이 동일한 표현 데이터에 대해 서로 다른 두 미디어 유형을 사용할 때와 같이 표현 메타데이터만 다르다면 동일한 강한 검증자를 공유할 수 있습니다.

강한 검증자는 캐시 검증, 부분 콘텐츠 범위 및 "업데이트 손실" 방지를 포함한 모든 조건부 요청에 사용할 수 있습니다. 약한 검증자는 이전에 얻은 표현 데이터와 정확히 동일할 필요가 없는 경우에만 사용할 수 있습니다. 예를 들어 캐시 항목을 검증하거나 웹 탐색을 최근 변경 사항으로 제한할 때입니다.

8.8.2. Last-Modified

응답의 "Last-Modified" 헤더 필드는 요청 처리가 끝난 시점의 판단에 따라 오리진 서버가 선택된 표현이 마지막으로 수정되었다고 판단하는 날짜와 시간을 나타내는 타임스탬프를 제공합니다.

사용 예는 다음과 같습니다.

Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT
8.8.2.1. 생성

오리진 서버는 마지막 수정 날짜를 합리적이고 일관되게 결정할 수 있는 모든 선택된 표현에 Last-Modified를 SHOULD 전송해야 합니다. 조건부 요청과 캐시 신선도 평가([CACHING])에서 이를 사용하면 불필요한 전송을 크게 줄이고 서비스 가용성과 확장성을 현저히 향상할 수 있기 때문입니다.

표현은 일반적으로 리소스 인터페이스 뒤에 있는 여러 부분의 합입니다. 마지막 수정 시각은 보통 그 부분 중 하나라도 가장 최근에 변경된 시각입니다. 특정 리소스에서 해당 값을 결정하는 방법은 이 사양의 범위를 벗어난 구현 세부 사항입니다.

오리진 서버는 응답의 Date 필드 값을 생성하는 시점과 가능한 한 가까운 시점에 표현의 Last-Modified 값을 SHOULD 얻어야 합니다. 이를 통해 수신자는 표현의 수정 시각을 정확하게 판단할 수 있으며, 특히 응답이 생성되는 시점 근처에 표현이 변경되는 경우 유용합니다.

5.6.7절에 정의된 시계를 가진 오리진 서버는 서버의 메시지 생성 시각(Date, 6.6.1절)보다 이후인 Last-Modified 날짜를 MUST NOT 생성하지 마십시오. 마지막 수정 시각이 오리진 서버의 시계에 따라 미래의 어느 시점으로 평가되는 구현별 메타데이터에서 파생된다면 오리진 서버는 해당 값을 메시지 생성 날짜로 MUST 대체해야 합니다. 이는 미래의 수정 날짜가 캐시 검증에 악영향을 주는 것을 방지합니다.

시계가 없는 오리진 서버는 해당 날짜 값이 다른 시스템(아마 시계가 있는 시스템)에 의해 리소스에 할당된 경우가 아니라면 응답에 Last-Modified 날짜를 MUST NOT 생성해야 합니다.

8.8.2.2. 비교

Last-Modified 시각을 요청에서 검증자로 사용할 경우 다음 규칙을 사용해 강하다고 추론할 수 있는 경우가 아니라면 암시적으로 약한 검증자입니다.

  • 오리진 서버가 표현의 실제 현재 검증자와 해당 검증자를 비교하고 있으며,
  • 해당 오리진 서버가 제시된 검증자가 포괄하는 1초 동안 관련 표현이 두 번 변경되지 않았음을 확실하게 알고 있는 경우

또는

  • 클라이언트가 관련 표현의 캐시 항목을 가지고 있기 때문에 If-Modified-Since, If-Unmodified-Since 또는 If-Range 헤더 필드에서 검증자를 사용하려 하고 있으며,
  • 해당 캐시 항목에 Last-Modified 값보다 최소 1초 이후인 Date 값이 포함되어 있고 클라이언트가 두 값이 동일한 시계에서 생성되었다고 믿을 이유가 있거나 Last-Modified와 Date 값 사이에 충분한 차이가 있어 시계 동기화 문제가 발생할 가능성이 낮은 경우

또는

  • 중간 캐시가 해당 표현의 캐시 항목에 저장된 검증자와 검증자를 비교하고 있으며,
  • 해당 캐시 항목에 Last-Modified 값보다 최소 1초 이후인 Date 값이 포함되어 있고 캐시가 두 값이 동일한 시계에서 생성되었다고 믿을 이유가 있거나 Last-Modified와 Date 값 사이에 충분한 차이가 있어 시계 동기화 문제가 발생할 가능성이 낮은 경우

이 방법은 같은 1초 동안 서로 다른 두 응답을 오리진 서버가 전송했지만 둘 다 동일한 Last-Modified 시각을 가지고 있다면, 그 응답 중 적어도 하나의 Date 값은 Last-Modified 시각과 같다는 사실에 의존합니다.

8.8.3. ETag

응답의 "ETag" 필드는 요청 처리가 끝난 시점에 결정된 선택된 표현의 현재 엔터티 태그를 제공합니다. 엔터티 태그는 동일한 리소스의 여러 표현을 구별하기 위한 불투명 검증자이며, 그러한 여러 표현이 시간에 따른 리소스 상태 변경 때문인지, 콘텐츠 협상으로 인해 여러 표현이 동시에 유효하기 때문인지, 또는 둘 다인지는 관계없습니다. 엔터티 태그는 불투명한 인용 문자열로 구성되며 약함 표시자가 앞에 붙을 수 있습니다.

  ETag       = entity-tag

  entity-tag = [ weak ] opaque-tag
  weak       = %s"W/"
  opaque-tag = DQUOTE *etagc DQUOTE
  etagc      = %x21 / %x23-7E / obs-text
             ; 큰따옴표를 제외한 VCHAR와 obs-text

엔터티 태그는 수정 날짜를 저장하기 불편하거나, HTTP-date 값의 1초 해상도가 충분하지 않거나, 수정 날짜가 일관되게 유지되지 않는 상황에서 수정 날짜보다 더 신뢰할 수 있는 검증자가 될 수 있습니다.

예:

ETag: "xyzzy"
ETag: W/"xyzzy"
ETag: ""

엔터티 태그는 약한 검증자 또는 강한 검증자가 될 수 있으며 기본값은 강한 검증자입니다. 오리진 서버가 표현에 엔터티 태그를 제공하고 해당 엔터티 태그의 생성이 강한 검증자(8.8.1절)의 모든 특성을 충족하지 못한다면, 오리진 서버는 불투명 값 앞에 "W/"(대소문자 구분)를 붙여 엔터티 태그를 약한 것으로 MUST 표시해야 합니다.

송신자는 트레일러 섹션에서 ETag 필드를 MAY 전송할 수 있습니다(6.5절 참조). 그러나 트레일러는 자주 무시되므로 콘텐츠를 전송하는 동안 엔터티 태그가 생성되는 경우가 아니라면 ETag를 헤더 필드로 전송하는 것이 바람직합니다.

8.8.3.1. 생성

엔터티 태그의 기본 원칙은 서비스 작성자만이 해당 리소스에 가장 정확하고 효율적인 검증 메커니즘을 선택할 수 있을 정도로 리소스의 구현을 잘 알고 있으며, 이러한 모든 메커니즘을 쉽게 비교할 수 있도록 단순한 옥텟 시퀀스로 매핑할 수 있다는 것입니다. 값은 불투명하므로 클라이언트가 각 엔터티 태그가 구성되는 방식을 알 필요가 없습니다.

예를 들어 모든 변경에 구현별 버전 관리가 적용되는 리소스는 표현을 정확하게 구별하기 위해 내부 개정 번호를 콘텐츠 협상을 위한 변형 식별자와 결합하여 사용할 수 있습니다. 다른 구현은 표현 콘텐츠의 충돌 저항 해시, 다양한 파일 속성의 조합 또는 1초 미만의 해상도를 가진 수정 타임스탬프를 사용할 수 있습니다.

오리진 서버는 변경 감지를 합리적이고 일관되게 결정할 수 있는 모든 선택된 표현에 ETag를 SHOULD 전송해야 합니다. 조건부 요청 및 캐시 신선도 평가([CACHING])에서 엔터티 태그를 사용하면 불필요한 전송을 크게 줄이고 서비스 가용성, 확장성 및 신뢰성을 현저히 향상할 수 있기 때문입니다.

8.8.3.2. 비교

비교 컨텍스트에서 약한 검증자의 사용을 허용하는지 여부에 따라 두 가지 엔터티 태그 비교 함수가 있습니다.

강한 비교:
두 엔터티 태그가 모두 약하지 않고 opaque-tag가 문자 단위로 일치하면 두 엔터티 태그는 동등합니다.
약한 비교:
둘 중 하나 또는 둘 모두가 "weak"로 표시되어 있는지와 관계없이 opaque-tag가 문자 단위로 일치하면 두 엔터티 태그는 동등합니다.

아래 예는 엔터티 태그 쌍 집합과 약한 비교 및 강한 비교 함수의 결과를 보여 줍니다.

표 3
ETag 1 ETag 2 강한 비교 약한 비교
W/"1" W/"1" 일치하지 않음 일치
W/"1" W/"2" 일치하지 않음 일치하지 않음
W/"1" "1" 일치하지 않음 일치
"1" "1" 일치 일치
8.8.3.3. 예: 콘텐츠 협상 리소스에 따라 달라지는 엔터티 태그

콘텐츠 협상(12절) 대상인 리소스에서 GET 요청에 대한 응답으로 전송되는 표현이 Accept-Encoding 요청 헤더 필드(12.5.3절)에 따라 달라지는 경우를 생각해 보십시오.

>> 요청:

GET /index HTTP/1.1
Host: www.example.com
Accept-Encoding: gzip

이 경우 응답은 gzip 콘텐츠 코딩을 사용할 수도 있고 사용하지 않을 수도 있습니다. 사용하지 않는 경우 응답은 다음과 같을 수 있습니다.

>> 응답:

HTTP/1.1 200 OK
Date: Fri, 26 Mar 2010 00:05:00 GMT
ETag: "123-a"
Content-Length: 70
Vary: Accept-Encoding
Content-Type: text/plain

Hello World!
Hello World!
Hello World!
Hello World!
Hello World!

gzip 콘텐츠 코딩을 사용하는 대체 표현은 다음과 같습니다.

>> 응답:

HTTP/1.1 200 OK
Date: Fri, 26 Mar 2010 00:05:00 GMT
ETag: "123-b"
Content-Length: 43
Vary: Accept-Encoding
Content-Type: text/plain
Content-Encoding: gzip

...binary data...

9. 메서드

9.1. 개요

요청 메서드 토큰은 요청 의미론의 주된 출처이며, 클라이언트가 이 요청을 한 목적과 성공적인 결과로 클라이언트가 기대하는 것을 나타냅니다.

요청에 일부 헤더 필드가 존재하고 그 추가 의미론이 메서드와 충돌하지 않는 경우 해당 헤더 필드의 의미론에 의해 요청 메서드의 의미론이 더 세분화될 수 있습니다. 예를 들어 클라이언트는 요청된 동작이 대상 리소스의 현재 상태를 조건으로 하도록 조건부 요청 헤더 필드(13.1절)를 전송할 수 있습니다.

HTTP는 분산 객체 시스템의 인터페이스로 사용할 수 있도록 설계되었습니다. 요청 메서드는 원격 메서드 호출을 식별된 객체에 전송하는 것과 매우 유사한 방식으로 대상 리소스에 적용할 동작을 호출합니다.

메서드 토큰은 대소문자를 구분합니다. 대소문자를 구분하는 메서드 이름을 가진 객체 기반 시스템으로 연결되는 게이트웨이로 사용할 수 있기 때문입니다. 관례상 표준화된 메서드는 모두 대문자인 US-ASCII 문자로 정의됩니다.

분산 객체와 달리 HTTP의 표준화된 요청 메서드는 리소스별로 정의되지 않습니다. 균일한 인터페이스가 네트워크 기반 시스템에서 더 나은 가시성과 재사용성을 제공하기 때문입니다 [REST]. 일단 정의된 표준화된 메서드는 모든 리소스에 적용될 때 동일한 의미론을 갖는 것이 바람직하지만, 각 리소스는 해당 의미론을 구현하거나 허용할지 스스로 결정합니다.

이 사양에서는 HTTP에서 일반적으로 사용하는 여러 표준화된 메서드를 정의하며, 다음 표에 요약되어 있습니다.

표 4
메서드 이름 설명 절
GET 대상 리소스의 현재 표현을 전송합니다. 9.3.1
HEAD GET과 동일하지만 응답 콘텐츠를 전송하지 않습니다. 9.3.2
POST 요청 콘텐츠에 대해 리소스별 처리를 수행합니다. 9.3.3
PUT 대상 리소스의 현재 모든 표현을 요청 콘텐츠로 대체합니다. 9.3.4
DELETE 대상 리소스의 현재 모든 표현을 제거합니다. 9.3.5
CONNECT 대상 리소스로 식별되는 서버에 대한 터널을 설정합니다. 9.3.6
OPTIONS 대상 리소스의 통신 옵션을 설명합니다. 9.3.7
TRACE 대상 리소스로 향하는 경로에서 메시지 루프백 테스트를 수행합니다. 9.3.8

모든 범용 서버는 GET 및 HEAD 메서드를 MUST 지원해야 합니다. 다른 모든 메서드는 OPTIONAL입니다.

대상 리소스가 허용하는 메서드 집합은 Allow 헤더 필드(10.2.1절)에 나열할 수 있습니다. 그러나 허용되는 메서드 집합은 동적으로 변경될 수 있습니다. 인식할 수 없거나 구현하지 않은 요청 메서드를 수신한 오리진 서버는 501 (구현되지 않음) 상태 코드로 SHOULD 응답해야 합니다. 인식하고 구현했지만 대상 리소스에 허용되지 않는 요청 메서드를 수신한 오리진 서버는 405 (허용되지 않는 메서드) 상태 코드로 SHOULD 응답해야 합니다.

이 사양의 범위를 벗어난 추가 메서드도 HTTP에서 사용하도록 정의되어 있습니다. 그러한 모든 메서드는 16.1절에 설명된 대로 "Hypertext Transfer Protocol (HTTP) Method Registry"에 등록하는 것이 바람직합니다.

9.2. 공통 메서드 속성

9.2.1. 안전한 메서드

정의된 의미론이 본질적으로 읽기 전용이면 요청 메서드는 안전한 것으로 간주됩니다. 즉 클라이언트는 대상 리소스에 안전한 메서드를 적용한 결과로 오리진 서버에서 어떠한 상태 변경도 요청하지 않고 기대하지도 않습니다. 마찬가지로 안전한 메서드를 합리적으로 사용해도 오리진 서버에 피해, 재산 손실 또는 비정상적인 부담을 일으킬 것으로 예상되지 않습니다.

안전한 메서드에 대한 이 정의는 구현이 잠재적으로 해롭거나 완전히 읽기 전용이 아니거나 안전한 메서드를 호출할 때 부작용을 일으키는 동작을 포함하는 것을 막지 않습니다. 그러나 중요한 점은 클라이언트가 그러한 추가 동작을 요청하지 않았으므로 그에 대한 책임을 질 수 없다는 것입니다. 예를 들어 대부분의 서버는 메서드와 관계없이 모든 응답이 완료될 때 요청 정보를 접근 로그 파일에 추가하며, 로그 저장소가 가득 차서 서버가 실패할 수 있더라도 이는 안전한 것으로 간주됩니다. 마찬가지로 웹에서 광고를 선택해 시작된 안전한 요청은 광고 계정에 비용을 청구하는 부작용을 갖는 경우가 많습니다.

이 사양에서 정의한 요청 메서드 중 GET, HEAD, OPTIONS 및 TRACE 메서드는 안전한 것으로 정의됩니다.

안전한 메서드와 안전하지 않은 메서드를 구별하는 목적은 자동화된 검색 프로세스(스파이더)와 캐시 성능 최적화(미리 가져오기)가 피해를 일으킬 우려 없이 작동할 수 있도록 하는 것입니다. 또한 사용자 에이전트가 잠재적으로 신뢰할 수 없는 콘텐츠를 처리할 때 안전하지 않은 메서드의 자동 사용에 적절한 제한을 적용할 수 있도록 합니다.

사용자 에이전트는 사용자에게 가능한 작업을 제시할 때 안전한 메서드와 안전하지 않은 메서드를 SHOULD 구별하여, 안전하지 않은 작업을 요청하기 전에 사용자가 이를 알 수 있도록 해야 합니다.

대상 URI 안의 매개변수가 작업을 선택하는 효과를 갖도록 리소스가 구성된 경우, 해당 작업이 요청 메서드 의미론과 일치하도록 하는 것은 리소스 소유자의 책임입니다. 예를 들어 웹 기반 콘텐츠 편집 소프트웨어에서는 "page?do=delete"와 같이 쿼리 매개변수 안에 작업을 사용하는 경우가 흔합니다. 이러한 리소스의 목적이 안전하지 않은 작업을 수행하는 것이라면 리소스 소유자는 안전한 요청 메서드로 접근될 때 해당 작업을 MUST 비활성화하거나 허용하지 않아야 합니다. 그렇게 하지 않으면 자동화된 프로세스가 링크 유지 관리, 미리 가져오기, 검색 색인 구축 등을 위해 모든 URI 참조에 GET을 수행할 때 바람직하지 않은 부작용이 발생합니다.

9.2.2. 멱등 메서드

동일한 메서드로 여러 번 같은 요청을 보냈을 때 서버에 의도된 효과가 그러한 요청을 한 번 보냈을 때의 효과와 같으면 요청 메서드는 멱등으로 간주됩니다. 이 사양에서 정의된 요청 메서드 중 PUT, DELETE 및 안전한 요청 메서드는 멱등입니다.

안전성의 정의와 마찬가지로 멱등 속성은 사용자가 요청한 내용에만 적용됩니다. 서버는 각 요청을 별도로 기록하거나, 개정 제어 이력을 유지하거나, 각 멱등 요청에 다른 비멱등 부작용을 구현할 수 있습니다.

멱등 메서드는 클라이언트가 서버의 응답을 읽기 전에 통신 실패가 발생하면 요청을 자동으로 반복할 수 있기 때문에 구별됩니다. 예를 들어 클라이언트가 PUT 요청을 전송했는데 응답을 받기 전에 기본 연결이 닫히면 클라이언트는 새 연결을 설정하고 멱등 요청을 다시 시도할 수 있습니다. 원래 요청이 성공했더라도 요청을 반복하면 의도된 효과는 동일하다는 것을 알고 있지만 응답은 다를 수 있습니다.

클라이언트는 메서드와 관계없이 요청 의미론이 실제로 멱등임을 알 수 있는 수단이나 원래 요청이 전혀 적용되지 않았음을 감지할 수 있는 수단이 없다면 비멱등 메서드 요청을 자동으로 다시 시도하지 않는 것이 SHOULD NOT 요구됩니다.

예를 들어 사용자 에이전트는 요청이 해당 리소스에 안전하다는 것을 (설계 또는 구성을 통해) 알고 있으면 POST 요청을 자동으로 반복할 수 있습니다. 마찬가지로 버전 관리 저장소를 대상으로 특별히 작동하도록 설계된 사용자 에이전트는 실패한 연결 후 대상 리소스의 개정을 확인하고, 부분적으로 적용된 변경을 되돌리거나 수정한 다음 실패한 요청을 자동으로 다시 시도하여 부분 실패 상태에서 복구할 수 있습니다.

일부 클라이언트는 더 위험한 접근 방식을 취해 자동 재시도가 가능한 시점을 추측하려 합니다. 예를 들어 클라이언트는 응답의 어떤 부분도 수신하기 전에 기본 전송 연결이 닫힌 경우, 특히 유휴 영구 연결을 사용했다면 POST 요청을 자동으로 다시 시도할 수 있습니다.

프록시는 비멱등 요청을 자동으로 다시 시도해서는 MUST NOT 됩니다. 클라이언트는 실패한 자동 재시도를 다시 자동으로 시도하지 않는 것이 SHOULD NOT 요구됩니다.

9.2.3. 메서드 및 캐싱

캐시가 응답을 저장하고 사용하려면 관련 메서드가 명시적으로 캐싱을 허용하고 응답을 후속 요청을 충족하는 데 사용할 수 있는 조건을 자세히 정의해야 합니다. 그렇지 않은 메서드 정의는 캐시할 수 없습니다. 추가 요구사항은 [CACHING]을 참조하십시오.

이 사양은 GET, HEAD 및 POST에 대한 캐싱 의미론을 정의하지만 대부분의 캐시 구현은 GET과 HEAD만 지원합니다.

9.3. 메서드 정의

9.3.1. GET

GET 메서드는 대상 리소스에 대한 현재 선택된 표현의 전송을 요청합니다. 성공적인 응답은 대상 URI로 식별되는 "동일성"의 품질을 반영합니다( [URI]의 1.2.2절). 따라서 HTTP를 통해 식별 가능한 정보를 검색하는 것은 일반적으로 200 (OK) 응답에서 해당 정보를 제공할 가능성과 관련된 식별자에 GET 요청을 수행하여 이루어집니다.

GET은 정보 검색의 주된 메커니즘이며 거의 모든 성능 최적화의 초점입니다. 중요한 각 리소스에 대해 URI를 생성하는 애플리케이션은 그러한 최적화의 이점을 얻으면서 다른 애플리케이션이 이를 재사용할 수 있게 하여 웹의 추가 확장을 촉진하는 네트워크 효과를 만듭니다.

리소스 식별자를 원격 파일 시스템 경로명으로, 표현을 그러한 파일 콘텐츠의 사본으로 생각하기 쉽습니다. 실제로 많은 리소스가 그렇게 구현됩니다(관련 보안 고려사항은 17.3절 참조). 그러나 실제로 그러한 제한은 없습니다.

리소스를 위한 HTTP 인터페이스는 콘텐츠 객체의 트리, 다양한 데이터베이스 레코드의 프로그램적 뷰 또는 다른 정보 시스템으로 연결되는 게이트웨이로 구현될 가능성도 높습니다. URI 매핑 메커니즘이 파일 시스템에 연결되어 있더라도 오리진 서버는 요청을 입력으로 사용해 파일을 실행하고 파일을 직접 전송하는 대신 출력을 표현으로 전송하도록 구성될 수 있습니다. 어떤 경우든 각 리소스 식별자가 구현에 대응하는 방식과 해당 구현이 대상 리소스의 현재 표현을 선택하고 전송하는 방법은 오리진 서버만 알면 됩니다.

클라이언트는 요청에 Range 헤더 필드를 전송하여 GET의 의미론을 "범위 요청"으로 변경하고 선택된 표현의 일부만 전송하도록 요청할 수 있습니다(14.2절).

요청 메시지 프레이밍은 사용된 메서드와 독립적이지만 GET 요청에서 수신된 콘텐츠에는 일반적으로 정의된 의미론이 없으며, 요청의 의미나 대상을 변경할 수 없고, 요청 스머글링 공격의 가능성 때문에 일부 구현이 요청을 거부하고 연결을 닫게 할 수 있습니다([HTTP/1.1]의 11.2절). 클라이언트는 그러한 요청이 목적을 가지고 충분히 지원될 것임을 이전에 대역 내 또는 대역 외로 나타낸 오리진 서버에 직접 요청하는 경우가 아니라면 GET 요청에 콘텐츠를 SHOULD NOT 생성해야 합니다. 오리진 서버는 콘텐츠를 수신하기 위해 비공개 합의에 의존하지 않는 것이 SHOULD NOT 요구됩니다. HTTP 통신의 참여자는 요청 체인에 있는 중개자를 모르는 경우가 많기 때문입니다.

GET 요청에 대한 응답은 캐시 가능합니다. [CACHING]의 5.2절에 정의된 Cache-Control 헤더 필드에서 달리 표시하지 않는 한 캐시는 후속 GET 및 HEAD 요청을 충족하는 데 이를 MAY 사용할 수 있습니다.

GET을 사용하는 양식의 쿼리 필드와 같이 사용자가 제공한 정보로 대상 URI를 구성하는 메커니즘으로 정보 검색을 수행할 때 URI 안에서 공개하기에 적절하지 않은 잠재적으로 민감한 데이터가 제공될 수 있습니다(17.9절 참조). 어떤 경우에는 그러한 정보를 드러내지 않도록 데이터를 필터링하거나 변환할 수 있습니다. 다른 경우, 특히 응답을 캐싱해 얻는 이점이 없는 경우에는 GET 대신 POST 메서드(9.3.3절)를 사용하면 그러한 정보를 대상 URI가 아닌 요청 콘텐츠로 전송할 수 있습니다.

9.3.3. POST

POST 메서드는 대상 리소스가 요청에 포함된 표현을 리소스 자체의 특정 의미론에 따라 처리하도록 요청합니다. 예를 들어 POST는 다음 기능 등에 사용됩니다.

  • HTML 양식에 입력된 필드와 같은 데이터 블록을 데이터 처리 프로세스에 제공하기
  • 게시판, 뉴스그룹, 메일링 리스트, 블로그 또는 이와 유사한 게시물 그룹에 메시지를 게시하기
  • 오리진 서버가 아직 식별하지 않은 새 리소스를 생성하기, 그리고
  • 리소스의 기존 표현에 데이터를 추가하기

오리진 서버는 POST 요청 처리 결과에 따라 적절한 상태 코드를 선택하여 응답 의미론을 나타냅니다. 이 사양에서 정의하는 거의 모든 상태 코드를 POST에 대한 응답으로 받을 수 있습니다(예외는 206 (부분 콘텐츠), 304 (수정되지 않음) 및 416 (만족할 수 없는 범위)입니다).

POST 요청을 성공적으로 처리한 결과 오리진 서버에 하나 이상의 리소스가 생성되었다면, 오리진 서버는 생성된 주 리소스의 식별자를 제공하는 Location 헤더 필드(10.2.2절)와 새 리소스를 참조하면서 요청의 상태를 설명하는 표현을 포함하는 201 (생성됨) 응답을 SHOULD 전송해야 합니다.

POST 요청에 대한 응답은 명시적인 신선도 정보([CACHING]의 4.2.1절)와 POST의 대상 URI와 동일한 값을 가진 Content-Location 헤더 필드(8.7절)를 포함하는 경우에만 캐시할 수 있습니다. 캐시된 POST 응답은 이후 GET 또는 HEAD 요청을 충족하는 데 재사용할 수 있습니다. 반면 POST는 잠재적으로 안전하지 않으므로 POST 요청은 캐시된 POST 응답으로 충족할 수 없습니다. [CACHING]의 4절을 참조하십시오.

POST 처리 결과가 기존 리소스의 표현과 동등하다면 오리진 서버는 Location 필드에 기존 리소스의 식별자를 포함하는 303 (다른 위치 참조) 응답을 전송하여 사용자 에이전트를 해당 리소스로 MAY 리디렉션할 수 있습니다. 이 방법은 사용자 에이전트에 리소스 식별자를 제공하고 공유 캐싱에 더 적합한 메서드를 통해 표현을 전송할 수 있다는 이점이 있지만, 사용자 에이전트가 표현을 이미 캐시하지 않은 경우 추가 요청이 필요하다는 비용이 있습니다.

9.3.4. PUT

PUT 메서드는 대상 리소스의 상태를 요청 메시지 콘텐츠에 포함된 표현이 정의하는 상태로 생성하거나 대체하도록 요청합니다. 특정 표현의 PUT이 성공했다면 동일한 대상 리소스에 대한 후속 GET은 200 (OK) 응답으로 동등한 표현을 전송할 것임을 시사합니다. 그러나 대상 리소스가 다른 사용자 에이전트에 의해 병렬로 처리되거나 후속 GET이 수신되기 전에 오리진 서버에서 동적인 처리를 받을 수 있으므로 그러한 상태 변경이 관찰 가능하다는 보장은 없습니다. 성공적인 응답은 오리진 서버가 요청을 처리한 시점에 사용자 에이전트의 의도가 달성되었음을 의미할 뿐입니다.

대상 리소스에 현재 표현이 없고 PUT이 성공적으로 하나를 생성한다면 오리진 서버는 201 (생성됨) 응답을 전송하여 사용자 에이전트에 이를 MUST 알려야 합니다. 대상 리소스에 현재 표현이 있고 포함된 표현의 상태에 따라 해당 표현이 성공적으로 수정된다면 오리진 서버는 요청의 성공적인 완료를 나타내기 위해 200 (OK) 또는 204 (콘텐츠 없음) 응답 중 하나를 MUST 전송해야 합니다.

오리진 서버는 PUT 표현이 대상 리소스에 대해 구성된 제약 조건과 일치하는지 SHOULD 확인해야 합니다. 예를 들어 오리진 서버가 URI를 기반으로 리소스의 표현 메타데이터를 결정한다면 성공적인 PUT 요청으로 수신된 콘텐츠가 해당 메타데이터와 일치하는지 확인해야 합니다. PUT 표현이 대상 리소스와 일치하지 않는 경우 오리진 서버는 표현을 변환하거나 리소스 구성을 변경하여 둘을 일치시키거나, 표현이 부적절한 이유를 설명할 충분한 정보가 포함된 적절한 오류 메시지로 응답하는 것이 SHOULD 요구됩니다. 409 (충돌) 또는 415 (지원되지 않는 미디어 유형) 상태 코드가 권장되며, 후자는 Content-Type 값에 대한 제약에 특화되어 있습니다.

예를 들어 대상 리소스가 항상 "text/html"의 Content-Type을 갖도록 구성되어 있고 PUT되는 표현의 Content-Type이 "image/jpeg"이면 오리진 서버는 다음 중 하나를 수행하는 것이 바람직합니다.

  1. 새 미디어 유형을 반영하도록 대상 리소스를 다시 구성하거나,
  2. 새 리소스 상태로 저장하기 전에 PUT 표현을 리소스 형식과 일치하는 형식으로 변환하거나,
  3. 대상 리소스가 "text/html"로 제한됨을 나타내는 415 (지원되지 않는 미디어 유형) 응답으로 요청을 거부하며, 새 표현에 적합한 대상이 될 다른 리소스에 대한 링크를 포함할 수 있습니다.

HTTP는 사용자 에이전트 요청의 의도와 오리진 서버 응답의 의미론으로 표현할 수 있는 범위를 넘어 PUT 메서드가 오리진 서버의 상태에 정확히 어떤 영향을 주는지 정의하지 않습니다. HTTP를 통해 제공되는 인터페이스를 넘어 리소스가 무엇일 수 있는지도 어떤 의미에서도 정의하지 않습니다. 리소스 상태가 어떻게 "저장"되는지, 리소스 상태 변경으로 그러한 저장소가 어떻게 변경될 수 있는지, 오리진 서버가 리소스 상태를 표현으로 변환하는 방법도 정의하지 않습니다. 일반적으로 리소스 인터페이스 뒤의 모든 구현 세부 사항은 서버에 의해 의도적으로 숨겨집니다.

이는 헤더 및 트레일러 필드가 저장되는 방식에도 적용됩니다. Content-Type 같은 일반적인 헤더 필드는 보통 저장되고 이후 GET 요청에서 반환되지만, 헤더와 트레일러 필드 처리는 요청을 수신한 리소스에 따라 다릅니다. 따라서 오리진 서버는 PUT 요청에서 수신한 인식되지 않는 헤더 및 트레일러 필드를 SHOULD 무시해야 합니다(즉, 리소스 상태의 일부로 저장하지 않아야 합니다).

오리진 서버는 요청의 표현 데이터가 콘텐츠에 아무런 변환도 적용하지 않고 저장되었고(즉, 리소스의 새 표현 데이터가 PUT 요청에서 수신된 콘텐츠와 동일함), 검증자 필드 값이 새 표현을 반영하는 경우가 아니라면 성공적인 PUT 응답에 8.8절의 검증자 필드, 예를 들어 ETag 또는 Last-Modified 필드를 MUST NOT 전송해야 합니다. 이 요구사항을 통해 사용자 에이전트는 자신이 전송하고 메모리에 유지한 표현이 PUT의 결과임을 알 수 있으므로 오리진 서버에서 다시 검색할 필요가 없습니다. 응답에서 수신한 새 검증자는 우발적인 덮어쓰기를 방지하기 위한 향후 조건부 요청에 사용할 수 있습니다(13.1절).

POST와 PUT 메서드의 근본적인 차이는 포함된 표현에 대한 서로 다른 의도에서 드러납니다. POST 요청의 대상 리소스는 포함된 표현을 리소스 자체의 의미론에 따라 처리하도록 의도되는 반면, PUT 요청에 포함된 표현은 대상 리소스의 상태를 대체하는 것으로 정의됩니다. 따라서 PUT의 의도는 멱등이며 중개자에게도 가시적이지만 정확한 효과는 오리진 서버만 알고 있습니다.

PUT 요청을 올바르게 해석하려면 사용자 에이전트가 어떤 대상 리소스를 원하는지 알고 있다고 전제합니다. 상태 변경 요청을 받은 후 클라이언트를 대신하여 적절한 URI를 선택하는 서비스는 PUT 대신 POST 메서드를 사용하여 구현하는 것이 SHOULD 요구됩니다. 오리진 서버가 대상 리소스에 요청된 PUT 상태 변경을 수행하지 않고 리소스가 다른 URI로 이동한 경우처럼 다른 리소스에 적용하려는 경우 오리진 서버는 적절한 3xx (리디렉션) 응답을 MUST 전송해야 합니다. 그러면 사용자 에이전트는 요청을 리디렉션할지 여부를 MAY 스스로 결정할 수 있습니다.

대상 리소스에 적용된 PUT 요청은 다른 리소스에 부작용을 줄 수 있습니다. 예를 들어 어떤 게시물에는 "현재 버전"(리소스)을 식별하는 URI가 있고, 각각의 특정 버전(한 시점에 현재 버전 리소스와 동일한 상태를 공유했던 다른 리소스)을 식별하는 URI와 별개일 수 있습니다. 따라서 "현재 버전" URI에 대한 성공적인 PUT 요청은 대상 리소스의 상태를 변경하는 것 외에도 새 버전 리소스를 생성할 수 있으며, 관련 리소스 사이에 링크가 추가되도록 할 수도 있습니다.

일부 오리진 서버는 Content-Range 헤더 필드(14.4절)를 14.5절에 설명된 부분 PUT을 수행하기 위한 요청 수정자로 사용하는 것을 지원합니다.

PUT 메서드에 대한 응답은 캐시할 수 없습니다. 성공적인 PUT 요청이 대상 URI에 대해 하나 이상의 저장된 응답을 가진 캐시를 통과하면 해당 저장된 응답은 무효화됩니다([CACHING]의 4.4절 참조).

9.3.5. DELETE

DELETE 메서드는 오리진 서버가 대상 리소스와 현재 기능 사이의 연결을 제거하도록 요청합니다. 사실상 이 메서드는 UNIX의 "rm" 명령과 유사합니다. 이전에 연결된 정보 자체가 삭제될 것이라는 기대보다는 오리진 서버의 URI 매핑에 대한 삭제 작업을 나타냅니다.

대상 리소스에 하나 이상의 현재 표현이 있다면 리소스의 성격과 오리진 서버의 구현에 따라 오리진 서버가 이를 파기할 수도 있고 하지 않을 수도 있으며, 관련 저장소를 회수할 수도 있고 하지 않을 수도 있습니다(이는 이 사양의 범위를 벗어남). 마찬가지로 데이터베이스 또는 게이트웨이 연결과 같은 리소스의 다른 구현 측면도 DELETE의 결과로 비활성화되거나 보관되어야 할 수 있습니다. 일반적으로 오리진 서버는 삭제를 수행하기 위한 정해진 메커니즘이 있는 리소스에 대해서만 DELETE를 허용한다고 가정합니다.

DELETE 메서드를 허용하는 리소스는 비교적 적습니다. 주된 용도는 사용자가 그 효과를 어느 정도 제어하는 원격 작성 환경입니다. 예를 들어 이전에 PUT 요청으로 생성되었거나 POST 요청에 대한 201 (생성됨) 응답 후 Location 헤더 필드로 식별된 리소스는 그러한 작업을 되돌리기 위한 대응 DELETE 요청을 허용할 수 있습니다. 마찬가지로 HTTP를 원격 작업에 사용하는 버전 관리 클라이언트와 같이 작성 기능을 구현하는 사용자 지정 사용자 에이전트는 서버의 URI 공간이 버전 저장소에 대응하도록 구성되었다는 가정하에 DELETE를 사용할 수 있습니다.

DELETE 메서드가 성공적으로 적용되면 오리진 서버는 다음 중 하나를 SHOULD 전송해야 합니다.

  • 작업이 성공할 가능성이 높지만 아직 수행되지 않았다면 202 (수락됨) 상태 코드,
  • 작업이 수행되었고 추가 정보를 제공하지 않는다면 204 (콘텐츠 없음) 상태 코드, 또는
  • 작업이 수행되었고 응답 메시지에 상태를 설명하는 표현이 포함된다면 200 (OK) 상태 코드

요청 메시지 프레이밍은 사용된 메서드와 독립적이지만 DELETE 요청에서 수신된 콘텐츠에는 일반적으로 정의된 의미론이 없으며, 요청의 의미나 대상을 변경할 수 없고, 요청 스머글링 공격의 가능성 때문에 일부 구현이 요청을 거부하고 연결을 닫게 할 수 있습니다([HTTP/1.1]의 11.2절). 클라이언트는 그러한 요청이 목적을 가지고 충분히 지원될 것임을 이전에 대역 내 또는 대역 외로 나타낸 오리진 서버에 직접 요청하는 경우가 아니라면 DELETE 요청에 콘텐츠를 SHOULD NOT 생성해야 합니다. 오리진 서버는 콘텐츠를 수신하기 위해 비공개 합의에 의존하지 않는 것이 SHOULD NOT 요구됩니다. HTTP 통신의 참여자는 요청 체인에 있는 중개자를 모르는 경우가 많기 때문입니다.

DELETE 메서드에 대한 응답은 캐시할 수 없습니다. 성공적인 DELETE 요청이 대상 URI에 대해 하나 이상의 저장된 응답이 있는 캐시를 통과하면 해당 저장된 응답은 무효화됩니다([CACHING]의 4.4절 참조).

9.3.6. CONNECT

CONNECT 메서드는 수신자가 요청 대상으로 식별된 대상 오리진 서버에 터널을 설정하고, 성공하면 그 이후 터널이 닫힐 때까지 양방향으로 데이터를 단순 전달하는 동작으로 제한하도록 요청합니다. 터널은 일반적으로 하나 이상의 프록시를 통해 종단 간 가상 연결을 만든 다음 TLS (전송 계층 보안, [TLS13])를 사용해 보호하는 데 사용됩니다.

CONNECT는 이 메서드에 고유한 특별한 요청 대상 형식을 사용하며, 터널 대상의 host 및 port 번호만 콜론으로 구분하여 구성합니다. 기본 port는 없습니다. CONNECT 요청이 port가 생략된 authority 구성요소를 포함하는 URI 참조를 기반으로 하더라도 클라이언트는 port 번호를 MUST 전송해야 합니다(4.1절). 예:

CONNECT server.example.com:80 HTTP/1.1
Host: server.example.com

서버는 비어 있거나 유효하지 않은 port 번호를 대상으로 하는 CONNECT 요청을 MUST 거부해야 하며, 일반적으로 400 (잘못된 요청) 상태 코드로 응답합니다.

CONNECT는 HTTP 연결의 요청/응답 성격을 변경하므로 특정 HTTP 버전은 그 의미론을 프로토콜의 전송 형식에 매핑하는 방식이 다를 수 있습니다.

CONNECT는 프록시에 대한 요청에 사용하도록 의도되었습니다. 수신자는 요청 대상으로 식별된 서버에 직접 연결하거나, 다른 프록시를 사용하도록 구성된 경우 CONNECT 요청을 다음 인바운드 프록시로 전달하여 터널을 설정할 수 있습니다. 오리진 서버는 CONNECT 요청을 MAY 수락할 수 있지만 대부분의 오리진 서버는 CONNECT를 구현하지 않습니다.

모든 2xx (성공) 응답은 송신자(및 모든 인바운드 프록시)가 응답 헤더 섹션 직후 터널 모드로 전환한다는 것을 나타냅니다. 해당 헤더 섹션 뒤에 수신되는 데이터는 요청 대상으로 식별된 서버에서 온 것입니다. 성공적인 응답이 아닌 모든 응답은 아직 터널이 형성되지 않았음을 나타냅니다.

터널 중개자가 어느 한쪽이 연결을 닫았음을 감지하면 터널이 닫힙니다. 중개자는 닫힌 쪽에서 온 아직 전송되지 않은 모든 데이터를 다른 쪽으로 보내려고 MUST 시도하고, 두 연결을 모두 닫은 다음 전달되지 않고 남은 데이터를 버려야 합니다.

프록시 인증을 사용하여 터널을 생성할 권한을 설정할 수 있습니다. 예:

CONNECT server.example.com:443 HTTP/1.1
Host: server.example.com:443
Proxy-Authorization: basic aGVsbG86d29ybGQ=

임의의 서버에 터널을 설정하는 데에는 상당한 위험이 있으며, 특히 대상이 웹 트래픽용이 아닌 잘 알려진 또는 예약된 TCP 포트인 경우 그렇습니다. 예를 들어 "example.com:25"에 CONNECT를 수행하면 프록시가 SMTP 트래픽용 예약 포트에 연결하도록 요청하는 것입니다. 이를 허용하면 프록시가 스팸 이메일을 중계하도록 속일 수 있습니다. CONNECT를 지원하는 프록시는 사용을 알려진 제한된 포트 집합이나 구성 가능한 안전한 요청 대상 목록으로 제한하는 것이 SHOULD 요구됩니다.

서버는 CONNECT에 대한 2xx (성공) 응답에서 어떠한 Transfer-Encoding 또는 Content-Length 헤더 필드도 MUST NOT 전송해야 합니다. 클라이언트는 CONNECT에 대한 성공적인 응답에서 수신한 Content-Length 또는 Transfer-Encoding 헤더 필드를 MUST 무시해야 합니다.

CONNECT 요청 메시지에는 콘텐츠가 없습니다. CONNECT 요청 메시지의 헤더 섹션 뒤에 전송된 데이터의 해석은 사용 중인 HTTP 버전에 따라 다릅니다.

CONNECT 메서드에 대한 응답은 캐시할 수 없습니다.

9.3.7. OPTIONS

OPTIONS 메서드는 오리진 서버 또는 개입하는 중개자에서 대상 리소스에 사용할 수 있는 통신 옵션에 관한 정보를 요청합니다. 이 메서드를 사용하면 클라이언트가 리소스 동작을 암시하지 않고 리소스와 관련된 옵션 및/또는 요구사항이나 서버의 기능을 결정할 수 있습니다.

요청 대상(7.1절)으로 별표("*")를 사용하는 OPTIONS 요청은 특정 리소스가 아닌 서버 전체에 적용됩니다. 서버의 통신 옵션은 일반적으로 리소스에 따라 달라지므로 "*" 요청은 "ping" 또는 "no-op" 유형의 메서드로만 유용합니다. 이는 클라이언트가 서버의 기능을 테스트할 수 있게 하는 것 외에는 아무 작업도 하지 않습니다. 예를 들어 프록시가 HTTP/1.1에 적합한지 여부를 테스트하는 데 사용할 수 있습니다.

요청 대상이 별표가 아니면 OPTIONS 요청은 대상 리소스와 통신할 때 사용할 수 있는 옵션에 적용됩니다.

OPTIONS에 대한 성공적인 응답을 생성하는 서버는 서버가 구현하고 대상 리소스에 적용되는 선택적 기능을 나타낼 수 있는 모든 헤더 (예: Allow)를 이 사양에서 정의하지 않은 잠재적 확장을 포함해 SHOULD 전송해야 합니다. 응답 콘텐츠가 있다면 기계 또는 사람이 읽을 수 있는 표현으로 통신 옵션을 설명할 수도 있습니다. 그러한 표현의 표준 형식은 이 사양에서 정의하지 않지만 향후 HTTP 확장에서 정의할 수 있습니다.

클라이언트는 요청 체인에서 특정 수신자를 대상으로 하기 위해 OPTIONS 요청에 Max-Forwards 헤더 필드를 MAY 전송할 수 있습니다(7.6.2절 참조). 프록시는 요청을 전달할 때 해당 요청이 Max-Forwards 필드와 함께 수신된 경우가 아니라면 Max-Forwards 헤더 필드를 MUST NOT 생성해야 합니다.

콘텐츠를 포함하는 OPTIONS 요청을 생성하는 클라이언트는 표현 미디어 유형을 설명하는 유효한 Content-Type 헤더 필드를 MUST 전송해야 합니다. 이 사양은 그러한 콘텐츠의 용도를 정의하지 않는다는 점에 유의하십시오.

OPTIONS 메서드에 대한 응답은 캐시할 수 없습니다.

9.3.8. TRACE

TRACE 메서드는 요청 메시지의 원격 애플리케이션 수준 루프백을 요청합니다. 요청의 최종 수신자는 아래에 설명된 일부 필드를 제외하고 수신한 메시지를 200 (OK) 응답의 콘텐츠로 클라이언트에 되돌려 보내는 것이 SHOULD 요구됩니다. "message/http" 형식( [HTTP/1.1]의 10.1절)은 이를 수행하는 한 가지 방법입니다. 최종 수신자는 오리진 서버이거나 요청에서 0의 Max-Forwards 값을 처음 수신한 서버입니다(7.6.2절).

클라이언트는 응답에 의해 공개될 수 있는 민감한 데이터를 포함하는 필드를 TRACE 요청에 MUST NOT 생성해야 합니다. 예를 들어 사용자 에이전트가 저장된 사용자 자격 증명(11절)이나 쿠키 [COOKIE]를 TRACE 요청으로 전송하는 것은 바람직하지 않습니다. 요청의 최종 수신자는 응답 콘텐츠를 생성할 때 민감한 데이터를 포함할 가능성이 있는 모든 요청 필드를 SHOULD 제외해야 합니다.

TRACE를 사용하면 클라이언트는 요청 체인의 반대편에서 무엇이 수신되고 있는지 확인하고 해당 데이터를 테스트 또는 진단 정보에 사용할 수 있습니다. Via 헤더 필드(7.6.3절) 값은 요청 체인의 추적 역할을 하므로 특히 유용합니다. Max-Forwards 헤더 필드를 사용하면 클라이언트가 요청 체인의 길이를 제한할 수 있으며, 메시지를 무한 루프로 전달하는 프록시 체인을 테스트하는 데 유용합니다.

클라이언트는 TRACE 요청에 콘텐츠를 MUST NOT 전송해야 합니다.

TRACE 메서드에 대한 응답은 캐시할 수 없습니다.

10. 메시지 컨텍스트

10.1. 요청 컨텍스트 필드

아래 요청 헤더 필드는 요청 뒤의 사용자, 사용자 에이전트 및 리소스에 관한 정보를 포함해 요청 컨텍스트에 대한 추가 정보를 제공합니다.

10.1.1. Expect

요청의 "Expect" 헤더 필드는 이 요청을 올바르게 처리하기 위해 서버가 지원해야 하는 특정 동작 집합 (기대 사항)을 나타냅니다.

Expect 필드 값은 대소문자를 구분하지 않습니다.

이 사양에서 정의하는 유일한 기대 사항은 "100-continue"입니다(정의된 매개변수 없음).

100-continue 이외의 멤버를 포함하는 Expect 필드 값을 수신한 서버는 예상하지 못한 기대 사항을 충족할 수 없음을 나타내기 위해 417 (기대 조건 실패) 상태 코드로 MAY 응답할 수 있습니다.

100-continue 기대 사항은 클라이언트가 이 요청에서 (아마 큰) 콘텐츠를 전송하려 하며, 메서드, 대상 URI 및 헤더 필드만으로 즉시 성공, 리디렉션 또는 오류 응답을 만들기에 충분하지 않다면 100 (계속) 임시 응답을 받고자 한다는 것을 수신자에게 알립니다. 이를 통해 클라이언트는 실제로 콘텐츠를 전송하기 전에 전송할 가치가 있다는 표시를 기다릴 수 있으므로 데이터가 매우 크거나 클라이언트가 오류가 발생할 가능성이 높다고 예상할 때 효율성을 높일 수 있습니다(예: 이전에 검증한 인증 자격 증명 없이 처음으로 상태 변경 메서드를 전송하는 경우).

예를 들어 다음으로 시작하는 요청은

PUT /somewhere/fun HTTP/1.1
Host: origin.example.com
Content-Type: video/h264
Content-Length: 1234567890987
Expect: 100-continue

클라이언트가 불필요한 데이터 전송으로 연결을 채우기 시작하기 전에 오리진 서버가 401 (인증되지 않음) 또는 405 (허용되지 않는 메서드)와 같은 오류 메시지로 즉시 응답할 수 있게 합니다.

클라이언트 요구사항:

  • 클라이언트는 콘텐츠를 포함하지 않는 요청에 100-continue 기대 사항을 MUST NOT 생성해야 합니다.
  • 요청 콘텐츠를 전송하기 전에 100 (계속) 응답을 기다릴 클라이언트는 100-continue 기대 사항을 포함하는 Expect 헤더 필드를 MUST 전송해야 합니다.
  • 100-continue 기대 사항을 전송하는 클라이언트는 특정 시간만큼 기다릴 필요가 없습니다. 그러한 클라이언트는 아직 응답을 받지 못했더라도 콘텐츠 전송을 MAY 진행할 수 있습니다. 또한 100 (계속) 응답은 HTTP/1.0 중개자를 통과해 전송될 수 없으므로 그러한 클라이언트는 콘텐츠를 전송하기 전에 무기한 기다리지 않는 것이 SHOULD NOT 요구됩니다.
  • 100-continue 기대 사항을 포함한 요청에 대한 응답으로 417 (기대 조건 실패) 상태 코드를 수신한 클라이언트는 100-continue 기대 사항 없이 해당 요청을 SHOULD 반복해야 합니다. 417 응답은 응답 체인이 기대 사항을 지원하지 않음을 나타낼 뿐이기 때문입니다(예: HTTP/1.0 서버를 통과함).

서버 요구사항:

  • HTTP/1.0 요청에서 100-continue 기대 사항을 수신한 서버는 해당 기대 사항을 MUST 무시해야 합니다.
  • 서버가 대응하는 요청의 콘텐츠 일부 또는 전부를 이미 수신했거나 프레이밍이 콘텐츠가 없음을 나타낸다면 100 (계속) 응답 전송을 MAY 생략할 수 있습니다.
  • 100 (계속) 응답을 전송하는 서버는 연결이 조기에 닫히지 않는 한 요청 콘텐츠를 수신하고 처리한 후 최종 상태 코드를 MUST 전송해야 합니다.
  • 전체 요청 콘텐츠를 읽기 전에 최종 상태 코드로 응답하는 서버는 연결을 닫을지([HTTP/1.1]의 9.6절 참조) 또는 요청 콘텐츠를 계속 읽을지 SHOULD 나타내야 합니다.

100-continue 기대 사항과 요청 콘텐츠가 뒤따를 것이라는 표시를 포함하는 메서드, 대상 URI 및 완전한 헤더 섹션을 가진 HTTP/1.1(또는 이후) 요청을 수신하면 오리진 서버는 다음 중 하나를 MUST 전송해야 합니다.

  • 메서드, 대상 URI 및 헤더 필드만 검사하여 해당 상태를 결정할 수 있다면 최종 상태 코드가 있는 즉시 응답, 또는
  • 클라이언트가 요청 콘텐츠를 전송하도록 유도하는 즉시 100 (계속) 응답

오리진 서버는 100 (계속) 응답을 전송하기 전에 콘텐츠를 기다려서는 MUST NOT 됩니다.

100-continue 기대 사항을 포함하고 요청 콘텐츠가 뒤따를 것임을 나타내는 메서드, 대상 URI 및 완전한 헤더 섹션을 가진 HTTP/1.1(또는 이후) 요청을 수신하면 프록시는 다음 중 하나를 MUST 해야 합니다.

  • 메서드, 대상 URI 및 헤더 필드만 검사하여 해당 상태를 결정할 수 있다면 최종 상태 코드가 있는 즉시 응답을 전송하거나,
  • 대응하는 요청 라인과 헤더 섹션을 다음 인바운드 서버에 전송하여 요청을 오리진 서버 방향으로 전달합니다.

프록시가 구성이나 과거 상호작용을 통해 다음 인바운드 서버가 HTTP/1.0만 지원한다고 판단하면, 프록시는 클라이언트가 콘텐츠 전송을 시작하도록 유도하기 위해 즉시 100 (계속) 응답을 MAY 생성할 수 있습니다.

10.1.2. From

"From" 헤더 필드는 요청하는 사용자 에이전트를 제어하는 사람의 인터넷 이메일 주소를 포함합니다. 해당 주소는 [RFC5322]의 3.4절에서 "mailbox"로 정의된 것처럼 기계가 사용할 수 있는 것이 바람직합니다.

  From    = mailbox

  mailbox = <mailbox, see [RFC5322], Section 3.4>

예:

From: spider-admin@example.org

From 헤더 필드는 로봇이 아닌 사용자 에이전트가 전송하는 경우가 드뭅니다. 사용자 에이전트는 사용자가 명시적으로 구성하지 않은 경우 From 헤더 필드를 SHOULD NOT 전송해야 합니다. 이는 사용자의 개인정보 보호 이익이나 사이트의 보안 정책과 충돌할 수 있기 때문입니다.

로봇 사용자 에이전트는 과도하거나 원하지 않거나 유효하지 않은 요청을 로봇이 전송하는 경우처럼 서버에 문제가 발생했을 때 로봇 운영 책임자에게 연락할 수 있도록 유효한 From 헤더 필드를 SHOULD 전송해야 합니다.

서버는 접근 제어 또는 인증에 From 헤더 필드를 SHOULD NOT 사용해야 합니다. 그 값은 요청을 수신하거나 관찰하는 누구에게나 표시될 것으로 예상되며 개인정보 보호에 대한 기대 없이 로그 파일과 오류 보고서에 기록되는 경우가 많기 때문입니다.

10.1.3. Referer

"Referer" [sic] 헤더 필드를 사용하면 사용자 에이전트가 대상 URI를 얻은 리소스의 URI 참조를 지정할 수 있습니다 (즉, "referrer"이지만 필드 이름의 철자가 잘못됨). 사용자 에이전트는 Referer 필드 값을 생성할 때 URI 참조의 프래그먼트 및 userinfo 구성요소가 있다면 이를 MUST NOT 포함해야 합니다 [URI].

필드 값은 absolute-URI 또는 partial-URI입니다. 후자의 경우(4절) 참조되는 URI는 대상 URI를 기준으로 합니다([URI], 5절).

Referer 헤더 필드를 사용하면 서버가 간단한 분석, 로깅, 최적화된 캐싱 등을 위해 다른 리소스로 돌아가는 링크를 생성할 수 있습니다. 또한 오래되거나 잘못 입력된 링크를 유지 관리 목적으로 찾을 수 있습니다. 일부 서버는 Referer 헤더 필드를 다른 사이트의 링크(이른바 "딥 링크")를 거부하거나 사이트 간 요청 위조(CSRF)를 제한하는 수단으로 사용하지만 모든 요청에 이 필드가 있는 것은 아닙니다.

예:

Referer: http://www.example.org/hypertext/Overview.html

대상 URI를 자체 URI가 없는 소스(예: 사용자의 키보드 입력 또는 사용자의 북마크/즐겨찾기 항목)에서 얻은 경우 사용자 에이전트는 Referer 헤더 필드를 제외하거나 "about:blank" 값으로 전송하도록 MUST 해야 합니다.

Referer 헤더 필드 값은 참조하는 리소스의 전체 URI를 전달할 필요가 없습니다. 사용자 에이전트는 참조 오리진 이외의 부분을 MAY 잘라낼 수 있습니다.

Referer 헤더 필드는 요청 컨텍스트 또는 사용자의 탐색 기록에 관한 정보를 드러낼 가능성이 있습니다. 참조하는 리소스의 식별자가 개인 정보(예: 계정 이름)나 기밀이어야 하는 리소스(예: 방화벽 뒤 또는 보호된 서비스 내부)를 드러낸다면 이는 개인정보 보호 문제입니다. 대부분의 범용 사용자 에이전트는 참조 리소스가 로컬 "file" 또는 "data" URI인 경우 Referer 헤더 필드를 전송하지 않습니다. 참조 리소스가 보안 프로토콜을 통해 접근되었고 요청 대상의 오리진이 참조 리소스의 오리진과 다르면, 참조 리소스가 Referer 전송을 명시적으로 허용하지 않는 한 사용자 에이전트는 Referer 헤더 필드를 SHOULD NOT 전송해야 합니다. 참조 리소스가 보안 프로토콜을 통해 접근되었다면 사용자 에이전트는 보호되지 않은 HTTP 요청에 Referer 헤더 필드를 MUST NOT 전송해야 합니다. 추가 보안 고려사항은 17.9절을 참조하십시오.

일부 중개자는 발신 요청에서 Referer 헤더 필드를 무차별적으로 제거하는 것으로 알려져 있습니다. 이는 사용자에게 훨씬 더 큰 피해를 줄 수 있는 CSRF 공격에 대한 보호를 방해하는 바람직하지 않은 부작용을 일으킵니다. Referer에서 정보 공개를 제한하려는 중개자 및 사용자 에이전트 확장은 내부 도메인 이름을 가명으로 대체하거나 query 및/또는 path 구성요소를 잘라내는 것과 같은 특정 편집으로 변경을 제한하는 것이 바람직합니다. 필드 값이 대상 URI와 동일한 scheme 및 host를 공유하는 경우 중개자는 Referer 헤더 필드를 SHOULD NOT 수정하거나 삭제해야 합니다.

10.1.4. TE

"TE" 헤더 필드는 전송 코딩 및 트레일러 섹션에 관한 클라이언트의 기능을 설명합니다.

6.5절에 설명된 대로 요청에서 전송된 "trailers" 멤버를 가진 TE 필드는 클라이언트가 트레일러 필드를 버리지 않음을 나타냅니다.

TE는 HTTP/1.1에서 클라이언트가 응답에서 수락할 수 있는 전송 코딩을 서버에 알리는 데도 사용됩니다. 이 문서가 게시된 시점에는 HTTP/1.1만 전송 코딩을 사용합니다([HTTP/1.1]의 7절 참조).

TE 필드 값은 멤버 목록이며, 각 멤버("trailers" 제외)는 해당 전송 코딩에 대한 클라이언트의 상대적 선호도를 나타내는 선택적 가중치(12.4.2절)와 해당 전송 코딩의 선택적 매개변수가 있는 전송 코딩 이름 토큰으로 구성됩니다.

TE 송신자는 중개자에게 이 필드를 전달하지 않도록 알리기 위해 Connection 헤더 필드(7.6.1절) 안에 "TE" 연결 옵션도 MUST 전송해야 합니다.

10.1.5. User-Agent

"User-Agent" 헤더 필드는 요청을 생성한 사용자 에이전트에 관한 정보를 포함하며, 서버가 보고된 상호운용성 문제의 범위를 식별하고, 특정 사용자 에이전트의 제한을 피하도록 응답을 우회하거나 조정하고, 브라우저 또는 운영 체제 사용에 관한 분석을 수행하는 데 자주 사용됩니다. 사용자 에이전트는 특별히 그렇게 하지 않도록 구성된 경우가 아니라면 각 요청에 User-Agent 헤더 필드를 SHOULD 전송해야 합니다.

User-Agent 필드 값은 하나 이상의 제품 식별자로 구성되며, 각 식별자 뒤에는 0개 이상의 주석(5.6.5절)이 오고, 이들을 함께 사용하여 사용자 에이전트 소프트웨어와 주요 하위 제품을 식별합니다. 관례상 제품 식별자는 사용자 에이전트 소프트웨어를 식별하는 데 중요한 순서대로 나열됩니다. 각 제품 식별자는 이름과 선택적 버전으로 구성됩니다.

송신자는 생성하는 제품 식별자를 제품 식별에 필요한 정보로 제한하는 것이 SHOULD 요구됩니다. 송신자는 제품 식별자 안에 광고 또는 그 밖의 불필요한 정보를 MUST NOT 생성해야 합니다. 송신자는 product-version 안에 버전 식별자가 아닌 정보를 SHOULD NOT 생성해야 합니다(즉, 동일한 제품 이름의 후속 버전은 제품 식별자의 product-version 부분에서만 달라지는 것이 바람직합니다).

예:

User-Agent: CERN-LineMode/2.15 libwww/2.17b3

사용자 에이전트는 불필요하게 세분화된 세부 정보를 포함하는 User-Agent 헤더 필드를 SHOULD NOT 생성해야 하며 제3자가 추가하는 하위 제품을 SHOULD 제한해야 합니다. 지나치게 길고 상세한 User-Agent 필드 값은 요청 지연 시간과 사용자가 원하지 않는데도 식별될 위험("핑거프린팅")을 증가시킵니다.

마찬가지로 구현은 다른 구현과의 호환성을 선언하기 위해 다른 구현의 제품 토큰을 사용하지 않는 것이 권장됩니다. 이는 필드의 목적을 우회하기 때문입니다. 사용자 에이전트가 다른 사용자 에이전트로 가장하는 경우 실제 사용 중인 사용자 에이전트에서 제대로 작동하지 않을 수 있더라도 수신자는 사용자가 해당 식별된 사용자 에이전트에 맞춘 응답을 의도적으로 보기를 원한다고 가정할 수 있습니다.

10.2. 응답 컨텍스트 필드

아래 응답 헤더 필드는 상태 코드가 암시하는 것 이외에 서버, 대상 리소스 또는 관련 리소스에 관한 정보를 포함한 응답의 추가 정보를 제공합니다.

10.2.1. Allow

"Allow" 헤더 필드는 대상 리소스가 지원한다고 알리는 메서드 집합을 나열합니다. 이 필드의 목적은 리소스와 관련된 유효한 요청 메서드를 수신자에게 알리는 것으로 엄격히 제한됩니다.

사용 예:

Allow: GET, HEAD, PUT

실제로 허용되는 메서드 집합은 각 요청 시점에 오리진 서버가 정의합니다. 오리진 서버는 405 (허용되지 않는 메서드) 응답에 Allow 헤더 필드를 MUST 생성해야 하며, 다른 모든 응답에서도 그렇게 MAY 할 수 있습니다. 빈 Allow 필드 값은 리소스가 어떠한 메서드도 허용하지 않음을 나타내며, 구성에 의해 리소스가 일시적으로 비활성화된 경우 405 응답에서 발생할 수 있습니다.

프록시는 Allow 헤더 필드를 MUST NOT 수정해야 합니다. 일반적인 메시지 처리 규칙에 따라 처리하기 위해 표시된 모든 메서드를 이해할 필요가 없기 때문입니다.

10.2.2. Location

"Location" 헤더 필드는 일부 응답에서 응답과 관련된 특정 리소스를 참조하는 데 사용됩니다. 관계의 유형은 요청 메서드와 상태 코드 의미론의 조합으로 정의됩니다.

필드 값은 하나의 URI-reference로 구성됩니다. 상대 참조 형식([URI], 4.2절)인 경우 최종 값은 대상 URI를 기준으로 해석하여 계산됩니다([URI], 5절).

201 (생성됨) 응답에서 Location 값은 요청에 의해 생성된 주 리소스를 참조합니다. 3xx (리디렉션) 응답에서 Location 값은 요청을 자동으로 리디렉션하기 위한 선호 대상 리소스를 참조합니다.

3xx (리디렉션) 응답에서 제공된 Location 값에 프래그먼트 구성요소가 없다면, 사용자 에이전트는 해당 값이 대상 URI를 생성하는 데 사용된 URI 참조의 프래그먼트 구성요소를 상속한 것처럼 리디렉션을 MUST 처리해야 합니다(즉, 원래 참조에 프래그먼트가 있다면 리디렉션이 이를 상속함).

예를 들어 URI 참조 "http://www.example.org/~tim"에 대해 생성된 GET 요청은 303 (다른 위치 참조) 응답에서 다음 헤더 필드를 포함할 수 있습니다.

Location: /People.html#tim

이는 사용자 에이전트가 "http://www.example.org/People.html#tim"으로 리디렉션할 것을 제안합니다.

마찬가지로 URI 참조 "http://www.example.org/index.html#larry"에 대해 생성된 GET 요청은 301 (영구 이동) 응답에서 다음 헤더 필드를 포함할 수 있습니다.

Location: http://www.example.net/index.html

이는 원래 프래그먼트 식별자를 유지하면서 사용자 에이전트가 "http://www.example.net/index.html#larry"로 리디렉션할 것을 제안합니다.

Location 값의 프래그먼트 식별자가 적절하지 않은 경우도 있습니다. 예를 들어 201 (생성됨) 응답의 Location 헤더 필드는 생성된 리소스에 특화된 URI를 제공하도록 되어 있습니다.

10.2.3. Retry-After

서버는 사용자 에이전트가 후속 요청을 하기 전에 얼마나 기다리는 것이 바람직한지를 나타내기 위해 "Retry-After" 헤더 필드를 전송합니다. 503 (서비스 사용 불가) 응답과 함께 전송된 경우 Retry-After는 클라이언트에게 서비스가 사용할 수 없을 것으로 예상되는 기간을 나타냅니다. 모든 3xx (리디렉션) 응답과 함께 전송된 경우 Retry-After는 사용자 에이전트가 리디렉션된 요청을 보내기 전에 기다리도록 요청받는 최소 시간을 나타냅니다.

Retry-After 필드 값은 HTTP-date 또는 응답을 수신한 후 지연할 초 단위 시간일 수 있습니다.

delay-seconds 값은 초 단위 시간을 나타내는 음이 아닌 십진 정수입니다.

사용 예 두 가지는 다음과 같습니다.

Retry-After: Fri, 31 Dec 1999 23:59:59 GMT
Retry-After: 120

후자의 예에서 지연 시간은 2분입니다.

10.2.4. Server

"Server" 헤더 필드는 오리진 서버가 요청을 처리하는 데 사용하는 소프트웨어에 관한 정보를 포함하며, 클라이언트가 보고된 상호운용성 문제의 범위를 식별하고, 특정 서버 제한을 피하도록 요청을 우회하거나 조정하며, 서버 또는 운영 체제 사용에 관한 분석을 수행하는 데 자주 사용됩니다. 오리진 서버는 응답에 Server 헤더 필드를 MAY 생성할 수 있습니다.

Server 헤더 필드 값은 하나 이상의 제품 식별자로 구성되며, 각 식별자 뒤에는 0개 이상의 주석(5.6.5절)이 오고, 이들을 함께 사용하여 오리진 서버 소프트웨어와 주요 하위 제품을 식별합니다. 관례상 제품 식별자는 오리진 서버 소프트웨어를 식별하는 데 중요한 순서대로 나열됩니다. 각 제품 식별자는 10.1.5절에 정의된 대로 이름과 선택적 버전으로 구성됩니다.

예:

Server: CERN/3.0 libwww/2.17

오리진 서버는 불필요하게 세분화된 세부 정보를 포함하는 Server 헤더 필드를 SHOULD NOT 생성해야 하며 제3자가 추가하는 하위 제품을 SHOULD 제한해야 합니다. 지나치게 길고 상세한 Server 필드 값은 응답 지연 시간을 증가시키고 공격자가 알려진 보안 취약점을 찾아 악용하기를 (조금) 더 쉽게 할 수 있는 내부 구현 세부 정보를 잠재적으로 드러냅니다.

11. HTTP 인증

11.1. 인증 스킴

HTTP는 확장 가능한 챌린지-응답 인증 스킴 집합을 통해 접근 제어 및 인증을 위한 일반적인 프레임워크를 제공합니다. 서버는 이를 사용하여 클라이언트 요청에 챌린지를 제시하고 클라이언트는 인증 정보를 제공할 수 있습니다. 인증 스킴을 식별하는 데 대소문자를 구분하지 않는 토큰을 사용합니다.

  auth-scheme    = token

일반적인 프레임워크를 제외하면 이 문서는 어떠한 인증 스킴도 명시하지 않습니다. 새로운 인증 스킴과 기존 인증 스킴은 독립적으로 명시되며 "Hypertext Transfer Protocol (HTTP) Authentication Scheme Registry"에 등록하는 것이 바람직합니다. 예를 들어 "basic" 및 "digest" 인증 스킴은 각각 [RFC7617] 및 [RFC7616]에서 정의됩니다.

11.2. 인증 매개변수

인증 스킴 뒤에는 해당 스킴을 통해 인증을 달성하는 데 필요한 추가 정보가 쉼표로 구분된 매개변수 목록 또는 base64로 인코딩된 정보를 담을 수 있는 단일 문자 시퀀스로 이어집니다.

  token68        = 1*( ALPHA / DIGIT /
                       "-" / "." / "_" / "~" / "+" / "/" ) *"="

token68 구문은 66개의 예약되지 않은 URI 문자([URI])와 몇 가지 추가 문자를 허용하므로 공백을 제외하고 패딩 유무와 관계없이 base64, base64url(URL 및 파일 이름에 안전한 알파벳), base32 또는 base16(16진수) 인코딩을 담을 수 있습니다([RFC4648]).

인증 매개변수는 이름/값 쌍이며, 이름 토큰은 대소문자를 구분하지 않고 비교되고 각 매개변수 이름은 챌린지당 한 번만 MUST 나타나야 합니다.

  auth-param     = token BWS "=" BWS ( token / quoted-string )

매개변수 값은 "token" 또는 "quoted-string"(5.6절)으로 표현할 수 있습니다. 인증 스킴 정의는 수신자가 인증 스킴과 관계없이 일반적인 구문 분석 구성요소를 사용할 수 있도록 송신자와 수신자 모두에 대해 두 표기법을 허용해야 합니다.

하위 호환성을 위해 인증 스킴 정의는 송신자의 형식을 두 변형 중 하나로 제한할 수 있습니다. 배포된 구현이 두 형식 중 하나를 만났을 때 실패하는 것으로 알려진 경우 이는 중요할 수 있습니다.

11.3. 챌린지 및 응답

401 (인증되지 않음) 응답 메시지는 오리진 서버가 사용자 에이전트의 권한 부여에 챌린지를 제시하는 데 사용하며, 요청된 리소스에 적용 가능한 하나 이상의 챌린지를 포함하는 WWW-Authenticate 헤더 필드를 포함합니다.

407 (프록시 인증 필요) 응답 메시지는 프록시가 클라이언트의 권한 부여에 챌린지를 제시하는 데 사용하며, 요청된 리소스에 대한 프록시에 적용 가능한 하나 이상의 챌린지를 포함하는 Proxy-Authenticate 헤더 필드를 포함합니다.

오리진 서버에 자신을 인증하려는 사용자 에이전트는 일반적으로, 하지만 반드시 그런 것은 아니며, 401 (인증되지 않음)을 수신한 후 요청에 Authorization 헤더 필드를 포함하여 그렇게 할 수 있습니다.

프록시에 자신을 인증하려는 클라이언트는 일반적으로, 하지만 반드시 그런 것은 아니며, 407 (프록시 인증 필요)를 수신한 후 요청에 Proxy-Authorization 헤더 필드를 포함하여 그렇게 할 수 있습니다.

11.4. 자격 증명

Authorization 필드 값과 Proxy-Authorization 필드 값 모두 응답에서 수신한 챌린지(과거 어느 시점의 것일 수도 있음)를 바탕으로 요청 중인 리소스의 realm에 대한 클라이언트의 자격 증명을 포함합니다. 값을 생성할 때 사용자 에이전트는 자신이 이해하는 auth-scheme 중 가장 안전하다고 판단하는 챌린지를 선택하고 필요에 따라 사용자에게서 자격 증명을 얻는 것이 바람직합니다. 헤더 필드 값 안에서 자격 증명을 전송하는 것은 17.16.1절에 설명된 대로 기본 연결의 기밀성과 관련하여 상당한 보안 고려사항을 수반합니다.

보호된 리소스에 대한 요청에서 자격 증명이 생략되거나, 유효하지 않은 자격 증명(예: 잘못된 암호) 또는 부분 자격 증명(예: 인증 스킴에 둘 이상의 왕복이 필요한 경우)이 포함된 경우 오리진 서버는 요청된 리소스에 적용 가능한 하나 이상의 (새로운 것일 수도 있는) 챌린지를 포함하는 WWW-Authenticate 헤더 필드가 있는 401 (인증되지 않음) 응답을 SHOULD 전송해야 합니다.

마찬가지로 프록시 자격 증명이 생략되거나 유효하지 않거나 부분적인 프록시 자격 증명이 포함된 요청을 수신한 경우 인증을 요구하는 프록시는 프록시에 적용 가능한 하나 이상의 (새로운 것일 수도 있는) 챌린지를 포함하는 Proxy-Authenticate 헤더 필드가 있는 407 (프록시 인증 필요) 응답을 SHOULD 생성해야 합니다.

접근 권한을 얻기에는 충분하지 않은 유효한 자격 증명을 수신한 서버는 403 (금지됨) 상태 코드(15.5.4절)로 응답하는 것이 바람직합니다.

HTTP는 접근 인증을 위해 애플리케이션을 이 단순한 챌린지-응답 프레임워크로 제한하지 않습니다. 전송 계층에서의 인증이나 메시지 캡슐화를 통한 인증, 인증 정보를 지정하는 추가 헤더 필드 등 추가 메커니즘을 사용할 수 있습니다. 그러나 그러한 추가 메커니즘은 이 사양에서 정의하지 않습니다.

사용자 인증을 위한 다양한 사용자 지정 메커니즘은 인증과 관련된 토큰을 전달하기 위해 [COOKIE]에 정의된 Set-Cookie 및 Cookie 헤더 필드를 사용한다는 점에 유의하십시오.

11.5. 보호 공간 설정

realm 인증 매개변수는 보호 범위를 나타내려는 인증 스킴에서 사용하도록 예약되어 있습니다.

보호 공간은 접근 중인 서버의 오리진(4.3.1절 참조)과 realm 값이 있는 경우 그 값을 결합하여 정의됩니다. 이러한 realm을 통해 서버의 보호된 리소스를 각각 자체 인증 스킴 및/또는 권한 부여 데이터베이스를 가진 보호 공간 집합으로 분할할 수 있습니다. realm 값은 일반적으로 오리진 서버가 지정하는 문자열이며, 인증 스킴별 추가 의미론을 가질 수 있습니다. 응답에는 동일한 auth-scheme이지만 서로 다른 realm을 가진 여러 챌린지가 있을 수 있습니다.

보호 공간은 자격 증명을 자동으로 적용할 수 있는 도메인을 결정합니다. 이전 요청이 권한 부여되었다면 사용자 에이전트는 인증 스킴, 매개변수 및/또는 사용자 기본 설정(예: 구성 가능한 비활성 시간 초과)이 결정하는 기간 동안 해당 보호 공간 내의 다른 모든 요청에 동일한 자격 증명을 MAY 재사용할 수 있습니다.

추가 정보 없이는 보호 공간의 범위와 따라서 자격 증명이 자동으로 적용될 수 있는 요청이 클라이언트에 반드시 알려지는 것은 아닙니다. 인증 스킴은 보호 공간의 범위를 설명하는 매개변수를 정의할 수 있습니다. 인증 스킴에서 특별히 허용하지 않는 한 하나의 보호 공간은 해당 서버의 범위를 벗어날 수 없습니다.

역사적인 이유로 송신자는 quoted-string 구문만 MUST 생성해야 합니다. 수신자는 오랫동안 두 표기법을 모두 허용해 온 기존 클라이언트와 최대한 상호운용하기 위해 token 및 quoted-string 구문을 모두 지원해야 할 수 있습니다.

11.6. 오리진 서버에 대한 사용자 인증

11.6.1. WWW-Authenticate

"WWW-Authenticate" 응답 헤더 필드는 대상 리소스에 적용되는 인증 스킴과 매개변수를 나타냅니다.

401 (인증되지 않음) 응답을 생성하는 서버는 하나 이상의 챌린지를 포함하는 WWW-Authenticate 헤더 필드를 MUST 전송해야 합니다. 서버는 자격 증명(또는 다른 자격 증명)을 제공하면 응답에 영향을 줄 수 있음을 나타내기 위해 다른 응답 메시지에 WWW-Authenticate 헤더 필드를 MAY 생성할 수 있습니다.

응답을 전달하는 프록시는 해당 응답의 어떠한 WWW-Authenticate 헤더 필드도 MUST NOT 수정해야 합니다.

필드 값에는 둘 이상의 챌린지가 포함될 수 있고 각 챌린지는 쉼표로 구분된 인증 매개변수 목록을 포함할 수 있으므로 사용자 에이전트는 필드 값을 구문 분석할 때 특별히 주의하는 것이 좋습니다. 또한 헤더 필드 자체도 여러 번 나타날 수 있습니다.

예:

WWW-Authenticate: Basic realm="simple", Newauth realm="apps",
                 type=1, title="Login to \"apps\""

이 헤더 필드에는 두 개의 챌린지가 있습니다. 하나는 realm 값이 "simple"인 "Basic" 스킴이고 다른 하나는 realm 값이 "apps"인 "Newauth" 스킴입니다. 또한 "type" 및 "title"이라는 두 개의 추가 매개변수를 포함합니다.

그러나 일부 사용자 에이전트는 이 형식을 인식하지 못합니다. 따라서 동일한 필드 라인에 둘 이상의 멤버가 있는 WWW-Authenticate 필드 값을 전송하면 상호운용되지 않을 수 있습니다.

11.6.2. Authorization

"Authorization" 헤더 필드를 사용하면 사용자 에이전트가 오리진 서버에 자신을 인증할 수 있습니다. 일반적으로, 하지만 반드시 그런 것은 아니며, 401 (인증되지 않음) 응답을 수신한 후입니다. 그 값은 요청 중인 리소스의 realm에 대한 사용자 에이전트의 인증 정보를 포함하는 자격 증명으로 구성됩니다.

요청이 인증되고 realm이 지정되면 인증 스킴 자체가 다른 것을 요구하지 않는다고 가정할 때(예: 챌린지 값에 따라 달라지는 자격 증명 또는 동기화된 시계 사용), 동일한 자격 증명은 이 realm 내의 다른 모든 요청에도 유효한 것으로 간주됩니다.

요청을 전달하는 프록시는 해당 요청의 어떠한 Authorization 헤더 필드도 MUST NOT 수정하지 마십시오. HTTP 캐시의 Authorization 헤더 필드 처리에 관한 세부 사항과 요구사항은 [CACHING]의 3.5절을 참조하십시오.

11.6.3. Authentication-Info

HTTP 인증 스킴은 클라이언트의 인증 자격 증명이 허용된 후 정보를 전달하기 위해 "Authentication-Info" 응답 필드를 사용할 수 있습니다. 이 정보에는 서버의 최종 처리 메시지가 포함될 수 있습니다(예: 서버 인증을 포함할 수 있음).

필드 값은 11.3절에 정의된 "auth-param" 구문을 사용하는 매개변수(이름/값 쌍) 목록입니다. 이 사양은 일반적인 형식만 설명합니다. Authentication-Info를 사용하는 인증 스킴은 개별 매개변수를 정의합니다. 예를 들어 "Digest" 인증 스킴은 [RFC7616]의 3.5절에서 여러 매개변수를 정의합니다.

Authentication-Info 필드는 요청 메서드 및 상태 코드와 관계없이 모든 HTTP 응답에서 사용할 수 있습니다. 그 의미론은 대응하는 요청의 Authorization 헤더 필드(11.6.2절)가 나타내는 인증 스킴으로 정의됩니다.

응답을 전달하는 프록시는 어떠한 방식으로도 필드 값을 수정할 수 없습니다.

인증 스킴이 명시적으로 허용하는 경우 Authentication-Info를 트레일러 필드(6.5절)로 전송할 수 있습니다.

11.7. 프록시에 대한 클라이언트 인증

11.7.1. Proxy-Authenticate

"Proxy-Authenticate" 헤더 필드는 이 요청에 대한 프록시에 적용되는 인증 스킴과 매개변수를 나타내는 하나 이상의 챌린지로 구성됩니다. 프록시는 자신이 생성하는 각 407 (프록시 인증 필요) 응답에 하나 이상의 Proxy-Authenticate 헤더 필드를 MUST 전송해야 합니다.

WWW-Authenticate와 달리 Proxy-Authenticate 헤더 필드는 응답 체인에서 다음 아웃바운드 클라이언트에만 적용됩니다. 특정 프록시를 선택한 클라이언트만 인증에 필요한 자격 증명을 가지고 있을 가능성이 높기 때문입니다. 그러나 대규모 기업 네트워크의 사무실 및 지역 캐싱 프록시처럼 동일한 관리 도메인 내에서 여러 프록시를 사용하는 경우 사용자 에이전트가 자격 증명을 생성하고 소비될 때까지 계층 구조를 통해 전달하는 것이 일반적입니다. 따라서 이러한 구성에서는 각 프록시가 동일한 챌린지 집합을 전송하므로 Proxy-Authenticate가 전달되는 것처럼 보입니다.

WWW-Authenticate에 대한 구문 분석 고려사항이 이 헤더 필드에도 적용됨에 유의하십시오. 자세한 내용은 11.6.1절을 참조하십시오.

11.7.2. Proxy-Authorization

"Proxy-Authorization" 헤더 필드를 사용하면 클라이언트가 인증을 요구하는 프록시에 자신(또는 사용자)을 식별할 수 있습니다. 그 값은 프록시 및/또는 요청 중인 리소스의 realm에 대한 클라이언트의 인증 정보를 포함하는 자격 증명으로 구성됩니다.

Authorization과 달리 Proxy-Authorization 헤더 필드는 Proxy-Authenticate 헤더 필드를 사용하여 인증을 요구한 다음 인바운드 프록시에만 적용됩니다. 체인에서 여러 프록시를 사용하는 경우 Proxy-Authorization 헤더 필드는 자격 증명을 받을 것으로 예상한 첫 번째 인바운드 프록시가 소비합니다. 프록시는 프록시들이 특정 요청을 협력하여 인증하는 메커니즘인 경우 클라이언트 요청의 자격 증명을 다음 프록시로 MAY 중계할 수 있습니다.

11.7.3. Proxy-Authentication-Info

"Proxy-Authentication-Info" 응답 헤더 필드는 Authentication-Info와 동등하지만 프록시 인증(11.3절)에 적용되며, 그 의미론은 대응하는 요청의 Proxy-Authorization 헤더 필드(11.7.2절)가 나타내는 인증 스킴으로 정의됩니다.

그러나 Authentication-Info와 달리 Proxy-Authentication-Info 헤더 필드는 응답 체인에서 다음 아웃바운드 클라이언트에만 적용됩니다. 특정 프록시를 선택한 클라이언트만 인증에 필요한 자격 증명을 가지고 있을 가능성이 높기 때문입니다. 그러나 대규모 기업 네트워크의 사무실 및 지역 캐싱 프록시처럼 동일한 관리 도메인 내에서 여러 프록시를 사용하는 경우, 사용자 에이전트가 자격 증명을 생성하고 소비될 때까지 계층 구조를 통해 전달하는 것이 일반적입니다. 따라서 이러한 구성에서는 각 프록시가 동일한 필드 값을 전송하므로 Proxy-Authentication-Info가 전달되는 것처럼 보입니다.

인증 스킴이 명시적으로 허용하는 경우 Proxy-Authentication-Info를 트레일러 필드(6.5절)로 전송할 수 있습니다.

12. 콘텐츠 협상

응답이 성공 또는 오류를 나타내면서 콘텐츠를 전달할 때 오리진 서버에는 해당 정보를 표현하는 다양한 방법이 있는 경우가 많습니다. 예를 들어 서로 다른 형식, 언어 또는 인코딩을 사용할 수 있습니다. 마찬가지로 서로 다른 사용자나 사용자 에이전트는 사용 가능한 표현 중 어떤 것을 전달하는 것이 가장 좋은지에 영향을 줄 수 있는 서로 다른 기능, 특성 또는 기본 설정을 가질 수 있습니다. 이러한 이유로 HTTP는 콘텐츠 협상 메커니즘을 제공합니다.

이 사양은 프로토콜 안에서 드러날 수 있는 세 가지 콘텐츠 협상 패턴을 정의합니다. 사용자 에이전트가 명시한 기본 설정에 따라 서버가 표현을 선택하는 "선제적" 협상, 서버가 사용자 에이전트가 선택할 표현 목록을 제공하는 "반응형" 협상, 그리고 과거 응답에서 서버가 명시한 기본 설정에 따라 사용자 에이전트가 향후 요청의 표현을 선택하는 "요청 콘텐츠" 협상입니다.

다른 콘텐츠 협상 패턴에는 사용자 에이전트 매개변수에 따라 선택적으로 렌더링되는 여러 부분으로 표현이 구성되는 "조건부 콘텐츠", 사용자 에이전트 특성에 따라 추가적인(더 구체적인) 요청을 하는 스크립트를 표현이 포함하는 "활성 콘텐츠", 그리고 중개자가 콘텐츠 선택을 수행하는 "투명 콘텐츠 협상"([RFC2295])이 있습니다. 이러한 패턴은 서로 배타적이지 않으며 각각 적용 가능성과 실용성에서 장단점이 있습니다.

모든 경우에 HTTP는 리소스 의미론을 인식하지 않는다는 점에 유의하십시오. 오리진 서버가 시간에 걸쳐, 그리고 콘텐츠 협상의 다양한 차원에 걸쳐 요청에 얼마나 일관되게 응답하는지, 따라서 시간이 지나며 관찰되는 리소스 표현의 "동일성"은 해당 응답을 선택하거나 생성하는 엔터티 또는 알고리즘에 의해 전적으로 결정됩니다.

12.1. 선제적 협상

서버에 있는 알고리즘이 선호되는 표현을 선택하도록 유도하기 위해 사용자 에이전트가 요청에서 콘텐츠 협상 기본 설정을 전송하는 것을 선제적 협상(일명 서버 주도 협상)이라고 합니다. 선택은 응답에 사용 가능한 표현(언어, 콘텐츠 코딩 등과 같이 달라질 수 있는 차원)을 요청에서 제공한 다양한 정보와 비교하여 이루어지며, 여기에는 아래의 명시적 협상 헤더 필드와 클라이언트의 네트워크 주소 또는 User-Agent 필드의 일부와 같은 암시적 특성이 모두 포함됩니다.

사용 가능한 표현 중에서 선택하는 알고리즘을 사용자 에이전트에 설명하기 어렵거나 서버가 첫 번째 응답과 함께 사용자 에이전트에 "최선의 추측"을 전송하려는 경우 선제적 협상이 유리합니다(해당 "최선의 추측"이 사용자에게 충분하다면 후속 요청의 왕복 지연을 피할 수 있음). 서버의 추측을 개선하기 위해 사용자 에이전트는 자신의 기본 설정을 설명하는 요청 헤더 필드를 MAY 전송할 수 있습니다.

선제적 협상에는 심각한 단점이 있습니다.

  • 특정 사용자에게 무엇이 "최선"인지 서버가 정확히 결정하는 것은 불가능합니다. 그러려면 사용자 에이전트의 기능과 응답의 의도된 사용(예: 사용자가 화면에서 보려는 것인지 종이에 인쇄하려는 것인지?)을 모두 완전히 알아야 하기 때문입니다.
  • 사용자 에이전트가 매 요청마다 자신의 기능을 설명하게 하는 것은 매우 비효율적일 수 있으며(여러 표현을 가진 응답은 극히 일부이므로) 사용자의 개인정보 보호에 잠재적인 위험이 될 수 있습니다.
  • 오리진 서버의 구현과 요청에 대한 응답을 생성하는 알고리즘을 복잡하게 만듭니다. 그리고
  • 공유 캐싱에서 응답의 재사용성을 제한합니다.

오리진 서버가 요청된 리소스에 선제적 협상을 구현하지 않거나 사용자 에이전트의 기본 설정에 맞지 않는 응답을 전송하는 것이 406 (허용할 수 없음) 응답을 전송하는 것보다 낫다고 결정할 수 있으므로, 사용자 에이전트는 선제적 협상 기본 설정이 일관되게 준수될 것이라고 기대할 수 없습니다.

Vary 헤더 필드(12.5.5절)는 선택 알고리즘에서 요청 정보의 어떤 부분이 사용되었는지를 나타내기 위해 선제적 협상 대상인 응답에 자주 전송됩니다.

요청 헤더 필드 Accept, Accept-Charset, Accept-Encoding 및 Accept-Language는 사용자 에이전트가 응답 콘텐츠의 선제적 협상에 참여할 수 있도록 아래에 정의되어 있습니다. 이러한 필드에서 전송된 기본 설정은 대상 리소스의 표현, 오류 또는 처리 상태의 표현 및 프로토콜 안에 나타날 수 있는 기타 텍스트 문자열까지 포함하여 응답의 모든 콘텐츠에 적용됩니다.

12.2. 반응형 협상

반응형 협상(일명 에이전트 주도 협상)에서는 초기 응답을 수신한 후 사용자 에이전트가 (상태 코드와 관계없이) 콘텐츠를 선택합니다. 반응형 협상 메커니즘은 대체 표현에 대한 참조 목록처럼 단순할 수 있습니다.

사용자 에이전트가 초기 응답 콘텐츠에 만족하지 않으면 하나 이상의 대체 리소스에 GET 요청을 수행하여 다른 표현을 얻을 수 있습니다. 이러한 대안의 선택은 자동으로(사용자 에이전트에 의해) 또는 수동으로(예: 사용자가 하이퍼텍스트 메뉴에서 선택하여) 수행할 수 있습니다.

서버는 대안 목록 이외의 초기 표현을 전송하지 않기로 선택하여 사용자 에이전트에 의한 반응형 협상이 선호됨을 나타낼 수 있습니다. 예를 들어 300 (여러 선택지) 및 406 (허용할 수 없음) 상태 코드가 있는 응답에 나열된 대안에는 사용 가능한 표현에 대한 정보가 포함되므로 사용자 또는 사용자 에이전트가 선택하여 대응할 수 있습니다.

응답이 일반적으로 사용되는 차원(예: 유형, 언어 또는 인코딩)에 따라 달라지거나, 오리진 서버가 요청을 검사하여 사용자 에이전트의 기능을 결정할 수 없거나, 일반적으로 공용 캐시를 사용하여 서버 부하를 분산하고 네트워크 사용량을 줄이는 경우 반응형 협상이 유리합니다.

반응형 협상은 대안 목록을 사용자 에이전트에 전송해야 한다는 단점이 있으며, 헤더 섹션에서 전송하면 사용자가 체감하는 지연 시간이 악화되고 대체 표현을 얻기 위해 두 번째 요청이 필요합니다. 또한 이 사양은 자동 선택을 지원하는 메커니즘을 정의하지 않지만 그러한 메커니즘의 개발을 막지는 않습니다.

12.3. 요청 콘텐츠 협상

서버의 응답에서 콘텐츠 협상 기본 설정을 전송하는 경우 나열된 기본 설정은 해당 리소스에 대한 후속 요청에서 적절한 콘텐츠 선택에 영향을 주도록 의도되므로 요청 콘텐츠 협상이라고 합니다. 예를 들어 Accept(12.5.1절) 및 Accept-Encoding(12.5.3절) 헤더 필드를 응답으로 전송하여 해당 리소스에 대한 후속 요청에서 선호되는 미디어 유형과 콘텐츠 코딩을 나타낼 수 있습니다.

마찬가지로 [RFC5789]의 3.1절은 PATCH 요청에서 허용되는 콘텐츠 유형을 발견할 수 있게 하는 "Accept-Patch" 응답 헤더 필드를 정의합니다.

12.4. 콘텐츠 협상 필드 기능

12.4.1. 부재

각 콘텐츠 협상 필드에 대해 해당 필드를 포함하지 않는 요청은 송신자가 그 협상 차원에 대해 선호 사항이 없음을 의미합니다.

콘텐츠 협상 헤더 필드가 요청에 있고 응답에 사용 가능한 표현 중 해당 필드에 따라 허용 가능하다고 간주할 수 있는 것이 없다면 오리진 서버는 406 (허용할 수 없음) 응답을 전송하여 헤더 필드를 준수하거나, 응답이 해당 요청 헤더 필드에 대한 콘텐츠 협상의 대상이 아닌 것처럼 처리하여 헤더 필드를 무시할 수 있습니다. 그러나 그렇다고 해서 클라이언트가 해당 표현을 사용할 수 있다는 의미는 아닙니다.

12.4.2. 품질 값

이 사양에서 정의하는 콘텐츠 협상 필드는 관련 콘텐츠 종류에 대한 선호에 상대적인 "가중치"를 지정하기 위해 "q"(대소문자 구분 없음)라는 공통 매개변수를 사용합니다. 이 가중치는 동일한 매개변수 이름이 서버 구성에서 리소스에 대해 선택할 수 있는 다양한 표현의 상대적인 품질에 가중치를 지정하는 데 자주 사용되므로 "품질 값"(또는 "qvalue")이라고 합니다.

가중치는 0에서 1 범위의 실수로 정규화되며, 0.001은 가장 낮은 선호도이고 1은 가장 높은 선호도입니다. 값 0은 "허용할 수 없음"을 의미합니다. "q" 매개변수가 없으면 기본 가중치는 1입니다.

  weight = OWS ";" OWS "q=" qvalue
  qvalue = ( "0" [ "." 0*3DIGIT ] )
         / ( "1" [ "." 0*3("0") ] )

qvalue 송신자는 소수점 뒤에 세 자리를 초과하여 MUST NOT 생성해야 합니다. 이러한 값의 사용자 구성도 같은 방식으로 제한하는 것이 바람직합니다.

12.4.3. 와일드카드 값

이러한 헤더 필드 대부분은 표시된 경우 지정되지 않은 값을 선택하기 위한 와일드카드 값("*")을 정의합니다. 와일드카드가 없으면 필드에서 명시적으로 언급되지 않은 값은 허용할 수 없는 것으로 간주됩니다. Vary에서 와일드카드 값은 변형이 무제한임을 의미합니다.

12.5. 콘텐츠 협상 필드

12.5.1. Accept

"Accept" 헤더 필드는 사용자 에이전트가 응답 미디어 유형에 대한 기본 설정을 지정하는 데 사용할 수 있습니다. 예를 들어 Accept 헤더 필드를 사용하여 인라인 이미지 요청의 경우처럼 요청이 원하는 소수의 유형으로 특별히 제한됨을 나타낼 수 있습니다.

서버가 응답에서 전송하는 경우 Accept는 동일한 리소스에 대한 후속 요청의 콘텐츠에서 어떤 콘텐츠 유형이 선호되는지에 관한 정보를 제공합니다.

  Accept = #( media-range [ weight ] )

  media-range    = ( "*/*"
                     / ( type "/" "*" )
                     / ( type "/" subtype )
                   ) parameters

별표 "*" 문자는 미디어 유형을 범위로 그룹화하는 데 사용되며, "*/*"는 모든 미디어 유형을 나타내고 "type/*"는 해당 유형의 모든 subtype을 나타냅니다. media-range에는 해당 범위에 적용되는 미디어 유형 매개변수가 포함될 수 있습니다.

각 media-range 뒤에는 선택적 적용 가능한 미디어 유형 매개변수 (예: charset)가 올 수 있고, 그 뒤에는 상대적 가중치를 나타내기 위한 선택적 "q" 매개변수(12.4.2절)가 올 수 있습니다.

이전 사양에서는 가중치 매개변수 뒤에 추가 확장 매개변수가 나타나는 것을 허용했습니다. accept 확장 문법(accept-params, accept-ext)은 정의가 복잡했고 실제로 사용되지 않았으며 새 헤더 필드를 통해 더 쉽게 배포할 수 있으므로 제거되었습니다. 가중치를 사용하는 송신자는 "q"를 마지막에(모든 media-range 매개변수 뒤에) SHOULD 전송해야 합니다. 수신자는 매개변수 순서와 관계없이 "q"라는 이름의 모든 매개변수를 가중치로 SHOULD 처리해야 합니다.

예시

Accept: audio/*; q=0.2, audio/basic

는 "audio/basic을 선호하지만 품질을 80% 낮춰 평가한 뒤에도 사용 가능한 최선이라면 어떤 audio 유형이든 보내 달라"는 의미로 해석됩니다.

더 정교한 예는

Accept: text/plain; q=0.5, text/html,
       text/x-dvi; q=0.8, text/x-c

말로 표현하면 "text/html과 text/x-c가 동등하게 선호되는 미디어 유형이지만, 둘 다 없으면 text/x-dvi 표현을 보내고, 그것도 없으면 text/plain 표현을 보내라"는 의미입니다.

미디어 범위는 더 구체적인 미디어 범위 또는 특정 미디어 유형으로 재정의할 수 있습니다. 주어진 유형에 둘 이상의 미디어 범위가 적용되면 가장 구체적인 참조가 우선합니다. 예:

Accept: text/*, text/plain, text/plain;format=flowed, */*

의 우선순위는 다음과 같습니다.

  1. text/plain;format=flowed
  2. text/plain
  3. text/*
  4. */*

주어진 유형과 관련된 미디어 유형 품질 계수는 해당 유형과 일치하는 가장 높은 우선순위의 미디어 범위를 찾아 결정합니다. 예:

Accept: text/*;q=0.3, text/plain;q=0.7, text/plain;format=flowed,
       text/plain;format=fixed;q=0.4, */*;q=0.5

는 다음 값이 연결되도록 합니다.

표 5
미디어 유형 품질 값
text/plain;format=flowed 1
text/plain 0.7
text/html 0.3
image/jpeg 0.5
text/plain;format=fixed 0.4
text/html;level=3 0.7

12.5.2. Accept-Charset

"Accept-Charset" 헤더 필드는 사용자 에이전트가 텍스트 응답 콘텐츠에서 charset에 대한 기본 설정을 나타내기 위해 전송할 수 있습니다. 예를 들어 이 필드를 사용하면 더 포괄적이거나 특수 목적의 charset을 이해할 수 있는 사용자 에이전트가 그러한 charset으로 정보를 표현할 수 있는 오리진 서버에 해당 기능을 알릴 수 있습니다.

  Accept-Charset = #( ( token / "*" ) [ weight ] )

Charset 이름은 8.3.2절에 정의되어 있습니다. 사용자 에이전트는 12.4.2절에 정의된 대로 각 charset에 사용자의 상대적 선호도를 나타내는 품질 값을 MAY 연결할 수 있습니다. 예:

Accept-Charset: iso-8859-5, unicode-1-1;q=0.8

Accept-Charset 헤더 필드에 특수 값 "*"가 있으면 필드의 다른 곳에서 언급되지 않은 모든 charset과 일치합니다.

12.5.3. Accept-Encoding

"Accept-Encoding" 헤더 필드는 콘텐츠 코딩(8.4.1절) 사용에 대한 기본 설정을 나타내는 데 사용할 수 있습니다.

사용자 에이전트가 요청에서 전송하는 경우 Accept-Encoding은 응답에서 허용 가능한 콘텐츠 코딩을 나타냅니다.

서버가 응답에서 전송하는 경우 Accept-Encoding은 동일한 리소스에 대한 후속 요청의 콘텐츠에서 어떤 콘텐츠 코딩이 선호되는지에 관한 정보를 제공합니다.

인코딩하지 않는 것이 선호되는 경우를 전달하기 위해 "identity" 토큰을 "인코딩 없음"의 동의어로 사용합니다.

  Accept-Encoding  = #( codings [ weight ] )
  codings          = content-coding / "identity" / "*"

각 codings 값에는 12.4.2절에 정의된 대로 해당 인코딩에 대한 선호도를 나타내는 관련 품질 값 (가중치)을 MAY 지정할 수 있습니다. Accept-Encoding 필드의 별표 "*" 기호는 필드에 명시적으로 나열되지 않은 사용 가능한 모든 콘텐츠 코딩과 일치합니다.

예:

Accept-Encoding: compress, gzip
Accept-Encoding:
Accept-Encoding: *
Accept-Encoding: compress;q=0.5, gzip;q=1.0
Accept-Encoding: gzip;q=1.0, identity; q=0.5, *;q=0

서버는 다음 규칙을 사용하여 주어진 표현의 콘텐츠 코딩이 허용 가능한지 검사합니다.

  1. 요청에 Accept-Encoding 헤더 필드가 없으면 모든 콘텐츠 코딩이 사용자 에이전트에 허용 가능한 것으로 간주됩니다.
  2. 표현에 콘텐츠 코딩이 없으면, Accept-Encoding 헤더 필드가 "identity;q=0" 또는 "identity"에 대한 더 구체적인 항목이 없는 "*;q=0"을 명시하여 특별히 제외하지 않는 한 기본적으로 허용 가능합니다.
  3. 표현의 콘텐츠 코딩이 Accept-Encoding 필드 값에 나열된 콘텐츠 코딩 중 하나라면 qvalue 0이 함께 지정되지 않은 한 허용 가능합니다. (12.4.2절에 정의된 대로 qvalue 0은 "허용할 수 없음"을 의미합니다.)

표현은 여러 콘텐츠 코딩으로 인코딩될 수 있습니다. 그러나 대부분의 콘텐츠 코딩은 동일한 목적(예: 데이터 압축)을 달성하는 대안적인 방법입니다. 동일한 목적을 가진 여러 콘텐츠 코딩 중에서 선택할 때는 0이 아닌 가장 높은 qvalue를 가진 허용 가능한 콘텐츠 코딩이 선호됩니다.

필드 값이 비어 있는 Accept-Encoding 헤더 필드는 사용자 에이전트가 응답에서 어떠한 콘텐츠 코딩도 원하지 않음을 의미합니다. 비어 있지 않은 Accept-Encoding 헤더 필드가 요청에 있고 응답에 사용 가능한 표현 중 허용 가능한 것으로 나열된 콘텐츠 코딩을 가진 것이 없다면 identity 코딩이 허용되지 않는 것으로 표시되지 않은 한 오리진 서버는 어떠한 콘텐츠 코딩도 없는 응답을 SHOULD 전송해야 합니다.

Accept-Encoding 헤더 필드가 응답에 있으면 해당 요청에서 리소스가 어떤 콘텐츠 코딩을 허용할 의향이 있었는지를 나타냅니다. 필드 값은 요청에서와 동일한 방식으로 평가됩니다.

이 정보는 관련 요청에만 해당한다는 점에 유의하십시오. 지원되는 인코딩 집합은 동일한 서버의 다른 리소스에서 다를 수 있으며 시간이 지나면서 변경되거나 요청의 다른 측면(예: 요청 메서드)에 따라 달라질 수 있습니다.

지원되지 않는 콘텐츠 코딩으로 인해 요청이 실패한 서버는 415 (지원되지 않는 미디어 유형) 상태로 응답하고 해당 응답에 Accept-Encoding 헤더 필드를 포함하여 클라이언트가 콘텐츠 코딩과 미디어 유형에 관련된 문제를 구별할 수 있도록 하는 것이 바람직합니다. 미디어 유형 관련 문제와의 혼동을 피하기 위해 콘텐츠 코딩과 관련 없는 이유로 415 상태로 요청을 실패시키는 서버는 Accept-Encoding 헤더 필드를 MUST NOT 포함해야 합니다.

Accept-Encoding의 가장 일반적인 용도는 클라이언트가 콘텐츠 코딩을 낙관적으로 사용한 것에 대한 415 (지원되지 않는 미디어 유형) 상태 코드 응답입니다. 그러나 향후 상호작용을 최적화할 수 있도록 콘텐츠 코딩이 지원된다는 것을 클라이언트에 나타내는 데도 헤더 필드를 사용할 수 있습니다. 예를 들어 리소스는 요청 콘텐츠가 압축 코딩을 사용할 만큼 컸지만 클라이언트가 그렇게 하지 않은 경우 2xx (성공) 응답에 이를 포함할 수 있습니다.

12.5.4. Accept-Language

"Accept-Language" 헤더 필드는 사용자 에이전트가 응답에서 선호하는 자연어 집합을 나타내는 데 사용할 수 있습니다. 언어 태그는 8.5.1절에 정의되어 있습니다.

각 language-range에는 12.4.2절에 정의된 대로 해당 범위가 지정하는 언어에 대한 사용자의 선호도를 추정한 관련 품질 값을 지정할 수 있습니다. 예:

Accept-Language: da, en-gb;q=0.8, en;q=0.7

는 "덴마크어를 선호하지만 영국 영어 및 다른 종류의 영어도 허용한다"는 의미입니다.

일부 수신자는 언어 태그가 나열된 순서를 내림차순 우선순위의 표시로 취급하며, 특히 동일한 품질 값이 지정된 태그(값 없음은 q=1과 같음)에서 그렇습니다. 그러나 이러한 동작에 의존할 수는 없습니다. 일관성과 상호운용성을 최대화하기 위해 많은 사용자 에이전트는 각 언어 태그에 고유한 품질 값을 지정하면서 품질이 낮아지는 순서로 나열합니다. 언어 우선순위 목록에 대한 추가 논의는 [RFC4647]의 2.3절에서 확인할 수 있습니다.

일치를 위해 [RFC4647]의 3절에서는 여러 일치 방식을 정의합니다. 구현은 요구사항에 가장 적절한 일치 방식을 제공할 수 있습니다. "기본 필터링" 방식([RFC4647], 3.3.1절)은 이전에 [RFC2616]의 14.4절에서 HTTP에 대해 정의된 일치 방식과 동일합니다.

모든 요청에서 사용자의 전체 언어 기본 설정을 포함하는 Accept-Language 헤더 필드를 전송하면 사용자의 개인정보 보호 기대에 반할 수 있습니다 (17.13절).

이해 가능성은 개별 사용자에게 크게 의존하므로 사용자 에이전트는 언어 기본 설정을 사용자가 제어할 수 있도록 해야 합니다(사용자 에이전트 자체의 구성을 통하거나 사용자가 제어할 수 있는 시스템 설정을 기본값으로 사용). 그러한 제어를 사용자에게 제공하지 않는 사용자 에이전트는 Accept-Language 헤더 필드를 MUST NOT 전송해야 합니다.

12.5.5. Vary

응답의 "Vary" 헤더 필드는 메서드와 대상 URI를 제외하고 요청 메시지의 어떤 부분이 오리진 서버가 이 응답의 콘텐츠를 선택하는 과정에 영향을 주었을 수 있는지 설명합니다.

  Vary = #( "*" / field-name )

Vary 필드 값은 와일드카드 멤버 "*" 또는 이 응답의 표현을 선택하는 데 역할을 했을 수 있는 요청 필드 이름의 목록이며, 이를 선택 헤더 필드라고 합니다. 가능한 선택 헤더 필드는 이 사양에서 정의된 필드로 제한되지 않습니다.

멤버 "*"를 포함하는 목록은 요청의 다른 측면이 응답 표현을 선택하는 데 역할을 했을 수 있음을 나타내며, 메시지 구문 밖의 측면 (예: 클라이언트의 네트워크 주소)도 포함될 수 있습니다. 수신자는 요청을 오리진 서버에 전달하지 않고는 이 응답이 이후 요청에 적합한지 결정할 수 없습니다. 프록시는 Vary 필드 값에 "*"를 MUST NOT 생성해야 합니다.

예를 들어 다음을 포함하는 응답은

Vary: accept-encoding, accept-language

오리진 서버가 이 응답의 콘텐츠를 선택할 때 요청의 Accept-Encoding 및 Accept-Language 헤더 필드(또는 그 부재)를 결정 요소로 사용했을 수 있음을 나타냅니다.

필드 이름 목록을 포함하는 Vary 필드에는 두 가지 목적이 있습니다.

  1. 이후 요청이 원래 요청과 나열된 헤더 필드에 대해 동일한 값을 갖지 않는 한 캐시 수신자가 이 응답을 이후 요청을 충족하는 데 MUST NOT 사용해야 함을 알립니다( [CACHING]의 4.1절) 또는 응답 재사용이 오리진 서버에 의해 검증되어야 합니다. 즉 Vary는 새 요청을 저장된 캐시 항목과 일치시키는 데 필요한 캐시 키를 확장합니다.

  2. 이 응답이 콘텐츠 협상(12절)의 대상이었고 나열된 헤더 필드에 다른 값이 제공되면 후속 요청에서 다른 표현이 전송될 수 있음을 사용자 에이전트 수신자에게 알립니다(선제적 협상).

오리진 서버는 캐시 가능한 응답을 후속 요청에 선택적으로 재사용하기를 원하는 경우 해당 응답에 Vary 헤더 필드를 SHOULD 생성해야 합니다. 일반적으로 오리진 서버가 요청의 Accept-Language 헤더 필드를 바탕으로 응답 언어를 선택한 경우처럼, 응답 콘텐츠가 선택 헤더 필드로 표현된 기본 설정에 더 잘 맞도록 조정된 경우가 이에 해당합니다.

특히 캐시 응답 지시어([CACHING]의 5.2절)에 의해 재사용이 이미 제한된 경우 오리진 서버가 콘텐츠 선택의 변형보다 캐싱에 대한 Vary의 성능 영향을 더 중요하게 여긴다면 Vary를 생략할 수 있습니다.

다른 사용자에 대한 해당 응답의 재사용은 필드 정의(11.6.2절)에서 금지하므로 Vary에 Authorization 필드 이름을 전송할 필요가 없습니다. 마찬가지로 응답 콘텐츠가 네트워크 지역에 따라 선택되거나 영향을 받았지만 오리진 서버가 수신자가 한 지역에서 다른 지역으로 이동하더라도 캐시된 응답이 재사용되기를 원한다면 오리진 서버는 그러한 변형을 Vary에 나타낼 필요가 없습니다.

13. 조건부 요청

조건부 요청은 요청 메서드를 대상 리소스에 적용하기 전에 검사할 사전 조건을 나타내는 하나 이상의 요청 헤더 필드가 있는 HTTP 요청입니다. 13.2절에서는 사전 조건을 평가하는 시점과 둘 이상의 사전 조건이 있을 때의 우선순위를 정의합니다.

조건부 GET 요청은 HTTP 캐시 갱신에 가장 효율적인 메커니즘입니다 [CACHING]. 조건은 PUT 및 DELETE와 같은 상태 변경 메서드에도 적용하여 "업데이트 손실" 문제, 즉 병렬로 작업 중인 다른 클라이언트의 작업을 한 클라이언트가 실수로 덮어쓰는 문제를 방지할 수 있습니다.

13.1. 사전 조건

사전 조건은 일반적으로 대상 리소스 전체의 상태 (현재 값 집합) 또는 이전에 얻은 표현에서 관찰된 상태(그 집합의 한 값)를 기준으로 정의됩니다. 리소스에 각각 자체적으로 관찰 가능한 상태를 가진 여러 현재 표현이 있다면 사전 조건은 각 요청이 선택된 표현(3.2절)에 매핑되는 방식이 시간에 따라 일관된다고 가정합니다. 어떤 경우든 매핑이 일관되지 않거나 서버가 적절한 표현을 선택할 수 없다면 사전 조건 평가 결과가 false여도 피해가 발생하지 않습니다.

아래에 정의된 각 사전 조건은 대상 리소스의 이전 표현에서 얻은 검증자 집합과 선택된 표현(8.8절)의 현재 검증자 상태를 비교하는 것으로 구성됩니다. 따라서 이러한 사전 조건은 클라이언트가 알고 있는 특정 상태 이후 대상 리소스의 상태가 변경되었는지 평가합니다. 그러한 평가의 효과는 13.2절에 정의된 메서드 의미론과 조건 선택에 따라 달라집니다.

다른 사양에서 확장 필드로 정의하는 다른 사전 조건은 모든 수신자, 대상 리소스의 일반적인 상태 또는 리소스 그룹에 조건을 둘 수 있습니다. 예를 들어 WebDAV의 "If" 헤더 필드는 수신자가 해당 필드를 이해하고 구현하는 경우 잠금과 같은 여러 리소스의 다양한 측면에 요청을 조건부로 만들 수 있습니다([WEBDAV], 10.4절).

사전 조건의 확장성은 사전 조건을 알 수 없을 때 안전하게 무시할 수 있거나(If-Modified-Since처럼), 특정 사용 사례에서 배포를 가정할 수 있거나 대상 리소스의 다른 속성으로 구현 여부가 표시되는 경우에만 가능합니다. 이는 공통 표준의 상호 합의된 배포에 집중하도록 장려합니다.

13.1.1. If-Match

"If-Match" 헤더 필드는 필드 값이 "*"인 경우 수신 오리진 서버가 대상 리소스의 현재 표현을 하나 이상 가지고 있거나, 필드 값에 제공된 엔터티 태그 목록의 멤버와 일치하는 엔터티 태그를 가진 대상 리소스의 현재 표현을 가지고 있는 것을 조건으로 요청 메서드를 실행하도록 합니다.

클라이언트는 표현 데이터에 어떠한 변경이라도 있었다면 메서드가 적용되지 않도록 이 사전 조건을 의도하므로, 오리진 서버는 If-Match의 엔터티 태그를 비교할 때 강한 비교 함수를 MUST 사용해야 합니다(8.8.3.2절).

  If-Match = "*" / #entity-tag

예:

If-Match: "xyzzy"
If-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
If-Match: *

If-Match는 여러 사용자 에이전트가 동일한 리소스에서 병렬로 동작할 수 있을 때 우발적인 덮어쓰기를 방지하기 위해(즉, "업데이트 손실" 문제를 방지하기 위해) 상태 변경 메서드(예: POST, PUT, DELETE)와 함께 가장 자주 사용됩니다. 일반적으로 표현의 선택 또는 수정과 관련된 모든 메서드에서 선택된 표현의 현재 엔터티 태그가 If-Match 필드 값 안의 멤버가 아닌 경우 요청을 중단하는 데 사용할 수 있습니다.

오리진 서버가 표현을 선택하는 요청을 수신하고 해당 요청에 If-Match 헤더 필드가 포함되어 있으면 오리진 서버는 메서드를 수행하기 전에 13.2절에 따라 If-Match 조건을 MUST 평가해야 합니다.

수신한 If-Match 헤더 필드를 평가하려면:

  1. 필드 값이 "*"이면 오리진 서버가 대상 리소스의 현재 표현을 가지고 있는 경우 조건은 true입니다.
  2. 필드 값이 엔터티 태그 목록이면 나열된 태그 중 하나가 선택된 표현의 엔터티 태그와 일치하는 경우 조건은 true입니다.
  3. 그렇지 않으면 조건은 false입니다.

If-Match 조건을 평가하는 오리진 서버는 조건이 false로 평가되면 요청된 메서드를 MUST NOT 수행해야 합니다. 대신 오리진 서버는 412 (사전 조건 실패) 상태 코드로 응답하여 조건부 요청이 실패했음을 MAY 나타낼 수 있습니다. 또는 요청이 선택된 표현에 이미 적용된 것으로 보이는 상태 변경 작업이라면 오리진 서버는 2xx (성공) 상태 코드로 MAY 응답할 수 있습니다(즉, 사용자 에이전트가 요청한 변경은 이미 성공했지만 사용자 에이전트가 이를 알지 못할 수 있으며, 이전 응답이 손실되었거나 다른 사용자 에이전트가 동등한 변경을 수행했을 수 있음).

변경 요청이 이미 적용된 것으로 보이는 경우 오리진 서버가 성공 응답을 전송할 수 있도록 허용하는 것은 많은 작성 사용 사례에서 더 효율적이지만, 여러 사용자 에이전트가 매우 유사하지만 협력하지 않는 변경 요청을 수행하는 경우 어느 정도 위험이 있습니다. 예를 들어 여러 사용자 에이전트가 공통 리소스를 세마포어로 사용해 쓰는 경우(예: 비원자적 증가) 충돌하여 중요한 상태 전환을 잃을 가능성이 높습니다. 그러한 종류의 리소스에서는 오리진 서버가 안전하지 않은 메서드의 실패한 모든 사전 조건에 엄격하게 412를 전송하는 것이 더 좋습니다. 다른 경우에는 성공 응답에서 ETag 필드를 제외하면 사용자 에이전트가 다음 요청으로 GET을 수행하여 리소스의 현재 상태에 대한 혼란을 없애도록 유도할 수 있습니다.

클라이언트는 선택된 표현이 일치하지 않는 경우 412 (사전 조건 실패) 응답을 선호한다는 것을 나타내기 위해 GET 요청에 If-Match 헤더 필드를 MAY 전송할 수 있습니다. 그러나 이는 새 표현을 원하지 않으면서 이전에 수신한 부분 표현을 완료하기 위한 범위 요청(14절)에서만 유용합니다. 클라이언트가 새 표현을 받기를 선호하는 범위 요청에는 If-Range(13.1.5절)가 더 적합합니다.

캐시 또는 중개자는 그 상호운용성 기능이 오리진 서버에만 필요하므로 If-Match를 MAY 무시할 수 있습니다.

"*"와 다른 값("*"의 다른 인스턴스 포함)을 포함하는 목록 값을 가진 If-Match 헤더 필드는 구문상 유효하지 않으며(따라서 생성할 수 없음) 또한 상호운용 가능성이 낮다는 점에 유의하십시오.

13.1.2. If-None-Match

"If-None-Match" 헤더 필드는 필드 값이 "*"인 경우 수신 캐시 또는 오리진 서버에 대상 리소스의 현재 표현이 전혀 없거나, 필드 값에 나열된 어떠한 엔터티 태그와도 일치하지 않는 엔터티 태그를 가진 선택된 표현이 있는 것을 조건으로 요청 메서드를 실행하도록 합니다.

표현 데이터에 변경이 있었더라도 약한 엔터티 태그를 캐시 검증에 사용할 수 있으므로 수신자는 If-None-Match의 엔터티 태그를 비교할 때 약한 비교 함수를 MUST 사용해야 합니다(8.8.3.2절).

예:

If-None-Match: "xyzzy"
If-None-Match: W/"xyzzy"
If-None-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
If-None-Match: W/"xyzzy", W/"r2d2xxxx", W/"c3piozzzz"
If-None-Match: *

If-None-Match는 최소한의 트랜잭션 오버헤드로 캐시된 정보를 효율적으로 갱신할 수 있도록 주로 조건부 GET 요청에서 사용됩니다. 엔터티 태그가 있는 하나 이상의 저장된 응답을 갱신하려는 클라이언트는 GET 요청을 할 때 그러한 엔터티 태그의 목록을 포함하는 If-None-Match 헤더 필드를 SHOULD 생성해야 합니다. 이를 통해 수신 서버는 그러한 저장된 응답 중 하나가 선택된 표현과 일치할 때 304 (수정되지 않음) 응답을 전송할 수 있습니다.

If-None-Match는 클라이언트가 리소스에 현재 표현이 없다고 믿을 때 안전하지 않은 요청 메서드(예: PUT)가 대상 리소스의 기존 표현을 실수로 수정하지 못하도록 "*" 값과 함께 사용할 수도 있습니다(9.2.1절). 이는 둘 이상의 클라이언트가 대상 리소스의 초기 표현을 생성하려고 시도할 경우 발생할 수 있는 "업데이트 손실" 문제의 변형입니다.

오리진 서버가 표현을 선택하는 요청을 수신하고 해당 요청에 If-None-Match 헤더 필드가 포함되어 있으면 오리진 서버는 메서드를 수행하기 전에 13.2절에 따라 If-None-Match 조건을 MUST 평가해야 합니다.

수신한 If-None-Match 헤더 필드를 평가하려면:

  1. 필드 값이 "*"이면 오리진 서버가 대상 리소스의 현재 표현을 가지고 있는 경우 조건은 false입니다.
  2. 필드 값이 엔터티 태그 목록이면 나열된 태그 중 하나가 선택된 표현의 엔터티 태그와 일치하는 경우 조건은 false입니다.
  3. 그렇지 않으면 조건은 true입니다.

If-None-Match 조건을 평가하는 오리진 서버는 조건이 false로 평가되면 요청된 메서드를 MUST NOT 수행해야 합니다. 대신 오리진 서버는 요청 메서드가 GET 또는 HEAD인 경우 a) 304 (수정되지 않음) 상태 코드 또는 그 밖의 모든 요청 메서드의 경우 b) 412 (사전 조건 실패) 상태 코드 중 하나로 MUST 응답해야 합니다.

수신한 If-None-Match 헤더 필드의 캐시 처리 요구사항은 [CACHING]의 4.3.2절에 정의되어 있습니다.

"*"와 다른 값("*"의 다른 인스턴스 포함)을 포함하는 목록 값을 가진 If-None-Match 헤더 필드는 구문상 유효하지 않으며(따라서 생성할 수 없음) 또한 상호운용 가능성이 낮다는 점에 유의하십시오.

13.1.3. If-Modified-Since

"If-Modified-Since" 헤더 필드는 선택된 표현의 수정 날짜가 필드 값에 제공된 날짜보다 이후인 것을 조건으로 GET 또는 HEAD 요청 메서드를 실행하도록 합니다. 해당 데이터가 변경되지 않았다면 선택된 표현 데이터의 전송을 피할 수 있습니다.

필드의 예:

If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT

요청에 If-None-Match 헤더 필드가 포함되어 있으면 수신자는 If-Modified-Since를 MUST 무시해야 합니다. If-None-Match의 조건은 If-Modified-Since 조건을 더 정확하게 대체하는 것으로 간주되며, 둘은 If-None-Match를 구현하지 않을 수 있는 이전 중개자와의 상호운용을 위해서만 함께 사용됩니다.

수신한 필드 값이 유효한 HTTP-date가 아니거나, 필드 값에 둘 이상의 멤버가 있거나, 요청 메서드가 GET도 HEAD도 아닌 경우 수신자는 If-Modified-Since 헤더 필드를 MUST 무시해야 합니다.

리소스에 사용 가능한 수정 날짜가 없으면 수신자는 If-Modified-Since 헤더 필드를 MUST 무시해야 합니다.

수신자는 If-Modified-Since 필드 값의 타임스탬프를 오리진 서버의 시계를 기준으로 MUST 해석해야 합니다.

If-Modified-Since는 일반적으로 두 가지 별개의 목적으로 사용됩니다. 1) 엔터티 태그가 없는 캐시된 표현을 효율적으로 갱신하고 2) 웹 탐색의 범위를 최근에 변경된 리소스로 제한하는 것입니다.

캐시 갱신에 사용하는 경우 캐시는 일반적으로 캐시된 메시지의 Last-Modified 헤더 필드 값을 사용하여 If-Modified-Since의 필드 값을 생성합니다. 이 동작은 시계가 제대로 동기화되지 않았거나 서버가 정확한 타임스탬프 일치만 인정하도록 선택한 경우 가장 상호운용성이 높습니다(오리진 서버의 시계가 수정되거나 보관된 백업에서 표현이 복원될 때 "시간을 거슬러 가는" 것처럼 보이는 Last-Modified 날짜 문제 때문). 그러나 캐시는 특히 캐시된 메시지에 Last-Modified 헤더 필드가 없는 경우 캐시된 메시지의 Date 헤더 필드나 메시지가 수신된 시계 시각과 같은 다른 데이터를 바탕으로 필드 값을 생성하기도 합니다.

최근 시간 범위로 검색 범위를 제한하는 데 사용할 때 사용자 에이전트는 자체 시계 또는 이전 응답에서 서버로부터 수신한 Date 헤더 필드를 바탕으로 If-Modified-Since 필드 값을 생성합니다. 선택된 표현의 Last-Modified 헤더 필드를 바탕으로 정확한 타임스탬프 일치를 선택하는 오리진 서버는 지정된 기간 동안 변경된 데이터만 전송하도록 사용자 에이전트가 데이터 전송을 제한하는 데 도움을 줄 수 없습니다.

오리진 서버가 표현을 선택하는 요청을 수신하고 해당 요청에 If-None-Match 헤더 필드 없이 If-Modified-Since 헤더 필드가 포함되어 있으면 오리진 서버는 메서드를 수행하기 전에 13.2절에 따라 If-Modified-Since 조건을 SHOULD 평가해야 합니다.

수신한 If-Modified-Since 헤더 필드를 평가하려면:

  1. 선택된 표현의 마지막 수정 날짜가 필드 값에 제공된 날짜보다 이전이거나 같으면 조건은 false입니다.
  2. 그렇지 않으면 조건은 true입니다.

If-Modified-Since 조건을 평가하는 오리진 서버는 조건이 false로 평가되면 요청된 메서드를 SHOULD NOT 수행해야 합니다. 대신 오리진 서버는 이전에 캐시된 응답을 식별하거나 갱신하는 데 유용한 메타데이터만 포함하여 304 (수정되지 않음) 응답을 SHOULD 생성해야 합니다.

수신한 If-Modified-Since 헤더 필드의 캐시 처리 요구사항은 [CACHING]의 4.3.2절에 정의되어 있습니다.

13.1.4. If-Unmodified-Since

"If-Unmodified-Since" 헤더 필드는 선택된 표현의 마지막 수정 날짜가 필드 값에 제공된 날짜보다 이전이거나 같은 것을 조건으로 요청 메서드를 실행하도록 합니다. 이 필드는 사용자 에이전트가 표현의 엔터티 태그를 가지고 있지 않은 경우 If-Match와 동일한 목적을 달성합니다.

필드의 예:

If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT

요청에 If-Match 헤더 필드가 포함되어 있으면 수신자는 If-Unmodified-Since를 MUST 무시해야 합니다. If-Match의 조건은 If-Unmodified-Since 조건을 더 정확하게 대체하는 것으로 간주되며, 둘은 If-Match를 구현하지 않을 수 있는 이전 중개자와의 상호운용을 위해서만 함께 사용됩니다.

수신한 필드 값이 유효한 HTTP-date가 아닌 경우(필드 값이 날짜 목록으로 보이는 경우 포함) 수신자는 If-Unmodified-Since 헤더 필드를 MUST 무시해야 합니다.

리소스에 사용 가능한 수정 날짜가 없으면 수신자는 If-Unmodified-Since 헤더 필드를 MUST 무시해야 합니다.

수신자는 If-Unmodified-Since 필드 값의 타임스탬프를 오리진 서버의 시계를 기준으로 MUST 해석해야 합니다.

If-Unmodified-Since는 여러 사용자 에이전트가 엔터티 태그를 제공하지 않는 표현을 가진 리소스에서 병렬로 동작할 수 있을 때 우발적인 덮어쓰기를 방지하기 위해(즉, "업데이트 손실" 문제를 방지하기 위해) 상태 변경 메서드(예: POST, PUT, DELETE)와 함께 가장 자주 사용됩니다. 일반적으로 표현의 선택 또는 수정과 관련된 모든 메서드에서 선택된 표현의 마지막 수정 날짜가 If-Unmodified-Since 필드 값에 제공된 날짜 이후 변경된 경우 요청을 중단하는 데 사용할 수 있습니다.

오리진 서버가 표현을 선택하는 요청을 수신하고 해당 요청에 If-Match 헤더 필드 없이 If-Unmodified-Since 헤더 필드가 포함되어 있으면 오리진 서버는 메서드를 수행하기 전에 13.2절에 따라 If-Unmodified-Since 조건을 MUST 평가해야 합니다.

수신한 If-Unmodified-Since 헤더 필드를 평가하려면:

  1. 선택된 표현의 마지막 수정 날짜가 필드 값에 제공된 날짜보다 이전이거나 같으면 조건은 true입니다.
  2. 그렇지 않으면 조건은 false입니다.

If-Unmodified-Since 조건을 평가하는 오리진 서버는 조건이 false로 평가되면 요청된 메서드를 MUST NOT 수행해야 합니다. 대신 오리진 서버는 412 (사전 조건 실패) 상태 코드로 응답하여 조건부 요청이 실패했음을 MAY 나타낼 수 있습니다. 또는 요청이 선택된 표현에 이미 적용된 것으로 보이는 상태 변경 작업이라면 오리진 서버는 2xx (성공) 상태 코드로 MAY 응답할 수 있습니다(즉, 사용자 에이전트가 요청한 변경은 이미 성공했지만 사용자 에이전트가 이를 알지 못할 수 있으며, 이전 응답이 손실되었거나 다른 사용자 에이전트가 동등한 변경을 수행했을 수 있음).

변경 요청이 이미 적용된 것으로 보이는 경우 오리진 서버가 성공 응답을 전송할 수 있도록 허용하는 것은 많은 작성 사용 사례에서 더 효율적이지만, 여러 사용자 에이전트가 매우 유사하지만 협력하지 않는 변경 요청을 수행하는 경우 어느 정도 위험이 있습니다. 그러한 경우 오리진 서버는 안전하지 않은 메서드의 실패한 모든 사전 조건에 엄격하게 412를 전송하는 것이 더 좋습니다.

클라이언트는 선택된 표현이 수정된 경우 412 (사전 조건 실패) 응답을 선호한다는 것을 나타내기 위해 GET 요청에 If-Unmodified-Since 헤더 필드를 MAY 전송할 수 있습니다. 그러나 이는 새 표현을 원하지 않으면서 이전에 수신한 부분 표현을 완료하기 위한 범위 요청(14절)에서만 유용합니다. 클라이언트가 새 표현을 받기를 선호하는 범위 요청에는 If-Range(13.1.5절)가 더 적합합니다.

캐시 또는 중개자는 그 상호운용성 기능이 오리진 서버에만 필요하므로 If-Unmodified-Since를 MAY 무시할 수 있습니다.

13.1.5. If-Range

"If-Range" 헤더 필드는 If-Match 및 If-Unmodified-Since 헤더 필드와 유사하지만 검증자가 일치하지 않으면 수신자에게 Range 헤더 필드를 무시하도록 지시하여 412 (사전 조건 실패) 응답 대신 새 선택된 표현을 전송하게 하는 특별한 조건부 요청 메커니즘을 제공합니다.

클라이언트가 표현의 부분 사본을 가지고 있고 전체 표현의 최신 사본을 원한다면 조건부 GET에서 Range 헤더 필드를 사용할 수 있습니다(If-Unmodified-Since 및 If-Match 중 하나 또는 둘 다 사용). 그러나 표현이 수정되어 사전 조건이 실패하면 클라이언트는 전체 현재 표현을 얻기 위해 두 번째 요청을 해야 합니다.

"If-Range" 헤더 필드를 사용하면 클라이언트가 두 번째 요청을 "단락"할 수 있습니다. 비공식적으로 그 의미는 다음과 같습니다. 표현이 변경되지 않았다면 Range에서 요청한 부분을 보내고, 그렇지 않으면 전체 표현을 보내십시오.

유효한 entity-tag는 처음 세 문자에서 DQUOTE를 검사하여 유효한 HTTP-date와 구별할 수 있습니다.

클라이언트는 Range 헤더 필드를 포함하지 않는 요청에 If-Range 헤더 필드를 MUST NOT 생성해야 합니다. 서버는 Range 헤더 필드를 포함하지 않는 요청에서 수신한 If-Range 헤더 필드를 MUST 무시해야 합니다. 오리진 서버는 Range 요청을 지원하지 않는 대상 리소스에 대한 요청에서 수신한 If-Range 헤더 필드를 MUST 무시해야 합니다.

클라이언트는 약한 것으로 표시된 엔터티 태그를 포함하는 If-Range 헤더 필드를 MUST NOT 생성해야 합니다. 클라이언트는 대응하는 표현에 대한 엔터티 태그가 없고 날짜가 8.8.2.2절에서 정의한 의미의 강한 검증자인 경우가 아니라면 HTTP-date를 포함하는 If-Range 헤더 필드를 MUST NOT 생성해야 합니다.

Range 요청에서 If-Range 헤더 필드를 수신한 서버는 메서드를 수행하기 전에 13.2절에 따라 조건을 MUST 평가해야 합니다.

HTTP-date를 포함하는 수신된 If-Range 헤더 필드를 평가하려면:

  1. 제공된 HTTP-date 검증자가 8.8.2.2절에서 정의한 의미의 강한 검증자가 아니면 조건은 false입니다.
  2. 제공된 HTTP-date 검증자가 선택된 표현의 Last-Modified 필드 값과 정확히 일치하면 조건은 true입니다.
  3. 그렇지 않으면 조건은 false입니다.

entity-tag를 포함하는 수신된 If-Range 헤더 필드를 평가하려면:

  1. 제공된 entity-tag 검증자가 강한 비교 함수(8.8.3.2절)를 사용하여 선택된 표현의 ETag 필드 값과 정확히 일치하면 조건은 true입니다.
  2. 그렇지 않으면 조건은 false입니다.

If-Range 헤더 필드의 수신자는 If-Range 조건이 false로 평가되면 Range 헤더 필드를 MUST 무시해야 합니다. 그렇지 않으면 수신자는 요청된 대로 Range 헤더 필드를 SHOULD 처리해야 합니다.

If-Range 비교는 검증자가 HTTP-date인 경우를 포함해 정확히 일치하는지를 비교하므로 If-Unmodified-Since 조건을 평가할 때 사용하는 "이전이거나 같음" 비교와 다르다는 점에 유의하십시오.

13.2. 사전 조건 평가

13.2.1. 평가 시점

아래에서 제외하는 경우를 제외하고 수신 캐시 또는 오리진 서버는 정상적인 요청 검사를 성공적으로 수행한 후, 요청 콘텐츠(있는 경우)를 처리하거나 요청 메서드와 관련된 동작을 수행하기 직전에 수신된 요청 사전 조건을 MUST 평가해야 합니다. 이러한 조건이 없는 동일한 요청에 대한 응답이 요청 콘텐츠를 처리하기 전에 2xx (성공) 또는 412 (사전 조건 실패) 이외의 상태 코드였을 경우 서버는 수신된 모든 사전 조건을 MUST 무시해야 합니다. 즉, 중요한 처리가 이루어지기 전에 감지할 수 있는 리디렉션과 실패가 사전 조건 평가보다 우선합니다.

대상 리소스의 오리진 서버가 아니며 대상 리소스에 대한 요청의 캐시 역할을 할 수 없는 서버는 이 사양에서 정의한 조건부 요청 헤더 필드를 MUST NOT 평가해야 하며, 요청을 전달한다면 이를 MUST 전달해야 합니다. 생성한 클라이언트는 현재 표현을 제공할 수 있는 서버가 이를 평가하도록 의도하기 때문입니다. 마찬가지로 서버는 CONNECT, OPTIONS 또는 TRACE처럼 선택된 표현의 선택 또는 수정과 관련되지 않는 요청 메서드와 함께 수신된 경우 이 사양에서 정의한 조건부 요청 헤더 필드를 MUST 무시해야 합니다.

프로토콜 확장은 사전 조건을 평가하는 조건이나 평가 결과를 변경할 수 있다는 점에 유의하십시오. 예를 들어 immutable 캐시 지시어([RFC8246]에서 정의)는 캐시가 신선한 응답을 보유하고 있을 때 조건부 요청을 전달하지 않도록 지시합니다.

조건부 요청 헤더 필드는 HEAD의 의미론을 GET과 일관되게 유지하기 위해 HEAD 메서드와 함께 사용할 수 있는 것으로 정의되어 있지만, 성공적인 응답은 304 (수정되지 않음) 응답과 거의 같은 크기이고 412 (사전 조건 실패) 응답보다 더 유용하므로 조건부 HEAD를 전송할 의미는 없습니다.

13.2.2. 사전 조건의 우선순위

요청에 둘 이상의 조건부 요청 헤더 필드가 있으면 필드를 평가하는 순서가 중요해집니다. 실제로 이 문서에 정의된 필드는 일관되게 하나의 논리적 순서로 구현됩니다. "업데이트 손실" 사전 조건은 캐시 검증보다 더 엄격한 요구사항을 가지며, 검증된 캐시는 부분 응답보다 더 효율적이고, 엔터티 태그는 날짜 검증자보다 더 정확한 것으로 간주되기 때문입니다.

수신 캐시 또는 오리진 서버는 이 사양에서 정의한 요청 사전 조건을 다음 순서로 MUST 평가해야 합니다.

  1. 수신자가 오리진 서버이고 If-Match가 있으면 If-Match 사전 조건을 평가합니다.

    • true이면 3단계로 계속합니다.
    • false이면 상태 변경 요청이 이미 성공했음을 확인할 수 있는 경우가 아니라면 412 (사전 조건 실패)로 응답합니다(13.1.1절 참조).
  2. 수신자가 오리진 서버이고 If-Match가 없으며 If-Unmodified-Since가 있으면 If-Unmodified-Since 사전 조건을 평가합니다.

    • true이면 3단계로 계속합니다.
    • false이면 상태 변경 요청이 이미 성공했음을 확인할 수 있는 경우가 아니라면 412 (사전 조건 실패)로 응답합니다(13.1.4절 참조).
  3. If-None-Match가 있으면 If-None-Match 사전 조건을 평가합니다.

  4. 메서드가 GET 또는 HEAD이고 If-None-Match가 없으며 If-Modified-Since가 있으면 If-Modified-Since 사전 조건을 평가합니다.

  5. 메서드가 GET이고 Range와 If-Range가 모두 있으면 If-Range 사전 조건을 평가합니다.

  6. 그렇지 않으면,

    • 요청된 메서드를 수행하고 성공 또는 실패에 따라 응답합니다.

추가 조건부 요청 헤더 필드를 정의하는 HTTP 확장은 그러한 필드를 이 문서에 정의된 필드 및 실제로 존재할 수 있는 다른 조건과 관련하여 평가하는 순서를 정의하는 것이 바람직합니다.

14. 범위 요청

클라이언트는 요청 취소나 연결 끊김으로 인해 데이터 전송이 중단되는 경우가 많습니다. 클라이언트가 부분 표현을 저장한 경우 전체 표현을 다시 전송하는 대신 후속 요청에서 해당 표현의 나머지를 요청하는 것이 바람직합니다. 마찬가지로 로컬 저장 공간이 제한된 장치는 매우 큰 문서의 한 페이지나 포함된 이미지의 크기처럼 더 큰 표현의 일부만 요청할 수 있으면 유용할 수 있습니다.

범위 요청은 HTTP의 OPTIONAL 기능으로, 이 기능을 구현하지 않거나 대상 리소스에 대해 지원하지 않는 수신자가 상호운용성에 영향을 주지 않고 일반 GET 요청인 것처럼 응답할 수 있도록 설계되었습니다. 부분 응답은 이 기능을 구현하지 않을 수 있는 캐시가 전체 응답으로 오인하지 않도록 별도의 상태 코드로 나타냅니다.

14.1. 범위 단위

표현 데이터의 콘텐츠 코딩 또는 미디어 유형에 내재된 주소 지정 가능한 구조 단위가 있는 경우 표현 데이터를 하위 범위로 나눌 수 있습니다. 예를 들어 옥텟(일명 바이트) 경계는 모든 표현 데이터에 공통적인 구조 단위이므로 데이터의 시작 또는 끝에서 일정 오프셋에 있는 바이트 범위로 데이터의 일부를 식별할 수 있습니다.

이러한 일반적인 범위 단위 개념은 Accept-Ranges(14.3절) 응답 헤더 필드에서 범위 요청 지원을 알리는 데, Range(14.2절) 요청 헤더 필드에서 요청되는 표현의 부분을 구분하는 데, 그리고 Content-Range(14.4절) 헤더 필드에서 표현의 어느 부분이 전송되는지 설명하는 데 사용됩니다.

모든 범위 단위 이름은 대소문자를 구분하지 않으며 16.5.1절에 정의된 대로 "HTTP Range Unit Registry"에 등록하는 것이 바람직합니다.

범위 단위는 16.5절에 설명된 대로 확장 가능하도록 의도되었습니다.

14.1.1. 범위 지정자

범위는 범위 단위와 범위 지정자 집합을 함께 사용하여 표현됩니다. 범위 단위 이름은 자체 지정자에 어떤 종류의 range-spec을 적용할 수 있는지 결정합니다. 따라서 다음 문법은 일반적입니다. 각 범위 단위는 int-range, suffix-range 및 other-range가 허용되는 시점에 대한 요구사항을 지정해야 합니다.

범위 요청은 하나의 표현 안에서 단일 범위 또는 범위 집합을 지정할 수 있습니다.

int-range는 두 개의 음이 아닌 정수 또는 하나의 음이 아닌 정수부터 표현 데이터 끝까지로 표현되는 범위입니다. 범위 단위는 정수가 무엇을 의미하는지 지정합니다(예: 시작점에서의 단위 오프셋, 포함되는 번호가 매겨진 부분 등을 나타낼 수 있음).

int-range는 last-pos 값이 존재하고 first-pos보다 작으면 유효하지 않습니다.

suffix-range는 제공된 음이 아닌 정수의 최대 길이(범위 단위)를 가진 표현 데이터의 접미부로 표현되는 범위입니다. 즉 표현 데이터의 마지막 N 단위입니다.

확장성을 제공하기 위해 other-range 규칙은 애플리케이션별 또는 향후 범위 단위가 추가 범위 지정자를 정의할 수 있도록 하는 거의 제약이 없는 문법입니다.

  other-range   = 1*( %x21-2B / %x2D-7E )
                ; 쉼표를 제외한 1*(VCHAR)

ranges-specifier는 표시된 range-unit에 대해 유효하지 않거나 정의되지 않은 range-spec을 포함하면 유효하지 않습니다.

유효한 ranges-specifier는 표시된 range-unit이 정의하는 바에 따라 충족 가능한 range-spec을 하나 이상 포함하면 충족 가능합니다. 그렇지 않으면 ranges-specifier는 충족 불가능합니다.

14.1.2. 바이트 범위

"bytes" 범위 단위는 표현 데이터의 옥텟 시퀀스 하위 범위를 표현하는 데 사용됩니다. 각 바이트 범위는 표현 데이터의 시작(int-range) 또는 끝(suffix-range)을 기준으로 일정 오프셋의 정수 범위로 표현됩니다. 바이트 범위는 other-range 지정자를 사용하지 않습니다.

bytes int-range의 first-pos 값은 범위의 첫 번째 바이트 오프셋을 나타냅니다. last-pos 값은 범위의 마지막 바이트 오프셋을 나타냅니다. 즉 지정된 바이트 위치는 양 끝을 포함합니다. 바이트 오프셋은 0에서 시작합니다.

표현 데이터에 콘텐츠 코딩이 적용되어 있으면 각 바이트 범위는 디코딩 후 얻는 기본 바이트 시퀀스가 아니라 인코딩된 바이트 시퀀스를 기준으로 계산됩니다.

bytes 범위 지정자의 예:

  • 처음 500바이트(바이트 오프셋 0-499, 양 끝 포함):

    bytes=0-499
    
  • 두 번째 500바이트(바이트 오프셋 500-999, 양 끝 포함):

    bytes=500-999
    

클라이언트는 선택된 표현의 크기를 알지 못해도 요청할 바이트 수를 제한할 수 있습니다. last-pos 값이 없거나 그 값이 표현 데이터의 현재 길이보다 크거나 같으면 바이트 범위는 표현의 나머지로 해석됩니다(즉, 서버는 last-pos 값을 선택된 표현의 현재 길이보다 1 작은 값으로 대체합니다).

클라이언트는 suffix-range를 사용하여 선택된 표현의 마지막 N바이트(N > 0)를 참조할 수 있습니다. 선택된 표현이 지정된 suffix-length보다 짧으면 전체 표현을 사용합니다.

길이가 10000인 표현을 가정한 추가 예:

  • 마지막 500바이트(바이트 오프셋 9500-9999, 양 끝 포함):

    bytes=-500
    

    또는:

    bytes=9500-
    
  • 첫 번째와 마지막 바이트만(바이트 0 및 9999):

    bytes=0-0,-1
    
  • 처음, 중간, 마지막 1000바이트:

    bytes= 0-999, 4500-5499, -1000
    
  • 두 번째 500바이트를 지정하는 다른 유효한(하지만 정규 형식이 아닌) 방법 (바이트 오프셋 500-999, 양 끝 포함):

    bytes=500-600,601-999
    bytes=500-700,601-999
    

GET 요청의 경우 유효한 bytes range-spec은 다음 중 하나이면 충족 가능합니다.

선택된 표현의 길이가 0인 경우 GET 요청의 range-spec에서 충족 가능한 유일한 형식은 0이 아닌 suffix-length를 가진 suffix-range입니다.

바이트 범위 구문에서 first-pos, last-pos 및 suffix-length는 옥텟의 십진수로 표현됩니다. 콘텐츠 길이에 미리 정의된 제한이 없으므로 수신자는 잠재적으로 큰 십진수를 예상하고 정수 변환 오버플로로 인한 구문 분석 오류를 MUST 방지해야 합니다.

14.2. Range

GET 요청의 "Range" 헤더 필드는 전체 선택된 표현 대신 선택된 표현 데이터(8.1절)의 하나 이상의 하위 범위만 전송하도록 요청하도록 메서드 의미론을 수정합니다.

서버는 Range 헤더 필드를 MAY 무시할 수 있습니다. 그러나 오리진 서버와 중간 캐시는 부분적으로 실패한 전송에서 효율적으로 복구하고 큰 표현을 부분적으로 검색할 수 있으므로 가능한 경우 바이트 범위를 지원하는 것이 바람직합니다.

서버는 인식하지 못하거나 범위 처리가 정의되지 않은 요청 메서드와 함께 수신한 Range 헤더 필드를 MUST 무시해야 합니다. 이 사양에서는 GET만 범위 처리가 정의된 메서드입니다.

오리진 서버는 자신이 이해하지 못하는 범위 단위를 포함하는 Range 헤더 필드를 MUST 무시해야 합니다. 프록시는 자신이 이해하지 못하는 범위 단위를 포함하는 Range 헤더 필드를 MAY 버릴 수 있습니다.

범위 요청을 지원하는 서버는 유효하지 않은 ranges-specifier(14.1.1절), 두 개를 초과하는 중첩 범위를 가진 ranges-specifier, 또는 오름차순으로 나열되지 않은 다수의 작은 범위를 포함하는 Range 헤더 필드를 MAY 무시하거나 거부할 수 있습니다. 이는 고장 난 클라이언트나 의도적인 서비스 거부 공격을 나타내기 때문입니다(17.15절). 클라이언트는 같은 데이터를 포함하는 단일 범위보다 처리 및 전송 효율이 본질적으로 낮은 여러 범위를 요청하지 않는 것이 SHOULD NOT 요구됩니다.

선택된 표현에 콘텐츠가 없는 경우(즉, 선택된 표현의 데이터 길이가 0인 경우) 범위 요청을 지원하는 서버는 Range 헤더 필드를 MAY 무시할 수 있습니다.

여러 범위를 요청하는 클라이언트는 이후 부분을 더 일찍 요청해야 하는 특별한 필요가 없는 한 해당 범위를 오름차순(완전한 표현에서 일반적으로 수신되는 순서)으로 나열하는 것이 SHOULD 요구됩니다. 예를 들어 내부 부분 카탈로그가 있는 큰 표현을 처리하는 사용자 에이전트는 이후 부분을 먼저 요청해야 할 수 있으며, 특히 표현이 역순으로 저장된 페이지로 구성되고 사용자 에이전트가 한 번에 한 페이지씩 전송하려는 경우 그렇습니다.

Range 헤더 필드는 13.1절에 정의된 사전 조건 헤더 필드를 평가한 뒤, Range 헤더 필드가 없을 경우의 결과가 200 (OK) 응답일 때만 평가됩니다. 즉 조건부 GET이 304 (수정되지 않음) 응답을 생성하는 경우 Range는 무시됩니다.

If-Range 헤더 필드(13.1.5절)는 Range 헤더 필드를 적용하기 위한 사전 조건으로 사용할 수 있습니다.

모든 사전 조건이 true이고, 서버가 대상 리소스에 대한 Range 헤더 필드를 지원하고, 수신한 Range 필드 값이 해당 대상 리소스에서 지원하는 range-unit이 있는 유효한 ranges-specifier를 포함하며, 해당 ranges-specifier가 선택된 표현에 대해 충족 가능한 경우 서버는 요청된 충족 가능한 range-spec에 대응하는 하나 이상의 부분 표현을 콘텐츠로 포함하는 206 (부분 콘텐츠) 응답을 SHOULD 전송해야 합니다.

위 내용이 서버가 요청된 모든 범위를 전송한다는 의미는 아닙니다. 경우에 따라 요청된 범위의 일부만 먼저 전송하고, 클라이언트가 나머지를 여전히 원하는 경우 나중에 다시 요청할 것으로 예상하는 것이 가능하거나 효율적일 수 있습니다 (15.3.7절 참조).

모든 사전 조건이 true이고, 서버가 대상 리소스에 대한 Range 헤더 필드를 지원하고, 수신한 Range 필드 값이 유효한 ranges-specifier를 포함하며, range-unit이 해당 대상 리소스에서 지원되지 않거나 ranges-specifier가 선택된 표현에 대해 충족 불가능한 경우 서버는 416 (범위를 충족할 수 없음) 응답을 SHOULD 전송해야 합니다.

14.3. Accept-Ranges

응답의 "Accept-Ranges" 필드는 업스트림 서버가 대상 리소스의 범위 요청을 지원하는지 나타냅니다.

예를 들어 바이트 범위 요청(14.1.2절)을 지원하는 서버는 다음 필드를 전송하여

Accept-Ranges: bytes

해당 대상 리소스에 대한 바이트 범위 요청을 지원함을 나타내고, 같은 요청 경로에서 향후 부분 요청에 클라이언트가 이를 사용하도록 장려할 수 있습니다. 범위 단위는 14.1절에 정의되어 있습니다.

클라이언트는 Accept-Ranges 필드를 수신했는지 여부와 관계없이 범위 요청을 MAY 생성할 수 있습니다. 이 정보는 성능을 향상하고 불필요한 네트워크 전송을 줄이기 위한 조언만 제공합니다.

반대로 클라이언트는 Accept-Ranges 필드를 수신했다고 해서 향후 범위 요청이 부분 응답을 반환할 것이라고 MUST NOT 가정해야 합니다. 콘텐츠가 변경되거나, 서버가 특정 시점 또는 특정 조건에서만 범위 요청을 지원하거나, 다른 중개자가 다음 요청을 처리할 수 있습니다.

대상 리소스에 어떠한 종류의 범위 요청도 지원하지 않는 서버는 MAY 다음을 전송하여

Accept-Ranges: none

클라이언트가 동일한 요청 경로에서 범위 요청을 시도하지 않도록 안내할 수 있습니다. 범위 단위 "none"은 이 목적으로 예약되어 있습니다.

Accept-Ranges 필드는 트레일러 섹션에서 MAY 전송할 수 있지만, 콘텐츠 중간에서 실패한 대규모 정보 전송을 다시 시작하는 데 특히 유용한 정보이므로 (트레일러 섹션을 수신하기 전에) 헤더 필드로 전송하는 것이 선호됩니다.

14.4. Content-Range

"Content-Range" 헤더 필드는 단일 부분 206 (부분 콘텐츠) 응답에서 메시지 콘텐츠로 포함된 선택된 표현의 부분 범위를 나타내기 위해 전송되고, 멀티파트 206 응답의 각 부분에서는 각 본문 부분에 포함된 범위를 나타내기 위해 전송되며(14.6절), 416 (범위를 충족할 수 없음) 응답에서는 선택된 표현에 관한 정보를 제공하기 위해 전송됩니다.

206 (부분 콘텐츠) 응답에 수신자가 이해하지 못하는 범위 단위(14.1절)가 있는 Content-Range 헤더 필드가 포함되면 수신자는 이를 저장된 표현과 다시 결합하려고 MUST NOT 해야 합니다. 그러한 메시지를 수신한 프록시는 다운스트림으로 전달하는 것이 SHOULD 요구됩니다.

Content-Range는 클라이언트와 오리진 서버 간의 비공개 합의에 따라 14.5절에 설명된 부분 PUT을 요청하기 위한 요청 수정자로도 전송할 수 있습니다. 서버는 Content-Range 지원이 정의되지 않은 메서드의 요청에서 수신한 Content-Range 헤더 필드를 MUST 무시해야 합니다.

바이트 범위의 경우 송신자는 전체 길이를 알 수 없거나 결정하기 어려운 경우가 아니라면 범위를 추출한 표현의 전체 길이를 SHOULD 나타내야 합니다. complete-length 대신 별표 문자("*")는 헤더 필드를 생성할 때 표현 길이를 알 수 없었음을 나타냅니다.

다음 예는 송신자가 선택된 표현의 전체 길이가 1234바이트임을 알고 있는 경우를 보여 줍니다.

Content-Range: bytes 42-1233/1234

두 번째 예는 전체 길이를 알 수 없는 경우를 보여 줍니다.

Content-Range: bytes 42-1233/*

Content-Range 필드 값은 last-pos 값이 first-pos 값보다 작은 range-resp을 포함하거나, last-pos 값보다 작거나 같은 complete-length 값을 포함하면 유효하지 않습니다. 유효하지 않은 Content-Range의 수신자는 수신한 콘텐츠를 저장된 표현과 다시 결합하려고 MUST NOT 해야 합니다.

바이트 범위 요청에 대한 416 (범위를 충족할 수 없음) 응답을 생성하는 서버는 다음 예와 같이 unsatisfied-range 값을 가진 Content-Range 헤더 필드를 SHOULD 전송해야 합니다.

Content-Range: bytes */1234

416 응답의 complete-length는 선택된 표현의 현재 길이를 나타냅니다.

Content-Range 헤더 필드는 의미론을 명시적으로 설명하지 않는 상태 코드에서는 의미가 없습니다. 이 사양에서는 206 (부분 콘텐츠) 및 416 (범위를 충족할 수 없음) 상태 코드만 Content-Range의 의미를 설명합니다.

다음은 선택된 표현이 총 1234바이트를 포함하는 Content-Range 값의 예입니다.

  • 처음 500바이트:

    Content-Range: bytes 0-499/1234
    
  • 두 번째 500바이트:

    Content-Range: bytes 500-999/1234
    
  • 처음 500바이트를 제외한 모두:

    Content-Range: bytes 500-1233/1234
    
  • 마지막 500바이트:

    Content-Range: bytes 734-1233/1234
    

14.5. 부분 PUT

일부 오리진 서버는 사용자 에이전트가 요청에 Content-Range 헤더 필드(14.4절)를 전송할 때 부분 표현의 PUT을 지원하지만, 이러한 지원은 일관되지 않으며 사용자 에이전트와의 비공개 합의에 의존합니다. 일반적으로 이는 대상 리소스의 상태 일부를 Content-Range 값으로 표시된 오프셋과 길이에서 포함된 콘텐츠로 대체하도록 요청하며, 오프셋은 현재 선택된 표현을 기준으로 합니다.

부분 PUT 요청을 지원하지 않는 대상 리소스에 대한 PUT에서 Content-Range를 수신하면 오리진 서버는 400 (잘못된 요청) 상태 코드로 SHOULD 응답해야 합니다.

부분 PUT은 PUT의 원래 정의와 하위 호환되지 않습니다. 콘텐츠가 현재 표현을 완전히 대체하는 것으로 기록될 수 있습니다.

부분 리소스 갱신은 더 큰 리소스의 일부와 겹치거나 확장되는 상태를 가진 별도로 식별된 리소스를 대상으로 하거나, 부분 갱신을 위해 특별히 정의된 다른 메서드를 사용하여 수행할 수도 있습니다(예: [RFC5789]에 정의된 PATCH 메서드).

14.6. 미디어 유형 multipart/byteranges

206 (부분 콘텐츠) 응답 메시지가 여러 범위의 콘텐츠를 포함하면 "multipart/byteranges" 미디어 유형을 가진 멀티파트 메시지 본문([RFC2046], 5.1절)의 본문 부분으로 전송됩니다.

"multipart/byteranges" 미디어 유형은 하나 이상의 본문 부분을 포함하며 각각 자체 Content-Type 및 Content-Range 필드를 가집니다. 필수 boundary 매개변수는 각 본문 부분을 구분하는 데 사용되는 경계 문자열을 지정합니다.

구현 참고:

  1. 본문의 첫 번째 경계 문자열 앞에 추가 CRLF가 올 수 있습니다.
  2. [RFC2046]은 경계 문자열을 인용하는 것을 허용하지만, 일부 기존 구현은 인용된 경계 문자열을 잘못 처리합니다.
  3. 다수의 클라이언트와 서버는 "multipart/x-byteranges" 미디어 유형을 사용하던 byteranges 사양의 초기 초안을 기준으로 구현되었습니다. 이 유형은 현재 유형과 거의(하지만 완전히는 아니게) 호환됩니다.

이름과 달리 "multipart/byteranges" 미디어 유형은 바이트 범위로 제한되지 않습니다. 다음 예에서는 "exampleunit" 범위 단위를 사용합니다.

HTTP/1.1 206 Partial Content
Date: Tue, 14 Nov 1995 06:25:24 GMT
Last-Modified: Tue, 14 July 04:58:08 GMT
Content-Length: 2331785
Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES

--THIS_STRING_SEPARATES
Content-Type: video/example
Content-Range: exampleunit 1.2-4.3/25

...the first range...
--THIS_STRING_SEPARATES
Content-Type: video/example
Content-Range: exampleunit 11.2-14.3/25

...the second range
--THIS_STRING_SEPARATES--

다음 정보는 "multipart/byteranges" 미디어 유형의 등록 양식으로 사용됩니다.

유형 이름:
multipart
하위 유형 이름:
byteranges
필수 매개변수:
boundary
선택적 매개변수:
해당 없음
인코딩 고려사항:
"7bit", "8bit" 또는 "binary"만 허용됩니다.
보안 고려사항:
17절 참조
상호운용성 고려사항:
해당 없음
게시된 사양:
RFC 9110(14.6절 참조)
이 미디어 유형을 사용하는 애플리케이션:
단일 요청에서 여러 범위를 지원하는 HTTP 구성요소
프래그먼트 식별자 고려사항:
해당 없음
추가 정보:
이 유형의 폐기된 별칭 이름:
해당 없음
매직 넘버:
해당 없음
파일 확장자:
해당 없음
Macintosh 파일 유형 코드:
해당 없음
추가 정보를 문의할 사람과 이메일 주소:
저자 주소 절을 참조하십시오.
의도된 용도:
일반적
사용 제한:
해당 없음
저자:
저자 주소 절을 참조하십시오.
변경 관리자:
IESG

15. 상태 코드

응답의 상태 코드는 요청이 성공했는지와 어떤 콘텐츠가 포함되는지(있는 경우)를 포함하여 요청의 결과와 응답의 의미론을 설명하는 세 자리 정수 코드입니다. 모든 유효한 상태 코드는 100 이상 599 이하의 범위에 있습니다.

상태 코드의 첫 번째 숫자는 응답 클래스를 정의합니다. 마지막 두 숫자는 분류 역할을 하지 않습니다. 첫 번째 숫자에는 다섯 가지 값이 있습니다.

HTTP 상태 코드는 확장 가능합니다. 클라이언트가 등록된 모든 상태 코드의 의미를 이해할 필요는 없지만 이해하는 것이 분명히 바람직합니다. 그러나 클라이언트는 첫 번째 숫자로 표시되는 모든 상태 코드의 클래스를 MUST 이해하고 인식하지 못하는 상태 코드를 해당 클래스의 x00 상태 코드와 동등한 것으로 처리해야 합니다.

예를 들어 클라이언트가 인식하지 못하는 상태 코드 471을 수신하면 첫 번째 숫자를 통해 요청에 문제가 있었음을 알 수 있으며 400 (잘못된 요청) 상태 코드를 수신한 것처럼 응답을 처리할 수 있습니다. 응답 메시지는 일반적으로 상태를 설명하는 표현을 포함합니다.

100..599 범위를 벗어난 값은 유효하지 않습니다. 구현은 비 HTTP 상태의 내부 통신 (예: 라이브러리 오류)에 해당 범위를 벗어난 세 자리 정수 값(즉, 600..999)을 사용하는 경우가 많습니다. 유효하지 않은 상태 코드를 가진 응답을 수신한 클라이언트는 해당 응답을 5xx (서버 오류) 상태 코드인 것처럼 SHOULD 처리해야 합니다.

하나의 요청에는 여러 관련 응답이 있을 수 있습니다. "정보성" (1xx) 범위의 상태 코드를 가진 0개 이상의 임시 (비최종) 응답 뒤에 다른 범위 중 하나의 상태 코드를 가진 정확히 하나의 최종 응답이 옵니다.

15.1. 상태 코드 개요

아래 나열된 상태 코드는 이 사양에서 정의됩니다. 여기에 나열된 이유 구문은 권장 사항일 뿐이며, 프로토콜에 영향을 주지 않고 지역화된 동등 표현으로 대체하거나 완전히 생략할 수 있습니다.

휴리스틱하게 캐시 가능한 것으로 정의된 상태 코드가 있는 응답(예: 이 사양의 200, 203, 204, 206, 300, 301, 308, 404, 405, 410, 414 및 501)은 메서드 정의 또는 명시적인 캐시 제어에서 달리 나타내지 않는 한 휴리스틱 만료를 사용해 캐시에서 재사용할 수 있습니다 [CACHING]. 다른 모든 상태 코드는 휴리스틱하게 캐시할 수 없습니다.

이 사양의 범위를 벗어난 추가 상태 코드도 HTTP에서 사용하도록 지정되어 있습니다. 그러한 모든 상태 코드는 16.2절에 설명된 대로 "Hypertext Transfer Protocol (HTTP) Status Code Registry"에 등록하는 것이 바람직합니다.

15.2. 정보성 1xx

1xx(정보성) 클래스의 상태 코드는 요청된 동작을 완료하고 최종 응답을 전송하기 전에 연결 상태 또는 요청 진행 상황을 전달하기 위한 임시 응답을 나타냅니다. HTTP/1.0은 1xx 상태 코드를 정의하지 않았으므로 서버는 HTTP/1.0 클라이언트에 1xx 응답을 MUST NOT 전송해야 합니다.

1xx 응답은 헤더 섹션의 끝에서 종료되며 콘텐츠나 트레일러를 포함할 수 없습니다.

클라이언트는 예상하지 않았더라도 최종 응답 전에 수신한 하나 이상의 1xx 응답을 구문 분석할 수 MUST 있어야 합니다. 사용자 에이전트는 예상하지 못한 1xx 응답을 MAY 무시할 수 있습니다.

프록시는 자신이 1xx 응답 생성을 요청한 경우가 아니라면 1xx 응답을 MUST 전달해야 합니다. 예를 들어 프록시가 요청을 전달할 때 "Expect: 100-continue" 헤더 필드를 추가했다면 대응하는 100 (계속) 응답을 전달할 필요가 없습니다.

15.2.1. 100 계속

100(계속) 상태 코드는 요청의 초기 부분이 수신되었으며 아직 서버에 의해 거부되지 않았음을 나타냅니다. 서버는 요청을 완전히 수신하고 처리한 후 최종 응답을 전송하려 합니다.

요청에 100-continue 기대 사항을 포함하는 Expect 헤더 필드가 있으면 100 응답은 서버가 10.1.1절에 설명된 대로 요청 콘텐츠를 수신하려 함을 나타냅니다. 클라이언트는 요청 전송을 계속하고 100 응답을 버리는 것이 바람직합니다.

요청에 100-continue 기대 사항을 포함하는 Expect 헤더 필드가 없었다면 클라이언트는 이 임시 응답을 단순히 버릴 수 있습니다.

15.2.2. 101 프로토콜 전환

101(프로토콜 전환) 상태 코드는 서버가 이 연결에서 사용 중인 애플리케이션 프로토콜을 변경하려는 클라이언트의 요청을 Upgrade 헤더 필드(7.8절)를 통해 이해하고 준수할 의향이 있음을 나타냅니다. 서버는 이 응답 이후 어떤 프로토콜이 적용될지를 나타내는 Upgrade 헤더 필드를 응답에 MUST 생성해야 합니다.

서버는 그렇게 하는 것이 유리한 경우에만 프로토콜 전환에 동의할 것으로 가정합니다. 예를 들어 더 새로운 HTTP 버전으로 전환하면 이전 버전보다 유리할 수 있고, 이러한 기능을 사용하는 리소스를 제공할 때 실시간 동기식 프로토콜로 전환하는 것이 유리할 수 있습니다.

15.3. 성공 2xx

2xx(성공) 클래스의 상태 코드는 클라이언트의 요청이 성공적으로 수신되고 이해되고 허용되었음을 나타냅니다.

15.3.1. 200 정상

200(OK) 상태 코드는 요청이 성공했음을 나타냅니다. 200 응답에서 전송되는 콘텐츠는 요청 메서드에 따라 달라집니다. 이 사양에서 정의한 메서드에 대해 콘텐츠의 의도된 의미는 다음과 같이 요약할 수 있습니다.

표 6
요청 메서드 응답 콘텐츠가 나타내는 대상:
GET 대상 리소스
HEAD GET과 마찬가지로 대상 리소스이지만 표현 데이터를 전송하지 않음
POST 동작의 상태 또는 동작에서 얻은 결과
PUT, DELETE 동작의 상태
OPTIONS 대상 리소스의 통신 옵션
TRACE 추적을 반환하는 서버가 수신한 요청 메시지

CONNECT에 대한 응답을 제외하면 메시지 프레이밍이 콘텐츠 길이가 0임을 명시적으로 나타내지 않는 한 200 응답에는 메시지 콘텐츠가 포함될 것으로 예상됩니다. 요청의 어떤 측면이 성공 시 콘텐츠가 없기를 선호함을 나타내면 오리진 서버는 대신 204 (콘텐츠 없음) 응답을 전송하는 것이 바람직합니다. CONNECT의 경우 성공 결과는 200 응답 헤더 섹션 직후 시작되는 터널이므로 콘텐츠가 없습니다.

200 응답은 휴리스틱하게 캐시할 수 있습니다. 즉 메서드 정의 또는 명시적인 캐시 제어에서 달리 나타내지 않는 한 그렇습니다( [CACHING]의 4.2.2절 참조).

GET 또는 HEAD에 대한 200 응답에서 오리진 서버는 선택된 표현에 사용 가능한 모든 검증자 필드(8.8절)를 SHOULD 전송해야 하며, 강한 엔터티 태그와 Last-Modified 날짜를 모두 제공하는 것이 선호됩니다.

상태 변경 메서드에 대한 200 응답에서 응답으로 전송된 모든 검증자 필드(8.8절)는 요청 의미론을 성공적으로 적용한 결과 형성된 새 표현의 현재 검증자를 전달합니다. PUT 메서드(9.3.4절)에는 그러한 검증자 전송을 배제할 수 있는 추가 요구사항이 있음에 유의하십시오.

15.3.2. 201 생성됨

201(생성됨) 상태 코드는 요청이 충족되었으며 그 결과 하나 이상의 새 리소스가 생성되었음을 나타냅니다. 요청으로 생성된 주 리소스는 응답의 Location 헤더 필드 또는 Location 헤더 필드가 수신되지 않은 경우 대상 URI로 식별됩니다.

201 응답 콘텐츠는 일반적으로 생성된 리소스를 설명하고 해당 리소스로 연결합니다. 응답으로 전송된 모든 검증자 필드(8.8절)는 요청으로 생성된 새 표현의 현재 검증자를 전달합니다. PUT 메서드(9.3.4절)에는 그러한 검증자 전송을 배제할 수 있는 추가 요구사항이 있음에 유의하십시오.

15.3.3. 202 수락됨

202(수락됨) 상태 코드는 요청이 처리를 위해 수락되었지만 처리가 완료되지 않았음을 나타냅니다. 실제 처리가 이루어질 때 허용되지 않을 수 있으므로 요청이 결국 처리될 수도 있고 그렇지 않을 수도 있습니다. HTTP에는 비동기 작업에서 상태 코드를 다시 전송하는 기능이 없습니다.

202 응답은 의도적으로 확정적이지 않습니다. 그 목적은 사용자 에이전트와 서버 간의 연결을 프로세스가 완료될 때까지 유지할 필요 없이 서버가 다른 프로세스(아마 하루에 한 번만 실행되는 배치 지향 프로세스)에 대한 요청을 수락할 수 있도록 하는 것입니다. 이 응답과 함께 전송되는 표현은 요청의 현재 상태를 설명하고 요청이 언제 충족될지에 대한 추정치를 사용자에게 제공할 수 있는 상태 모니터를 가리키거나 포함하는 것이 바람직합니다.

15.3.4. 203 비권위 정보

203(비권위 정보) 상태 코드는 요청이 성공했지만 포함된 콘텐츠가 변환 프록시(7.7절)에 의해 오리진 서버의 200 (OK) 응답 콘텐츠에서 수정되었음을 나타냅니다. 이 상태 코드를 통해 프록시는 변환이 적용되었을 때 수신자에게 알릴 수 있습니다. 이러한 정보가 콘텐츠에 관한 이후 결정에 영향을 줄 수 있기 때문입니다. 예를 들어 콘텐츠에 대한 향후 캐시 검증 요청은 동일한 요청 경로 (동일한 프록시를 통함)에서만 적용될 수 있습니다.

203 응답은 휴리스틱하게 캐시할 수 있습니다. 즉 메서드 정의 또는 명시적인 캐시 제어에서 달리 나타내지 않는 한 그렇습니다( [CACHING]의 4.2.2절 참조).

15.3.5. 204 콘텐츠 없음

204(콘텐츠 없음) 상태 코드는 서버가 요청을 성공적으로 충족했으며 응답 콘텐츠로 전송할 추가 콘텐츠가 없음을 나타냅니다. 응답 헤더 필드의 메타데이터는 요청된 동작이 적용된 후의 대상 리소스와 그 선택된 표현을 참조합니다.

예를 들어 PUT 요청에 대한 응답으로 204 상태 코드를 수신하고 응답에 ETag 필드가 포함되어 있다면 PUT은 성공했으며 ETag 필드 값은 해당 대상 리소스의 새 표현에 대한 엔터티 태그를 포함합니다.

204 응답을 통해 서버는 동작이 대상 리소스에 성공적으로 적용되었음을 나타내면서 사용자 에이전트가 현재 "문서 뷰"(있는 경우)를 벗어날 필요가 없음을 암시할 수 있습니다. 서버는 사용자 에이전트가 자체 인터페이스에 따라 사용자에게 성공을 알리고 응답의 새 메타데이터 또는 갱신된 메타데이터를 활성 표현에 적용할 것으로 가정합니다.

예를 들어 204 상태 코드는 일반적으로 "저장" 동작에 대응하는 문서 편집 인터페이스에서 사용되어 저장 중인 문서를 사용자가 계속 편집할 수 있게 합니다. 또한 분산 버전 제어 시스템처럼 자동화된 데이터 전송이 일반적일 것으로 예상되는 인터페이스에서도 자주 사용됩니다.

204 응답은 헤더 섹션의 끝에서 종료되며 콘텐츠나 트레일러를 포함할 수 없습니다.

204 응답은 휴리스틱하게 캐시할 수 있습니다. 즉 메서드 정의 또는 명시적인 캐시 제어에서 달리 나타내지 않는 한 그렇습니다( [CACHING]의 4.2.2절 참조).

15.3.6. 205 콘텐츠 재설정

205(콘텐츠 재설정) 상태 코드는 서버가 요청을 충족했으며 사용자 에이전트가 요청을 전송하게 한 "문서 뷰"를 오리진 서버에서 수신한 원래 상태로 재설정하기를 원함을 나타냅니다.

이 응답은 사용자가 데이터 입력을 지원하는 콘텐츠(양식, 메모장, 캔버스 등)를 수신하고, 해당 공간에 데이터를 입력하거나 조작하고, 입력한 데이터를 요청으로 제출한 다음, 사용자가 다른 입력 동작을 쉽게 시작할 수 있도록 다음 입력을 위해 데이터 입력 메커니즘을 재설정하는 일반적인 데이터 입력 사용 사례를 지원하기 위한 것입니다.

205 상태 코드는 추가 콘텐츠가 제공되지 않음을 의미하므로 서버는 205 응답에 콘텐츠를 MUST NOT 생성해야 합니다.

15.3.7. 206 부분 콘텐츠

206(부분 콘텐츠) 상태 코드는 서버가 선택된 표현의 하나 이상의 부분을 전송하여 대상 리소스에 대한 범위 요청을 성공적으로 충족하고 있음을 나타냅니다.

범위 요청(14절)을 지원하는 서버는 일반적으로 요청된 모든 범위를 충족하려고 합니다. 더 적은 데이터를 전송하면 나머지를 위한 또 다른 클라이언트 요청이 발생할 가능성이 높기 때문입니다. 그러나 서버는 일시적 사용 불가, 캐시 효율성, 부하 분산 등 자체적인 이유로 요청된 데이터의 일부만 전송하려 할 수 있습니다. 206 응답은 자기 기술적이므로 클라이언트는 범위 요청을 부분적으로만 충족하는 응답도 이해할 수 있습니다.

클라이언트는 206 응답의 Content-Type 및 Content-Range 필드를 검사하여 어떤 부분이 포함되었는지와 추가 요청이 필요한지를 MUST 결정해야 합니다.

206 응답을 생성하는 서버는 같은 요청에 대한 200 (OK) 응답에서 해당 필드가 전송되었을 경우 아래 하위 절에서 요구하는 필드에 더해 다음 헤더 필드를 MUST 생성해야 합니다. Date, Cache-Control, ETag, Expires, Content-Location 및 Vary.

206 응답에 있는 Content-Length 헤더 필드는 이 메시지 콘텐츠의 옥텟 수를 나타내며, 일반적으로 선택된 표현의 전체 길이는 아닙니다. 각 Content-Range 헤더 필드는 선택된 표현의 전체 길이에 관한 정보를 포함합니다.

If-Range 헤더 필드가 있는 요청에 206 응답을 생성하는 송신자는 클라이언트가 이미 해당 헤더 필드를 포함하는 이전 응답을 가지고 있으므로 요구된 것 이외의 표현 헤더 필드를 SHOULD NOT 생성해야 합니다. 그렇지 않으면 송신자는 같은 요청에 대한 200 (OK) 응답에서 전송되었을 모든 표현 헤더 필드를 MUST 생성해야 합니다.

206 응답은 휴리스틱하게 캐시할 수 있습니다. 즉 명시적인 캐시 제어에서 달리 나타내지 않는 한 그렇습니다( [CACHING]의 4.2.2절 참조).

15.3.7.1. 단일 부분

단일 부분을 전송하는 경우 206 응답을 생성하는 서버는 선택된 표현의 어떤 범위가 포함되었는지를 설명하는 Content-Range 헤더 필드와 해당 범위로 구성된 콘텐츠를 MUST 생성해야 합니다. 예:

HTTP/1.1 206 Partial Content
Date: Wed, 15 Nov 1995 06:25:24 GMT
Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
Content-Range: bytes 21010-47021/47022
Content-Length: 26012
Content-Type: image/gif

... 26012 bytes of partial image data ...
15.3.7.2. 여러 부분

여러 부분을 전송하는 경우 206 응답을 생성하는 서버는 14.6절에 정의된 "multipart/byteranges" 콘텐츠와 "multipart/byteranges" 미디어 유형 및 필수 boundary 매개변수를 포함하는 Content-Type 헤더 필드를 MUST 생성해야 합니다. 단일 부분 응답과의 혼동을 피하기 위해 서버는 여러 부분 응답의 HTTP 헤더 섹션에 Content-Range 헤더 필드를 MUST NOT 생성해야 합니다(이 필드는 대신 각 부분에서 전송됨).

멀티파트 콘텐츠의 각 본문 부분 헤더 영역에서 서버는 해당 본문 부분에 포함되는 범위에 대응하는 Content-Range 헤더 필드를 MUST 생성해야 합니다. 선택된 표현이 200 (OK) 응답에서 Content-Type 헤더 필드를 가졌을 것이라면 서버는 각 본문 부분의 헤더 영역에 동일한 Content-Type 헤더 필드를 SHOULD 생성해야 합니다. 예:

HTTP/1.1 206 Partial Content
Date: Wed, 15 Nov 1995 06:25:24 GMT
Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
Content-Length: 1741
Content-Type: multipart/byteranges; boundary=THIS_STRING_SEPARATES

--THIS_STRING_SEPARATES
Content-Type: application/pdf
Content-Range: bytes 500-999/8000

...the first range...
--THIS_STRING_SEPARATES
Content-Type: application/pdf
Content-Range: bytes 7000-7999/8000

...the second range
--THIS_STRING_SEPARATES--

여러 범위를 요청한 경우 서버는 수신한 Range 헤더 필드에서 대응하는 range-spec이 나타난 순서와 관계없이 서로 겹치는 범위 또는 여러 부분을 전송하는 오버헤드보다 작은 간격으로 떨어진 범위를 MAY 병합할 수 있습니다. "multipart/byteranges"의 각 부분 사이에 발생하는 일반적인 오버헤드는 선택된 표현의 미디어 유형과 선택한 boundary 매개변수 길이에 따라 약 80바이트이므로 서로 떨어진 작은 부분을 많이 전송하는 것이 전체 선택된 표현을 전송하는 것보다 비효율적일 수 있습니다.

서버는 단일 범위 요청에 멀티파트 응답을 MUST NOT 생성해야 합니다. 여러 부분을 요청하지 않은 클라이언트는 멀티파트 응답을 지원하지 않을 수 있기 때문입니다. 그러나 여러 범위를 요청했지만 충족 가능한 범위가 하나뿐이거나 병합 후 하나의 범위만 남은 경우 서버는 단일 본문 부분만 있는 "multipart/byteranges" 응답을 MAY 생성할 수 있습니다. "multipart/byteranges" 응답을 처리할 수 없는 클라이언트는 여러 범위를 요청하는 요청을 MUST NOT 생성해야 합니다.

멀티파트 응답을 생성하는 서버는 충족 불가능하거나 다른 범위로 병합된 범위를 제외하고, 대응하는 range-spec이 수신한 Range 헤더 필드에 나타난 순서와 같은 순서로 부분을 SHOULD 전송해야 합니다. 멀티파트 응답을 수신한 클라이언트는 각 본문 부분에 어떤 범위가 포함되어 있는지 결정하기 위해 각 본문 부분의 Content-Range 헤더 필드를 MUST 검사해야 합니다. 클라이언트는 요청한 것과 동일한 범위나 동일한 순서를 수신한다고 의존할 수 없습니다.

15.3.7.3. 부분 결합

연결이 조기에 닫히거나 요청이 하나 이상의 Range 사양을 사용한 경우 응답은 표현의 하위 범위만 전송할 수 있습니다. 그러한 전송을 여러 번 수행한 후 클라이언트는 동일한 표현의 여러 범위를 수신했을 수 있습니다. 이러한 범위는 모두 동일한 강한 검증자(8.8.1절)를 공유하는 경우에만 안전하게 결합할 수 있습니다.

대상 리소스에 대한 GET 요청의 여러 부분 응답을 수신한 클라이언트는 동일한 강한 검증자를 공유하는 경우 해당 응답을 더 큰 연속 범위로 MAY 결합할 수 있습니다.

가장 최근 응답이 불완전한 200 (OK) 응답이면 해당 응답의 헤더 필드를 모든 결합 응답에 사용하며 일치하는 저장된 응답의 헤더 필드를 대체합니다.

가장 최근 응답이 206 (부분 콘텐츠) 응답이고 일치하는 저장된 응답 중 하나 이상이 200 (OK)이면 결합 응답의 헤더 필드는 가장 최근 200 응답의 헤더 필드로 구성됩니다. 일치하는 저장된 응답이 모두 206 응답이면 가장 최근의 헤더 필드를 가진 저장된 응답을 결합 응답의 헤더 필드 원본으로 사용합니다. 단 클라이언트는 Content-Range를 제외하고 새 응답에 제공된 다른 헤더 필드를 사용하여 저장된 응답의 대응하는 헤더 필드의 모든 인스턴스를 MUST 대체해야 합니다.

결합 응답 콘텐츠는 새 응답과 일치하는 모든 저장된 응답의 부분 콘텐츠 범위의 합집합으로 구성됩니다. 합집합이 표현의 전체 범위로 구성되면 클라이언트는 완전한 길이를 반영하는 Content-Length 헤더 필드를 포함하여 결합 응답을 완전한 200 (OK) 응답인 것처럼 MUST 처리해야 합니다. 그렇지 않으면 클라이언트는 연속 범위 집합을 다음 중 하나로 MUST 처리해야 합니다. 결합 응답이 표현의 접두부라면 불완전한 200 (OK) 응답, "multipart/byteranges" 콘텐츠를 포함하는 단일 206 (부분 콘텐츠) 응답, 또는 각각 Content-Range 헤더 필드로 표시되는 하나의 연속 범위를 가진 여러 206 (부분 콘텐츠) 응답입니다.

15.4. 리디렉션 3xx

3xx(리디렉션) 클래스의 상태 코드는 요청을 충족하려면 사용자 에이전트가 추가 작업을 수행해야 함을 나타냅니다. 리디렉션에는 여러 유형이 있습니다.

  1. 301 (영구 이동), 302 (발견됨), 307 (임시 리디렉션), 308 (영구 리디렉션) 상태 코드처럼 Location 헤더 필드가 제공하는 다른 URI에서 이 리소스를 사용할 수 있음을 나타내는 리디렉션입니다.
  2. 300 (여러 선택지) 상태 코드처럼 이 리소스를 표현할 수 있는 일치하는 리소스 중에서 선택지를 제공하는 리디렉션입니다.
  3. 303 (다른 위치 참조) 상태 코드처럼 요청에 대한 간접 응답을 나타낼 수 있는 Location 헤더 필드로 식별된 다른 리소스로의 리디렉션입니다.
  4. 304 (수정되지 않음) 상태 코드처럼 이전에 저장된 결과로의 리디렉션입니다.

Location 헤더 필드(10.2.2절)가 제공되면 특정 상태 코드를 이해하지 못하더라도 사용자 에이전트는 요청을 Location 필드 값이 참조하는 URI로 자동 리디렉션할 MAY 수 있습니다. 안전한 것으로 알려지지 않은 메서드는 자동 리디렉션을 신중하게 수행해야 합니다. 이는 9.2.1절에 정의된 대로 사용자가 안전하지 않은 요청을 리디렉션하고 싶지 않을 수 있기 때문입니다.

리디렉션된 요청을 자동으로 따를 때 사용자 에이전트는 다음과 같이 수정한 원래 요청 메시지를 SHOULD 다시 전송해야 합니다.

  1. 리디렉션 응답의 Location 헤더 필드 값이 참조하는 URI를 원래 요청의 대상 URI를 기준으로 해석한 후 대상 URI를 그 URI로 대체합니다.

  2. 구현이 자동으로 생성한 헤더 필드를 제거하고 새 요청에 적절하게 갱신된 값으로 대체합니다. 여기에는 다음이 포함됩니다.

    1. 연결별 헤더 필드(7.6.1절 참조),
    2. Proxy-Authorization을 포함하되 이에 국한되지 않는 클라이언트의 프록시 구성에 특화된 헤더 필드,
    3. Host를 포함하되 이에 국한되지 않는 오리진별 헤더 필드(있는 경우),
    4. 구현의 캐시가 추가한 검증 헤더 필드 (예: If-None-Match, If-Modified-Since), 그리고
    5. Referer, Origin, Authorization 및 Cookie를 포함하되 이에 국한되지 않는 리소스별 헤더 필드.
  3. 구현이 자동으로 생성하지 않은 헤더 필드(즉, 호출 컨텍스트가 추가하여 요청에 존재하는 필드) 중 보안에 영향을 줄 수 있는 것은 제거하는 것을 고려합니다. 여기에는 Authorization 및 Cookie가 포함되지만 이에 국한되지 않습니다.

  4. 해당되는 경우 리디렉션 상태 코드의 의미론에 따라 요청 메서드를 변경합니다.

  5. 요청 메서드가 GET 또는 HEAD로 변경되었다면 Content-Encoding, Content-Language, Content-Location, Content-Type, Content-Length, Digest, Last-Modified를 포함하되 이에 국한되지 않는 콘텐츠별 헤더 필드를 제거합니다.

클라이언트는 순환 리디렉션 (즉, "무한" 리디렉션 루프)을 감지하고 개입하는 것이 SHOULD 요구됩니다.

15.4.1. 300 여러 선택지

300(여러 선택지) 상태 코드는 대상 리소스에 각각 더 구체적인 자체 식별자를 가진 둘 이상의 표현이 있으며, 사용자(또는 사용자 에이전트)가 요청을 해당 식별자 중 하나 이상으로 리디렉션하여 선호 표현을 선택할 수 있도록 대안에 관한 정보가 제공되고 있음을 나타냅니다. 즉 서버는 사용자 에이전트가 자신의 요구에 가장 적절한 표현을 선택하기 위해 반응형 협상에 참여하기를 원합니다(12절).

서버에 선호 선택지가 있으면 서버는 해당 선택지의 URI 참조를 포함하는 Location 헤더 필드를 SHOULD 생성해야 합니다. 사용자 에이전트는 자동 리디렉션에 Location 필드 값을 MAY 사용할 수 있습니다.

HEAD 이외의 요청 메서드에 대해 서버는 사용자가 가장 선호하는 것을 선택할 수 있는 표현 메타데이터와 URI 참조 목록을 포함하는 콘텐츠를 300 응답에 SHOULD 생성해야 합니다. 사용자 에이전트는 제공된 미디어 유형을 이해한다면 해당 목록에서 자동으로 선택할 MAY 수 있습니다. HTTP는 콘텐츠 정의와 독립적으로 유지하려 하므로 자동 선택을 위한 특정 형식은 이 사양에서 정의하지 않습니다. 실제로 표현은 공유 설계나 콘텐츠 협상에 따라 사용자 에이전트가 허용할 수 있다고 판단되는 쉽게 구문 분석 가능한 형식이나 일반적으로 허용되는 하이퍼텍스트 형식으로 제공됩니다.

300 응답은 휴리스틱하게 캐시할 수 있습니다. 즉 메서드 정의 또는 명시적인 캐시 제어에서 달리 나타내지 않는 한 그렇습니다( [CACHING]의 4.2.2절 참조).

15.4.2. 301 영구 이동

301(영구 이동) 상태 코드는 대상 리소스에 새 영구 URI가 할당되었으며 향후 이 리소스에 대한 참조는 포함된 URI 중 하나를 사용하는 것이 바람직함을 나타냅니다. 서버는 링크 편집 기능이 있는 사용자 에이전트가 대상 URI에 대한 참조를 서버가 전송한 새 참조 중 하나로 영구적으로 대체할 수 있음을 제안합니다. 그러나 사용자 에이전트가 실제로 참조를 편집하고 있고(예: 콘텐츠 작성 중), 연결이 보호되며 오리진 서버가 편집 중인 콘텐츠에 대한 신뢰할 수 있는 권한자인 경우가 아니라면 이 제안은 일반적으로 무시됩니다.

서버는 새 영구 URI에 대한 선호 URI 참조를 포함하는 Location 헤더 필드를 응답에 SHOULD 생성해야 합니다. 사용자 에이전트는 자동 리디렉션에 Location 필드 값을 MAY 사용할 수 있습니다. 서버의 응답 콘텐츠에는 일반적으로 새 URI로 연결되는 하이퍼링크가 있는 짧은 하이퍼텍스트 메모가 포함됩니다.

301 응답은 휴리스틱하게 캐시할 수 있습니다. 즉 메서드 정의 또는 명시적인 캐시 제어에서 달리 나타내지 않는 한 그렇습니다( [CACHING]의 4.2.2절 참조).

15.4.3. 302 발견됨

302(발견됨) 상태 코드는 대상 리소스가 일시적으로 다른 URI에 있음을 나타냅니다. 리디렉션은 때때로 변경될 수 있으므로 클라이언트는 향후 요청에도 대상 URI를 계속 사용하는 것이 바람직합니다.

서버는 다른 URI에 대한 URI 참조를 포함하는 Location 헤더 필드를 응답에 SHOULD 생성해야 합니다. 사용자 에이전트는 자동 리디렉션에 Location 필드 값을 MAY 사용할 수 있습니다. 서버의 응답 콘텐츠에는 일반적으로 다른 URI로 연결되는 하이퍼링크가 있는 짧은 하이퍼텍스트 메모가 포함됩니다.

15.4.4. 303 다른 위치 참조

303(다른 위치 참조) 상태 코드는 서버가 Location 헤더 필드의 URI로 표시되는 다른 리소스로 사용자 에이전트를 리디렉션하고 있으며, 해당 리소스가 원래 요청에 대한 간접 응답을 제공하도록 의도되었음을 나타냅니다. 사용자 에이전트는 해당 URI를 대상으로 검색 요청(HTTP를 사용하는 경우 GET 또는 HEAD 요청)을 수행할 수 있으며, 이 요청도 리디렉션될 수 있고 최종 결과를 원래 요청에 대한 응답으로 제시할 수 있습니다. Location 헤더 필드의 새 URI는 대상 URI와 동등한 것으로 간주되지 않음에 유의하십시오.

이 상태 코드는 모든 HTTP 메서드에 적용할 수 있습니다. 주로 POST 동작의 출력을 다른 리소스로 사용자 에이전트를 리디렉션하는 데 사용하며, 그렇게 하면 POST 응답에 대응하는 정보를 별도로 식별하고 북마크하고 캐시할 수 있는 리소스로 제공할 수 있기 때문입니다.

GET 요청에 대한 303 응답은 오리진 서버가 HTTP를 통해 서버가 전송할 수 있는 대상 리소스의 표현을 가지고 있지 않음을 나타냅니다. 그러나 Location 필드 값은 대상 리소스를 설명하는 리소스를 참조하므로, 그 다른 리소스에 검색 요청을 하면 원래 대상 리소스를 표현한다는 의미 없이 수신자에게 유용한 표현을 얻을 수 있습니다. 무엇을 표현할 수 있는지, 어떤 표현이 적절한지, 무엇이 유용한 설명일 수 있는지는 HTTP의 범위를 벗어남에 유의하십시오.

HEAD 요청에 대한 응답을 제외하면 303 응답의 표현에는 Location 헤더 필드에 제공된 것과 동일한 URI 참조로 연결되는 하이퍼링크가 포함된 짧은 하이퍼텍스트 메모가 있는 것이 바람직합니다.

15.4.5. 304 수정되지 않음

304(수정되지 않음) 상태 코드는 조건부 GET 또는 HEAD 요청을 수신했고, 조건 평가 결과가 false라는 사실이 아니었다면 200 (OK) 응답이 생성되었을 것임을 나타냅니다. 즉 요청이 조건부가 되도록 만든 클라이언트가 이미 유효한 표현을 가지고 있다고 나타내므로 서버가 대상 리소스의 표현을 전송할 필요가 없습니다. 따라서 서버는 클라이언트가 저장된 표현을 200 (OK) 응답의 콘텐츠인 것처럼 사용하도록 리디렉션합니다.

304 응답을 생성하는 서버는 같은 요청에 대한 200 (OK) 응답에서 전송되었을 다음 헤더 필드를 MUST 생성해야 합니다.

304 응답의 목적은 수신자가 이미 하나 이상의 캐시된 표현을 가지고 있을 때 정보 전송을 최소화하는 것이므로 송신자는 위에 나열된 필드 이외의 표현 메타데이터를 해당 메타데이터가 캐시 갱신을 안내하기 위한 목적이 아니라면 SHOULD NOT 생성해야 합니다(예: 응답에 ETag 필드가 없다면 Last-Modified가 유용할 수 있음).

304 응답을 수신한 캐시에 대한 요구사항은 [CACHING]의 4.3.4절에 정의되어 있습니다. 조건부 요청이 자체 캐시를 가진 사용자 에이전트가 공유 프록시에 조건부 GET을 전송하는 경우처럼 아웃바운드 클라이언트에서 시작되었다면 프록시는 해당 클라이언트에 304 응답을 SHOULD 전달해야 합니다.

304 응답은 헤더 섹션의 끝에서 종료되며 콘텐츠나 트레일러를 포함할 수 없습니다.

15.4.6. 305 프록시 사용

305(프록시 사용) 상태 코드는 이 사양의 이전 버전에서 정의되었으며 현재는 폐기되었습니다( [RFC7231]의 부록 B).

15.4.7. 306 (사용되지 않음)

306 상태 코드는 이 사양의 이전 버전에서 정의되었지만 더 이상 사용되지 않으며 해당 코드는 예약되어 있습니다.

15.4.8. 307 임시 리디렉션

307(임시 리디렉션) 상태 코드는 대상 리소스가 일시적으로 다른 URI에 있으며 사용자 에이전트가 해당 URI로 자동 리디렉션을 수행할 경우 요청 메서드를 MUST NOT 변경해야 함을 나타냅니다. 리디렉션은 시간이 지나면서 변경될 수 있으므로 클라이언트는 향후 요청에 원래 대상 URI를 계속 사용하는 것이 바람직합니다.

서버는 다른 URI에 대한 URI 참조를 포함하는 Location 헤더 필드를 응답에 SHOULD 생성해야 합니다. 사용자 에이전트는 자동 리디렉션에 Location 필드 값을 MAY 사용할 수 있습니다. 서버의 응답 콘텐츠에는 일반적으로 다른 URI로 연결되는 하이퍼링크가 있는 짧은 하이퍼텍스트 메모가 포함됩니다.

15.4.9. 308 영구 리디렉션

308(영구 리디렉션) 상태 코드는 대상 리소스에 새 영구 URI가 할당되었으며 이 리소스에 대한 향후 참조는 포함된 URI 중 하나를 사용하는 것이 바람직함을 나타냅니다. 서버는 링크 편집 기능이 있는 사용자 에이전트가 대상 URI에 대한 참조를 서버가 전송한 새 참조 중 하나로 영구적으로 대체할 수 있음을 제안합니다. 그러나 사용자 에이전트가 실제로 참조를 편집하고 있고(예: 콘텐츠 작성 중), 연결이 보호되며 오리진 서버가 편집 중인 콘텐츠에 대한 신뢰할 수 있는 권한자인 경우가 아니라면 이 제안은 일반적으로 무시됩니다.

서버는 새 영구 URI에 대한 선호 URI 참조를 포함하는 Location 헤더 필드를 응답에 SHOULD 생성해야 합니다. 사용자 에이전트는 자동 리디렉션에 Location 필드 값을 MAY 사용할 수 있습니다. 서버의 응답 콘텐츠에는 일반적으로 새 URI로 연결되는 하이퍼링크가 있는 짧은 하이퍼텍스트 메모가 포함됩니다.

308 응답은 휴리스틱하게 캐시할 수 있습니다. 즉 메서드 정의 또는 명시적인 캐시 제어에서 달리 나타내지 않는 한 그렇습니다( [CACHING]의 4.2.2절 참조).

15.5. 클라이언트 오류 4xx

4xx(클라이언트 오류) 클래스의 상태 코드는 클라이언트가 오류를 범한 것으로 보임을 나타냅니다. HEAD 요청에 응답하는 경우를 제외하고 서버는 오류 상황과 그것이 일시적인지 영구적인지를 설명하는 표현을 SHOULD 전송해야 합니다. 이러한 상태 코드는 모든 요청 메서드에 적용할 수 있습니다. 사용자 에이전트는 포함된 표현을 사용자에게 SHOULD 표시해야 합니다.

15.5.1. 400 잘못된 요청

400(잘못된 요청) 상태 코드는 클라이언트 오류로 인식되는 문제 (예: 잘못된 요청 구문, 유효하지 않은 요청 메시지 프레이밍 또는 기만적인 요청 라우팅) 때문에 서버가 요청을 처리할 수 없거나 처리하지 않음을 나타냅니다.

15.5.2. 401 인증되지 않음

401(인증되지 않음) 상태 코드는 대상 리소스에 대한 유효한 인증 자격 증명이 없기 때문에 요청이 적용되지 않았음을 나타냅니다. 401 응답을 생성하는 서버는 대상 리소스에 적용 가능한 하나 이상의 챌린지를 포함하는 WWW-Authenticate 헤더 필드 (11.6.1절)를 MUST 전송해야 합니다.

요청에 인증 자격 증명이 포함되어 있었다면 401 응답은 해당 자격 증명에 대한 권한 부여가 거부되었음을 나타냅니다. 사용자 에이전트는 새로 만들거나 교체한 Authorization 헤더 필드(11.6.2절)를 사용하여 요청을 MAY 반복할 수 있습니다. 401 응답이 이전 응답과 동일한 챌린지를 포함하고 사용자 에이전트가 이미 한 번 이상 인증을 시도했다면 사용자 에이전트는 포함된 표현을 사용자에게 SHOULD 제시해야 합니다. 일반적으로 관련 진단 정보가 포함되어 있기 때문입니다.

15.5.3. 402 결제 필요

402(결제 필요) 상태 코드는 향후 사용을 위해 예약되어 있습니다.

15.5.4. 403 금지됨

403(금지됨) 상태 코드는 서버가 요청을 이해했지만 충족하기를 거부함을 나타냅니다. 요청이 금지된 이유를 공개하려는 서버는 응답 콘텐츠(있는 경우)에 그 이유를 설명할 수 있습니다.

요청에 인증 자격 증명이 제공되었다면 서버는 이를 접근 권한을 부여하기에 충분하지 않은 것으로 간주합니다. 클라이언트는 동일한 자격 증명으로 요청을 자동으로 반복하지 않는 것이 SHOULD NOT 요구됩니다. 클라이언트는 새롭거나 다른 자격 증명으로 요청을 MAY 반복할 수 있습니다. 그러나 요청은 자격 증명과 관련 없는 이유로 금지될 수도 있습니다.

금지된 대상 리소스가 현재 존재함을 "숨기려는" 오리진 서버는 대신 404 (찾을 수 없음) 상태 코드로 MAY 응답할 수 있습니다.

15.5.5. 404 찾을 수 없음

404(찾을 수 없음) 상태 코드는 오리진 서버가 대상 리소스의 현재 표현을 찾지 못했거나 그러한 표현이 존재함을 공개할 의향이 없음을 나타냅니다. 404 상태 코드는 이 표현의 부재가 일시적인지 영구적인지를 나타내지 않습니다. 오리진 서버가 구성 가능한 수단 등을 통해 이 상태가 영구적일 가능성이 높음을 알고 있다면 404보다 410 (사라짐) 상태 코드를 사용하는 것이 바람직합니다.

404 응답은 휴리스틱하게 캐시할 수 있습니다. 즉 메서드 정의 또는 명시적인 캐시 제어에서 달리 나타내지 않는 한 그렇습니다( [CACHING]의 4.2.2절 참조).

15.5.6. 405 허용되지 않는 메서드

405(허용되지 않는 메서드) 상태 코드는 요청 라인에서 수신한 메서드를 오리진 서버가 알고 있지만 대상 리소스가 지원하지 않음을 나타냅니다. 오리진 서버는 대상 리소스가 현재 지원하는 메서드 목록을 포함하는 Allow 헤더 필드를 405 응답에 MUST 생성해야 합니다.

405 응답은 휴리스틱하게 캐시할 수 있습니다. 즉 메서드 정의 또는 명시적인 캐시 제어에서 달리 나타내지 않는 한 그렇습니다( [CACHING]의 4.2.2절 참조).

15.5.7. 406 허용할 수 없음

406(허용할 수 없음) 상태 코드는 요청에서 수신한 선제적 협상 헤더 필드(12.1절)에 따라 대상 리소스에 사용자 에이전트가 허용할 수 있는 현재 표현이 없으며 서버가 기본 표현을 제공할 의향이 없음을 나타냅니다.

서버는 사용 가능한 표현 특성과 대응하는 리소스 식별자의 목록을 포함하는 콘텐츠를 SHOULD 생성하여 사용자 또는 사용자 에이전트가 가장 적절한 것을 선택할 수 있게 해야 합니다. 사용자 에이전트는 해당 목록에서 가장 적절한 선택지를 자동으로 MAY 선택할 수 있습니다. 그러나 15.4.1절에 설명된 대로 이 사양은 그러한 자동 선택을 위한 표준을 정의하지 않습니다.

15.5.8. 407 프록시 인증 필요

407(프록시 인증 필요) 상태 코드는 401 (인증되지 않음)과 유사하지만 클라이언트가 이 요청에 프록시를 사용하려면 자신을 인증해야 함을 나타냅니다. 프록시는 이 요청에 대해 해당 프록시에 적용 가능한 챌린지를 포함하는 Proxy-Authenticate 헤더 필드(11.7.1절)를 MUST 전송해야 합니다. 클라이언트는 새로 만들거나 교체한 Proxy-Authorization 헤더 필드(11.7.2절)를 사용하여 요청을 MAY 반복할 수 있습니다.

15.5.9. 408 요청 시간 초과

408(요청 시간 초과) 상태 코드는 서버가 기다릴 준비가 된 시간 안에 완전한 요청 메시지를 수신하지 못했음을 나타냅니다.

클라이언트에 아직 전송 중인 요청이 있다면 해당 요청을 MAY 반복할 수 있습니다. 현재 연결을 사용할 수 없다면(예: HTTP/1.1에서 요청 구분이 손실된 경우처럼) 새 연결을 사용합니다.

15.5.10. 409 충돌

409(충돌) 상태 코드는 대상 리소스의 현재 상태와의 충돌 때문에 요청을 완료할 수 없음을 나타냅니다. 이 코드는 사용자가 충돌을 해결하고 요청을 다시 제출할 수 있을 가능성이 있는 상황에 사용됩니다. 서버는 사용자가 충돌 원인을 인식할 수 있을 만큼 충분한 정보를 포함하는 콘텐츠를 SHOULD 생성해야 합니다.

충돌은 PUT 요청에 대한 응답으로 발생할 가능성이 가장 높습니다. 예를 들어 버전 관리가 사용되고 PUT되는 표현이 이전 (제3자) 요청에서 이루어진 변경과 충돌하는 리소스 변경을 포함한다면 오리진 서버는 요청을 완료할 수 없음을 나타내기 위해 409 응답을 사용할 수 있습니다. 이 경우 응답 표현에는 개정 이력을 바탕으로 차이를 병합하는 데 유용한 정보가 포함될 가능성이 높습니다.

15.5.11. 410 사라짐

410(사라짐) 상태 코드는 오리진 서버에서 대상 리소스에 더 이상 접근할 수 없으며 이 상태가 영구적일 가능성이 높음을 나타냅니다. 오리진 서버가 이 상태가 영구적인지 알지 못하거나 판단할 수단이 없다면 대신 404 (찾을 수 없음) 상태 코드를 사용하는 것이 바람직합니다.

410 응답은 주로 리소스가 의도적으로 사용할 수 없으며 서버 소유자가 해당 리소스에 대한 원격 링크가 제거되기를 원한다는 것을 수신자에게 알려 웹 유지 관리 작업을 돕기 위한 것입니다. 이러한 상황은 기간 한정 프로모션 서비스나 더 이상 오리진 서버 사이트와 관련이 없는 개인의 리소스에서 흔히 발생합니다. 영구적으로 사용할 수 없는 모든 리소스를 "사라짐"으로 표시하거나 그 표시를 일정 기간 유지할 필요는 없습니다. 이는 서버 소유자의 재량에 맡깁니다.

410 응답은 휴리스틱하게 캐시할 수 있습니다. 즉 메서드 정의 또는 명시적인 캐시 제어에서 달리 나타내지 않는 한 그렇습니다( [CACHING]의 4.2.2절 참조).

15.5.12. 411 길이 필요

411(길이 필요) 상태 코드는 서버가 정의된 Content-Length(8.6절) 없이 요청을 수락하기를 거부함을 나타냅니다. 클라이언트는 요청 콘텐츠 길이를 포함하는 유효한 Content-Length 헤더 필드를 추가하면 요청을 MAY 반복할 수 있습니다.

15.5.13. 412 사전 조건 실패

412(사전 조건 실패) 상태 코드는 요청 헤더 필드에 주어진 하나 이상의 조건이 서버에서 검사했을 때 false로 평가되었음을 나타냅니다(13절). 이 응답 상태 코드를 통해 클라이언트는 현재 리소스 상태(현재 표현 및 메타데이터)에 사전 조건을 두어 대상 리소스가 예상하지 못한 상태인 경우 요청 메서드가 적용되지 않도록 할 수 있습니다.

15.5.14. 413 콘텐츠가 너무 큼

413(콘텐츠가 너무 큼) 상태 코드는 요청 콘텐츠가 서버가 처리할 의향이 있거나 처리할 수 있는 크기보다 크기 때문에 서버가 요청 처리를 거부함을 나타냅니다. 사용 중인 프로토콜 버전이 허용하는 경우 서버는 요청을 MAY 종료할 수 있습니다. 그렇지 않으면 서버는 연결을 MAY 닫을 수 있습니다.

상태가 일시적이라면 서버는 그것이 일시적임과 클라이언트가 언제 다시 시도할 수 있는지를 나타내기 위해 Retry-After 헤더 필드를 SHOULD 생성해야 합니다.

15.5.15. 414 URI가 너무 김

414(URI가 너무 김) 상태 코드는 대상 URI가 서버가 해석할 의향이 있는 길이보다 길기 때문에 서버가 요청 처리를 거부함을 나타냅니다. 이 드문 상태는 클라이언트가 긴 쿼리 정보를 가진 POST 요청을 GET 요청으로 잘못 변환했거나, 클라이언트가 리디렉션의 무한 루프에 빠졌거나(예: 자체 접미사를 가리키는 리디렉션된 URI 접두사), 서버가 잠재적인 보안 허점을 악용하려는 클라이언트의 공격을 받는 경우에만 발생할 가능성이 높습니다.

414 응답은 휴리스틱하게 캐시할 수 있습니다. 즉 메서드 정의 또는 명시적인 캐시 제어에서 달리 나타내지 않는 한 그렇습니다( [CACHING]의 4.2.2절 참조).

15.5.16. 415 지원되지 않는 미디어 유형

415(지원되지 않는 미디어 유형) 상태 코드는 콘텐츠가 대상 리소스의 이 메서드에서 지원하지 않는 형식이기 때문에 오리진 서버가 요청 처리를 거부함을 나타냅니다.

형식 문제는 요청에 표시된 Content-Type 또는 Content-Encoding 때문이거나 데이터를 직접 검사한 결과일 수 있습니다.

지원되지 않는 콘텐츠 코딩 때문에 문제가 발생했다면 요청에서 어떤 콘텐츠 코딩이 허용되었을지(있는 경우) 나타내기 위해 Accept-Encoding 응답 헤더 필드(12.5.3절)를 사용하는 것이 바람직합니다.

반면 지원되지 않는 미디어 유형이 원인이었다면 요청에서 어떤 미디어 유형이 허용되었을지 나타내기 위해 Accept 응답 헤더 필드(12.5.1절)를 사용할 수 있습니다.

15.5.17. 416 범위를 충족할 수 없음

416(범위를 충족할 수 없음) 상태 코드는 요청의 Range 헤더 필드(14.2절)에 있는 범위 집합이 요청된 범위 중 어느 것도 충족할 수 없거나 클라이언트가 과도한 수의 작은 범위 또는 중첩 범위를 요청했기 때문에 (잠재적인 서비스 거부 공격) 거부되었음을 나타냅니다.

각 범위 단위는 자체 범위 집합을 충족 가능하게 만드는 데 필요한 조건을 정의합니다. 예를 들어 14.1.2절은 bytes 범위 집합을 충족 가능하게 만드는 조건을 정의합니다.

바이트 범위 요청에 대한 416 응답을 생성하는 서버는 선택된 표현의 현재 길이를 지정하는 Content-Range 헤더 필드(14.4절)를 SHOULD 생성해야 합니다.

예:

HTTP/1.1 416 Range Not Satisfiable
Date: Fri, 20 Jan 2012 15:41:54 GMT
Content-Range: bytes */47022

15.5.18. 417 기대 조건 실패

417(기대 조건 실패) 상태 코드는 요청의 Expect 헤더 필드(10.1.1절)에 주어진 기대 사항을 하나 이상의 인바운드 서버가 충족할 수 없음을 나타냅니다.

15.5.19. 418 (사용되지 않음)

[RFC2324]은 HTTP가 오용되는 다양한 방식을 풍자한 만우절 RFC였습니다. 그러한 오용 중 하나는 애플리케이션별 418 상태 코드의 정의였으며, 농담으로 충분히 많이 배포되어 향후 다른 용도로 사용할 수 없게 되었습니다.

따라서 418 상태 코드는 IANA HTTP 상태 코드 레지스트리에 예약되어 있습니다. 이는 현재 이 상태 코드를 다른 애플리케이션에 할당할 수 없음을 나타냅니다. 향후 상황에서 사용이 필요하다면(예: 4NN 상태 코드가 고갈되는 경우) 다른 용도로 다시 할당할 수 있습니다.

15.5.20. 421 잘못 전달된 요청

421(잘못 전달된 요청) 상태 코드는 요청이 대상 URI에 대한 권위 있는 응답을 생성할 수 없거나 생성할 의향이 없는 서버로 전달되었음을 나타냅니다. 오리진 서버(또는 오리진 서버를 대신하여 작동하는 게이트웨이)는 서버가 구성된 오리진(4.3.1절)과 일치하지 않거나 요청이 수신된 연결 컨텍스트(7.4절)와 일치하지 않는 대상 URI를 거부하기 위해 421을 전송합니다.

421(잘못 전달된 요청) 응답을 수신한 클라이언트는 요청 메서드가 멱등인지 여부와 관계없이 대상 리소스의 오리진에 특화된 새 연결과 같은 다른 연결이나 대체 서비스 [ALTSVC]를 통해 요청을 MAY 다시 시도할 수 있습니다.

프록시는 421 응답을 MUST NOT 생성해야 합니다.

15.5.21. 422 처리할 수 없는 콘텐츠

422(처리할 수 없는 콘텐츠) 상태 코드는 서버가 요청 콘텐츠의 콘텐츠 유형을 이해하고(415 (지원되지 않는 미디어 유형) 상태 코드는 부적절함), 요청 콘텐츠의 구문도 올바르지만 포함된 명령을 처리할 수 없음을 나타냅니다. 예를 들어 XML 요청 콘텐츠에 올바른 형식(즉, 구문상 올바른)이지만 의미상 잘못된 XML 명령이 포함된 경우 이 상태 코드를 전송할 수 있습니다.

15.5.22. 426 업그레이드 필요

426(업그레이드 필요) 상태 코드는 서버가 현재 프로토콜을 사용하여 요청을 수행하기를 거부하지만 클라이언트가 다른 프로토콜로 업그레이드한 후에는 수행할 의향이 있을 수 있음을 나타냅니다. 서버는 필요한 프로토콜을 나타내기 위해 426 응답에 Upgrade 헤더 필드를 MUST 전송해야 합니다 (7.8절).

예:

HTTP/1.1 426 Upgrade Required
Upgrade: HTTP/3.0
Connection: Upgrade
Content-Length: 53
Content-Type: text/plain

This service requires use of the HTTP/3.0 protocol.

15.6. 서버 오류 5xx

5xx(서버 오류) 클래스의 상태 코드는 서버가 자신이 오류를 범했거나 요청된 메서드를 수행할 수 없음을 인식하고 있음을 나타냅니다. HEAD 요청에 응답하는 경우를 제외하고 서버는 오류 상황과 그것이 일시적인지 영구적인지를 설명하는 표현을 SHOULD 전송해야 합니다. 사용자 에이전트는 포함된 표현을 사용자에게 SHOULD 표시해야 합니다. 이러한 상태 코드는 모든 요청 메서드에 적용할 수 있습니다.

15.6.1. 500 내부 서버 오류

500(내부 서버 오류) 상태 코드는 서버가 요청을 충족하지 못하게 하는 예상하지 못한 상황을 만났음을 나타냅니다.

15.6.2. 501 구현되지 않음

501(구현되지 않음) 상태 코드는 서버가 요청을 충족하는 데 필요한 기능을 지원하지 않음을 나타냅니다. 서버가 요청 메서드를 인식하지 못하고 어떠한 리소스에서도 이를 지원할 수 없는 경우 적절한 응답입니다.

501 응답은 휴리스틱하게 캐시할 수 있습니다. 즉 메서드 정의 또는 명시적인 캐시 제어에서 달리 나타내지 않는 한 그렇습니다( [CACHING]의 4.2.2절 참조).

15.6.3. 502 잘못된 게이트웨이

502(잘못된 게이트웨이) 상태 코드는 게이트웨이 또는 프록시로 작동하는 서버가 요청을 충족하려고 접근한 인바운드 서버에서 유효하지 않은 응답을 수신했음을 나타냅니다.

15.6.4. 503 서비스 사용 불가

503(서비스 사용 불가) 상태 코드는 일시적인 과부하나 예정된 유지 관리로 인해 서버가 현재 요청을 처리할 수 없음을 나타내며, 일정 시간이 지나면 해소될 가능성이 높습니다. 서버는 클라이언트가 요청을 다시 시도하기 전에 기다릴 적절한 시간을 제안하기 위해 Retry-After 헤더 필드(10.2.3절)를 MAY 전송할 수 있습니다.

15.6.5. 504 게이트웨이 시간 초과

504(게이트웨이 시간 초과) 상태 코드는 게이트웨이 또는 프록시로 작동하는 서버가 요청을 완료하기 위해 접근해야 했던 업스트림 서버로부터 적시에 응답을 받지 못했음을 나타냅니다.

15.6.6. 505 지원되지 않는 HTTP 버전

505(지원되지 않는 HTTP 버전) 상태 코드는 서버가 요청 메시지에 사용된 HTTP 주 버전을 지원하지 않거나 지원하기를 거부함을 나타냅니다. 서버는 2.5절에 설명된 대로 이 오류 메시지를 제외하면 클라이언트와 동일한 주 버전을 사용하여 요청을 완료할 수 없거나 완료할 의향이 없음을 나타냅니다. 서버는 해당 버전이 지원되지 않는 이유와 해당 서버가 지원하는 다른 프로토콜을 설명하는 표현을 505 응답에 SHOULD 생성해야 합니다.

16. HTTP 확장

HTTP는 새 버전을 도입하지 않고도 프로토콜에 기능을 도입하는 데 사용할 수 있는 여러 일반 확장 지점을 정의하며, 여기에는 메서드, 상태 코드, 필드 이름 및 인증 스킴과 캐시 지시어 같은 정의된 필드 안의 추가 확장 지점이 포함됩니다([CACHING]의 5.2.3절에 있는 Cache-Control 확장 참조). HTTP의 의미론은 버전별로 나뉘지 않으므로 이러한 확장 지점은 지속됩니다. 사용 중인 프로토콜 버전은 그 의미론에 영향을 주지 않습니다.

버전 독립적인 확장은 사용 중인 프로토콜의 특정 버전에 의존하거나 상호작용하지 않는 것이 권장됩니다. 이를 피할 수 없는 경우 해당 확장이 여러 버전에서 상호운용되는 방식을 신중하게 고려해야 합니다.

또한 특정 HTTP 버전은 HTTP/1.1의 전송 코딩( [HTTP/1.1]의 6.1절)이나 HTTP/2 SETTINGS 또는 프레임 유형([HTTP/2])처럼 자체 확장 지점을 가질 수 있습니다. 이러한 확장 지점은 해당 지점이 존재하는 프로토콜 버전에만 적용됩니다.

버전별 확장은 해당 프로토콜 요소가 명시적으로 허용하지 않는 한 버전 독립적인 메커니즘이나 확장 지점(메서드나 헤더 필드 등)의 의미론을 재정의하거나 수정할 수 없습니다. 예를 들어 CONNECT 메서드(9.3.6절)는 이를 허용합니다.

이 지침은 경로의 일부가 서로 다른 HTTP 버전을 구현하는 경우에도 프로토콜이 올바르고 예측 가능하게 작동하도록 보장합니다.

16.1. 메서드 확장성

16.1.1. 메서드 레지스트리

IANA가 https://www.iana.org/assignments/http-methods에서 관리하는 "Hypertext Transfer Protocol (HTTP) Method Registry"는 method 이름을 등록합니다.

HTTP 메서드 등록에는 다음 필드가 MUST 포함되어야 합니다.

  • 메서드 이름(9절 참조)
  • 안전 여부("yes" 또는 "no", 9.2.1절 참조)
  • 멱등 여부("yes" 또는 "no", 9.2.2절 참조)
  • 사양 텍스트를 가리키는 참조

이 네임스페이스에 추가되는 값은 IETF 검토가 필요합니다([RFC8126], 4.8절 참조).

16.1.2. 새 메서드에 대한 고려사항

표준화된 메서드는 일반적입니다. 즉 특정 미디어 유형, 리소스 종류 또는 애플리케이션 하나에만 적용되는 것이 아니라 모든 리소스에 잠재적으로 적용할 수 있습니다. 따라서 새로운 메서드는 단일 애플리케이션이나 데이터 형식에 특화되지 않은 문서에 등록하는 것이 선호됩니다. 독립적인 기술에는 독립적인 사양이 필요하기 때문입니다.

메시지 구문 분석(6절)은 (HEAD에 대한 응답을 제외하고) 메서드 의미론과 독립적이어야 하므로 새 메서드의 정의는 구문 분석 알고리즘을 변경하거나 요청 또는 응답 메시지에 콘텐츠가 존재하는 것을 금지할 수 없습니다. 새 메서드의 정의는 값이 "0"인 Content-Length 헤더 필드를 요구하여 길이가 0인 콘텐츠만 허용된다고 지정할 수 있습니다.

마찬가지로 새 메서드는 각각 CONNECT 및 OPTIONS에서 허용되는 특별한 host:port 및 별표 형식의 요청 대상을 사용할 수 없습니다(7.1절). 대상 URI에는 절대 형식의 전체 URI가 필요하므로 요청 대상을 절대 형식으로 전송하거나 다른 메서드와 동일하게 요청 컨텍스트에서 대상 URI를 재구성해야 합니다.

새 메서드 정의는 안전한지(9.2.1절), 멱등인지(9.2.2절), 캐시 가능한지(9.2.3절), 요청 콘텐츠에 어떤 의미론을 연결할지(있는 경우), 그리고 메서드가 헤더 필드 또는 상태 코드 의미론을 어떻게 세분화하는지를 나타내야 합니다. 새 메서드가 캐시 가능하다면 정의에서 캐시가 응답을 저장하고 이를 후속 요청을 충족하는 데 사용할 수 있는 방법과 조건을 설명하는 것이 바람직합니다. 새 메서드는 조건부로 만들 수 있는지 (13.1절), 가능하다면 조건이 false일 때 서버가 어떻게 응답하는지를 설명하는 것이 바람직합니다. 마찬가지로 새 메서드가 부분 응답 의미론(14.2절)에 사용할 수 있다면 이 역시 문서화하는 것이 바람직합니다.

16.2. 상태 코드 확장성

16.2.1. 상태 코드 레지스트리

IANA가 https://www.iana.org/assignments/http-status-codes에서 관리하는 "Hypertext Transfer Protocol (HTTP) Status Code Registry"는 status code 번호를 등록합니다.

등록에는 다음 필드가 MUST 포함되어야 합니다.

  • 상태 코드(3자리)
  • 간단한 설명
  • 사양 텍스트를 가리키는 참조

HTTP 상태 코드 네임스페이스에 추가되는 값은 IETF 검토가 필요합니다([RFC8126], 4.8절 참조).

16.2.2. 새 상태 코드에 대한 고려사항

현재 상태 코드로 정의되지 않은 응답 의미론을 표현해야 하는 경우 새 상태 코드를 등록할 수 있습니다. 상태 코드는 일반적이며, 특정 미디어 유형, 리소스 종류 또는 HTTP 애플리케이션 하나에만 적용되는 것이 아니라 모든 리소스에 잠재적으로 적용할 수 있습니다. 따라서 새 상태 코드는 단일 애플리케이션에 특화되지 않은 문서에 등록하는 것이 선호됩니다.

새 상태 코드는 15절에 정의된 범주 중 하나에 속해야 합니다. 기존 파서가 응답 메시지를 처리할 수 있도록 새 상태 코드는 콘텐츠를 금지할 수 없지만 길이가 0인 콘텐츠를 의무화할 수 있습니다.

아직 널리 배포되지 않은 새 상태 코드 제안은 등록될 것이라는 명확한 합의가 있기 전까지 특정 번호를 할당하지 않는 것이 바람직합니다. 대신 초기 초안은 "4NN" 또는 "3N0" .. "3N9" 같은 표기법을 사용하여 번호를 너무 일찍 소비하지 않고 제안된 상태 코드의 클래스를 나타낼 수 있습니다.

새 상태 코드의 정의는 해당 상태 코드를 포함하는 응답을 발생시키는 요청 조건(예: 요청 헤더 필드 및/또는 메서드의 조합)과 응답 헤더 필드에 대한 의존성(예: 어떤 필드가 필수인지, 어떤 필드가 의미론을 수정할 수 있는지, 새 상태 코드와 함께 사용할 때 어떤 필드 의미론이 더 세분화되는지)을 설명하는 것이 바람직합니다.

기본적으로 상태 코드는 자신이 나타나는 응답에 대응하는 요청에만 적용됩니다. 상태 코드가 더 넓은 적용 범위(예: 해당 리소스에 대한 모든 요청 또는 서버에 대한 모든 요청)에 적용된다면 이를 명시적으로 지정해야 합니다. 이 경우 모든 클라이언트가 새 상태 코드를 이해하지 못할 수 있으므로 더 넓은 범위를 일관되게 적용할 것으로 기대할 수 없다는 점에 유의해야 합니다.

새 최종 상태 코드의 정의는 휴리스틱하게 캐시 가능한지 여부를 지정하는 것이 바람직합니다. 최종 상태 코드가 있는 모든 응답은 명시적인 신선도 정보가 있으면 캐시할 수 있습니다. 휴리스틱하게 캐시 가능한 것으로 정의된 상태 코드는 명시적인 신선도 정보 없이도 캐시할 수 있습니다. 마찬가지로 must-understand 캐시 지시어를 사용하면 상태 코드 정의가 캐시 동작에 제약을 둘 수 있습니다. 자세한 내용은 [CACHING]을 참조하십시오.

마지막으로 새 상태 코드의 정의는 콘텐츠가 식별된 리소스와 암시적으로 관련되어 있는지도 나타내는 것이 바람직합니다(6.4.2절).

16.3. 필드 확장성

HTTP에서 가장 널리 사용되는 확장 지점은 새로운 헤더 및 트레일러 필드의 정의입니다.

새 필드는 수신자가 이해하는 경우 이전에 정의된 필드의 해석을 재정의하거나 향상하고, 요청 평가의 사전 조건을 정의하거나 응답 의미를 세분화하도록 정의할 수 있습니다.

그러나 필드를 정의한다고 해서 수신자에게 배포되거나 인식된다는 보장은 없습니다. 대부분의 필드는 수신자가 인식하지 못하는 필드를 안전하게 무시하되 다운스트림으로 전달할 수 있다는 기대하에 설계됩니다. 다른 경우 송신자가 특정 필드를 이해할 수 있는지는 이전 통신, 아마도 프로토콜 버전이나 이전 메시지에서 전송한 필드 또는 특정 미디어 유형의 사용을 통해 나타날 수 있습니다. 마찬가지로 새 필드와 함께 이러한 검사가 정의되어 있다면 OPTIONS 요청이나 정의된 well-known URI [RFC8615]와 상호작용하여 지원 여부를 직접 검사할 수도 있습니다.

16.3.1. 필드 이름 레지스트리

"Hypertext Transfer Protocol (HTTP) Field Name Registry"는 HTTP 필드 이름의 네임스페이스를 정의합니다.

누구나 HTTP 필드 등록을 요청할 수 있습니다. 새 HTTP 필드를 만들 때 고려해야 할 사항은 16.3.2절을 참조하십시오.

"Hypertext Transfer Protocol (HTTP) Field Name Registry"는 https://www.iana.org/assignments/http-fields/에 있습니다. 등록 요청은 해당 위치의 지침을 따르거나 "ietf-http-wg@w3.org" 메일링 리스트에 이메일을 보내 수행할 수 있습니다.

필드 이름은 지정 전문가(IESG 또는 그 위임자가 임명)의 조언에 따라 등록됩니다. 상태가 'permanent'인 필드는 Specification Required([RFC8126], 4.6절)입니다.

등록 요청은 다음 정보로 구성됩니다.

필드 이름:
요청하는 필드 이름입니다. 5.1절에 정의된 field-name 구문을 MUST 준수해야 하며 문자, 숫자 및 하이픈('-') 문자만 사용하고 첫 문자는 문자인 것이 SHOULD 요구됩니다.
상태:
"permanent", "provisional", "deprecated" 또는 "obsoleted".
사양 문서:
필드를 지정하는 문서에 대한 참조이며, 가능하면 문서 사본을 얻는 데 사용할 수 있는 URI를 포함합니다. provisional 등록에서는 선택 사항이지만 권장됩니다. 관련 절을 나타낼 수도 있지만 필수는 아닙니다.

그리고 선택적으로:

주석:
예약된 항목에 관한 정보 같은 추가 정보입니다.

전문가는 커뮤니티와 협의하여 레지스트리에 수집할 추가 필드를 정의할 수 있습니다.

표준에서 정의된 이름의 상태는 "permanent"입니다. 다른 이름도 전문가가 커뮤니티와 협의하여 실제 사용 중이라고 판단하면 permanent로 등록할 수 있습니다. 그 밖의 이름은 "provisional"로 등록하는 것이 바람직합니다.

provisional 항목은 전문가가 커뮤니티와 협의하여 사용 중이 아니라고 판단하면 제거할 수 있습니다. 전문가는 provisional 항목의 상태를 언제든 permanent로 변경할 수 있습니다.

전문가가 등록되지 않은 이름이 널리 배포되었고 그렇지 않으면 적시에 등록될 가능성이 낮다고 판단한 경우 제3자(전문가 포함)가 이름을 등록할 수 있음에 유의하십시오.

16.3.2. 새 필드에 대한 고려사항

HTTP 헤더 및 트레일러 필드는 프로토콜에서 널리 사용되는 확장 지점입니다. 임시적인 방식으로 사용할 수도 있지만 널리 사용하도록 의도된 필드는 상호운용성을 보장하기 위해 신중하게 문서화해야 합니다.

특히 새 필드를 정의하는 사양 작성자는 다음 측면을 고려하고 적절한 경우 문서화하는 것이 권장됩니다.

  • 필드를 사용할 수 있는 조건. 예: 응답이나 요청에서만, 모든 메시지에서, 특정 요청 메서드에 대한 응답에서만 등.
  • 특정 요청 메서드나 상태 코드와 함께 사용하는 경우처럼 필드 의미론이 컨텍스트에 의해 더 세분화되는지 여부.
  • 전달되는 정보의 적용 범위. 기본적으로 필드는 자신이 연결된 메시지에만 적용되지만 일부 응답 필드는 리소스의 모든 표현, 리소스 자체 또는 더 넓은 범위에 적용되도록 설계됩니다. 응답 필드의 범위를 확장하는 사양은 콘텐츠 협상, 적용 기간 및 일부 경우 멀티테넌트 서버 배포 같은 문제를 신중하게 고려해야 합니다.
  • 중개자가 필드 값을 삽입, 삭제 또는 수정할 수 있는 조건.
  • 필드를 트레일러에서 허용할 수 있는지 여부. 기본적으로는 허용되지 않습니다(6.5.1절 참조).
  • 필드 이름을 Connection 헤더 필드에 나열하는 것이 적절하거나 필수인지 여부(즉, 필드가 홉별이어야 하는 경우. 7.6.1절 참조).
  • 필드가 개인정보 관련 데이터 공개 같은 추가 보안 고려사항을 도입하는지 여부.

요청 헤더 필드는 기본 동작이 적절하지 않은 경우 문서화해야 할 추가 고려사항이 있습니다.

  • 필드 이름을 Vary 응답 헤더 필드에 나열하는 것이 적절한지 여부(예: 요청 헤더 필드가 오리진 서버의 콘텐츠 선택 알고리즘에서 사용되는 경우. 12.5.5절 참조).
  • PUT 요청에서 수신된 경우 필드를 저장하도록 의도했는지 여부(9.3.4절 참조).
  • 보안 문제 때문에 요청을 자동으로 리디렉션할 때 필드를 제거하는 것이 바람직한지 여부(15.4절 참조).
16.3.2.1. 새 필드 이름에 대한 고려사항

새 필드를 정의하는 사양 작성자는 짧지만 설명적인 필드 이름을 선택하는 것이 권장됩니다. 짧은 이름은 불필요한 데이터 전송을 피하고, 설명적인 이름은 혼동과 더 넓은 용도로 사용될 수 있는 이름의 "선점"을 방지합니다.

이를 위해 제한적으로 사용되는 필드(예: 단일 애플리케이션이나 사용 사례에 한정된 헤더)는 해당 용도(또는 약어)를 접두사로 포함한 이름을 사용하는 것이 권장됩니다. 예를 들어 Foo Application에 Description 필드가 필요하다면 "Foo-Desc"를 사용할 수 있습니다. "Description"은 너무 일반적이고 "Foo-Description"은 불필요하게 깁니다.

field-name 구문은 모든 token 문자를 허용하도록 정의되어 있지만 실제로 일부 구현은 필드 이름에 허용하는 문자를 제한합니다. 상호운용성을 위해 새 필드 이름은 영숫자 문자, "-" 및 "."로 제한하는 것이 SHOULD 요구되며 문자로 시작하는 것이 SHOULD 요구됩니다. 예를 들어 밑줄 ("_") 문자는 비 HTTP 게이트웨이 인터페이스를 통과할 때 문제가 될 수 있습니다(17.10절 참조).

필드 이름에는 "X-" 접두사를 사용하지 않는 것이 바람직합니다. 자세한 내용은 [BCP178]을 참조하십시오.

HTTP 필드 이름에는 다른 접두사도 때때로 사용됩니다. 예를 들어 "Accept-"는 여러 콘텐츠 협상 헤더에 사용되고 "Content-"는 6.4절에 설명된 대로 사용됩니다. 이러한 접두사는 필드의 목적을 인식하는 데 도움을 줄 뿐 자동 처리를 유발하지 않습니다.

16.3.2.2. 새 필드 값에 대한 고려사항

새 HTTP 필드를 정의할 때 중요한 작업 중 하나는 필드 값 구문, 즉 송신자가 무엇을 생성해야 하고 수신자가 수신한 내용에서 의미론을 어떻게 추론해야 하는지 지정하는 것입니다.

작성자는 새 필드 값의 구문을 정의할 때 이 사양의 ABNF 규칙이나 [RFC8941]의 규칙을 사용하는 것이 권장되지만 필수는 아닙니다.

작성자는 여러 필드 라인의 결합이 어떤 영향을 줄지 신중하게 고려하는 것이 권장됩니다(5.3절 참조). 송신자가 실수로 여러 값을 전송할 수 있고 중개자와 HTTP 라이브러리가 자동으로 결합할 수 있으므로 이는 하나의 값만 예상되는 경우에도 모든 필드 값에 적용됩니다.

따라서 작성자는 쉼표를 포함하는 값을 구분하거나 인코딩하는 것이 권장됩니다 (예: quoted-string 규칙(5.6.4절), [RFC8941]의 String 데이터 유형 또는 필드별 인코딩). 이를 통해 필드 데이터 안의 쉼표가 목록 값을 구분하는 쉼표와 혼동되지 않습니다.

예를 들어 Content-Type 필드 값은 인용 문자열 안에서만 쉼표를 허용하므로 여러 값이 있더라도 안정적으로 구문 분석할 수 있습니다. Location 필드 값은 따라서는 안 되는 반례입니다. URI에는 쉼표가 포함될 수 있으므로 쉼표를 포함하는 단일 값과 두 값을 안정적으로 구별할 수 없습니다.

싱글턴 값을 가진 필드 작성자(5.5절 참조)는 여러 멤버가 존재하는 메시지를 처리하는 방법도 문서화하는 것이 권장됩니다(합리적인 기본값은 필드를 무시하는 것이지만 항상 올바른 선택은 아닐 수 있습니다).

16.4. 인증 스킴 확장성

16.4.1. 인증 스킴 레지스트리

"Hypertext Transfer Protocol (HTTP) Authentication Scheme Registry"는 챌린지와 자격 증명의 인증 스킴 네임스페이스를 정의합니다. 이는 https://www.iana.org/assignments/http-authschemes에서 관리됩니다.

등록에는 다음 필드가 MUST 포함되어야 합니다.

  • 인증 스킴 이름
  • 사양 텍스트를 가리키는 참조
  • 참고(선택 사항)

이 네임스페이스에 추가되는 값은 IETF 검토가 필요합니다([RFC8126], 4.8절 참조).

16.4.2. 새 인증 스킴에 대한 고려사항

HTTP 인증 프레임워크에는 새 인증 스킴이 작동할 수 있는 방식을 제한하는 몇 가지 측면이 있습니다.

  • HTTP 인증은 상태 비저장으로 간주됩니다. 요청을 인증하는 데 필요한 모든 정보는 서버가 이전 요청을 기억하는 데 의존하지 않고 요청 안에 MUST 제공되어야 합니다. 기본 연결에 기반하거나 연결에 결합된 인증은 이 사양의 범위를 벗어나며, 인증된 사용자 이외의 어떤 당사자도 해당 연결을 사용할 수 없도록 보장하는 조치를 취하지 않는 한 본질적으로 결함이 있습니다(3.3절 참조).

  • 인증 매개변수 "realm"은 11.5절에 설명된 보호 공간을 정의하기 위해 예약되어 있습니다. 새 스킴은 해당 정의와 호환되지 않는 방식으로 이를 MUST NOT 사용해야 합니다.

  • "token68" 표기법은 기존 인증 스킴과의 호환성을 위해 도입되었으며 챌린지 또는 자격 증명당 한 번만 사용할 수 있습니다. 따라서 새 스킴은 대신 auth-param 구문을 사용하는 것이 바람직합니다. 그렇지 않으면 향후 확장이 불가능하기 때문입니다.

  • 챌린지와 자격 증명의 구문 분석은 이 사양에서 정의되며 새 인증 스킴으로 수정할 수 없습니다. auth-param 구문을 사용할 때 모든 매개변수는 token 및 quoted-string 구문을 모두 지원하는 것이 바람직하며 구문 제약은 구문 분석 후 필드 값(즉, quoted-string 처리)에 대해 정의하는 것이 바람직합니다. 이는 수신자가 모든 인증 스킴에 적용되는 일반 파서를 사용할 수 있게 하는 데 필요합니다.

    참고: "realm" 매개변수의 값 구문을 quoted-string으로 제한한 것은 새 매개변수에서 반복해서는 안 되는 잘못된 설계 선택이었습니다.

  • 새 스킴의 정의는 알 수 없는 확장 매개변수의 처리 방식을 정의하는 것이 바람직합니다. 일반적으로 "must-understand" 규칙보다 "must-ignore" 규칙이 선호됩니다. 그렇지 않으면 이전 수신자가 있는 상황에서 새 매개변수를 도입하기 어렵기 때문입니다. 또한 새 매개변수를 정의하는 정책 (예: "사양 갱신" 또는 "이 레지스트리 사용")을 설명하는 것이 좋습니다.

  • 인증 스킴은 오리진 서버 인증(즉, WWW-Authenticate 사용) 및/또는 프록시 인증(즉, Proxy-Authenticate 사용)에서 사용할 수 있는지 문서화해야 합니다.

  • Authorization 헤더 필드에 전달되는 자격 증명은 사용자 에이전트에 특화되어 있으므로 해당 자격 증명이 나타나는 요청 범위에서 HTTP 캐시에 "private" 캐시 응답 지시어( [CACHING]의 5.2.2.7절)와 동일한 영향을 줍니다.

    따라서 자격 증명을 Authorization 헤더 필드에 전달하지 않기로 선택한 새 인증 스킴(예: 새로 정의된 헤더 필드 사용)은 캐시 응답 지시어 (예: "private") 사용을 의무화하여 캐싱을 명시적으로 금지해야 합니다.

  • Authentication-Info, Proxy-Authentication-Info 또는 다른 인증 관련 응답 헤더 필드를 사용하는 스킴은 관련 보안 고려사항을 고려하고 문서화해야 합니다(17.16.4절 참조).

16.5. 범위 단위 확장성

16.5.1. 범위 단위 레지스트리

"HTTP Range Unit Registry"는 범위 단위 이름의 네임스페이스를 정의하고 대응하는 사양을 참조합니다. 이는 https://www.iana.org/assignments/http-parameters에서 관리됩니다.

HTTP Range Unit 등록에는 다음 필드가 MUST 포함되어야 합니다.

  • 이름
  • 설명
  • 사양 텍스트를 가리키는 참조

이 네임스페이스에 추가되는 값은 IETF 검토가 필요합니다([RFC8126], 4.8절 참조).

16.5.2. 새 범위 단위에 대한 고려사항

페이지, 절, 레코드, 행 또는 시간 같은 형식별 경계 등 다른 범위 단위도 애플리케이션별 목적으로 HTTP에서 사용할 수 있지만 실제로는 일반적으로 사용되지 않습니다. 대체 범위 단위의 구현자는 콘텐츠 코딩 및 범용 중개자와 어떻게 작동할지 고려하는 것이 바람직합니다.

16.6. 콘텐츠 코딩 확장성

16.6.1. 콘텐츠 코딩 레지스트리

IANA가 https://www.iana.org/assignments/http-parameters/에서 관리하는 "HTTP Content Coding Registry"는 content-coding 이름을 등록합니다.

콘텐츠 코딩 등록에는 다음 필드가 MUST 포함되어야 합니다.

  • 이름
  • 설명
  • 사양 텍스트를 가리키는 참조

인코딩 변환이 동일한 경우(8.4.1절에 정의된 압축 코딩처럼)가 아니라면 콘텐츠 코딩의 이름은 전송 코딩의 이름("HTTP Transfer Coding Registry", https://www.iana.org/assignments/http-parameters/에 위치)과 MUST NOT 겹쳐야 합니다.

이 네임스페이스에 추가되는 값은 IETF 검토( [RFC8126]의 4.8절)가 필요하며 8.4.1절에 정의된 콘텐츠 코딩의 목적에 MUST 부합해야 합니다.

16.6.2. 새 콘텐츠 코딩에 대한 고려사항

새 콘텐츠 코딩은 가능한 경우 자체 기술적이어야 하며, 선택적 매개변수는 전송 중 손실될 수 있는 외부 메타데이터에 의존하기보다 코딩 형식 자체에서 발견할 수 있는 것이 바람직합니다.

16.7. 업그레이드 토큰 레지스트리

"Hypertext Transfer Protocol (HTTP) Upgrade Token Registry"는 Upgrade 헤더 필드에서 프로토콜을 식별하는 데 사용되는 protocol-name 토큰의 네임스페이스를 정의합니다. 레지스트리는 https://www.iana.org/assignments/http-upgrade-tokens에서 관리됩니다.

등록된 각 프로토콜 이름은 연락처 정보와 연결이 업그레이드된 후 처리되는 방식을 자세히 설명하는 선택적 사양 집합과 연결됩니다.

등록은 "First Come First Served" 방식으로 이루어지며( [RFC8126]의 4.4절 참조) 다음 규칙을 따릅니다.

  1. protocol-name 토큰은 한 번 등록되면 영구적으로 등록된 상태를 유지합니다.
  2. protocol-name 토큰은 대소문자를 구분하지 않으며 송신자가 생성할 선호 대소문자 형식으로 등록됩니다.
  3. 등록에는 해당 등록에 책임이 있는 당사자를 MUST 명시해야 합니다.
  4. 등록에는 연락 담당자를 MUST 명시해야 합니다.
  5. 등록에는 해당 토큰과 관련된 사양 집합을 MAY 명시할 수 있습니다. 그러한 사양은 공개적으로 제공될 필요가 없습니다.
  6. 등록에는 등록 시점에 해당 토큰과 관련될 것으로 예상되는 "protocol-version" 토큰 집합을 SHOULD 명시해야 합니다.
  7. 책임 당사자는 언제든 등록을 MAY 변경할 수 있습니다. IANA는 그러한 모든 변경 기록을 보관하고 요청 시 제공할 것입니다.
  8. IESG는 프로토콜 토큰에 대한 책임을 MAY 재할당할 수 있습니다. 이는 일반적으로 책임 당사자에게 연락할 수 없는 경우에만 사용됩니다.

17. 보안 고려사항

이 절은 개발자, 정보 제공자 및 사용자에게 HTTP 의미론과 인터넷을 통한 정보 전송에 HTTP를 사용하는 것과 관련하여 알려진 보안 문제를 알리기 위한 것입니다. 캐싱 관련 고려사항은 [CACHING]의 7절에서 논의하며, HTTP/1.1 메시지 구문 및 구문 분석 관련 고려사항은 [HTTP/1.1]의 11절에서 논의합니다.

아래 고려사항 목록은 완전하지 않습니다. HTTP 의미론과 관련된 대부분의 보안 문제는 프로토콜 자체의 보안보다 서버 측 애플리케이션(HTTP 인터페이스 뒤의 코드)의 보안, HTTP를 통해 수신한 콘텐츠의 사용자 에이전트 처리 보안 또는 일반적인 인터넷의 안전한 사용에 관한 것입니다. HTTP 동작의 기본이 되는 URI의 보안 고려사항은 [URI]의 7절에서 논의합니다. 여러 조직은 웹 애플리케이션 보안에 대한 주제별 정보와 최신 연구 링크를 유지합니다 (예: [OWASP]).

17.1. 권한 설정

HTTP는 권위 있는 응답이라는 개념에 의존합니다. 이는 응답 메시지가 생성된 시점의 대상 리소스 상태를 고려했을 때 해당 요청에 가장 적절한 응답으로 대상 URI 안에서 식별된 오리진 서버에 의해(또는 그 지시에 따라) 결정된 응답입니다.

authority 구성요소에 등록된 이름이 사용되는 경우 "http" URI 스킴(4.2.1절)은 사용자의 로컬 이름 확인 서비스에 의존하여 권위 있는 응답을 찾을 위치를 결정합니다. 이는 사용자의 네트워크 host 테이블, 캐시된 이름 또는 이름 확인 라이브러리에 대한 모든 공격이 "http" URI의 권한 설정에 대한 공격 경로가 됨을 의미합니다. 마찬가지로 사용자가 선택한 DNS(Domain Name Service) 서버와 확인 결과를 얻는 서버 계층 구조도 주소 매핑의 진위성에 영향을 줄 수 있습니다. DNS Security Extensions(DNSSEC, [RFC4033])는 진위성을 향상하는 한 가지 방법이며, 더 안전한 전송 프로토콜을 통해 DNS 요청을 수행하는 다양한 메커니즘도 마찬가지입니다.

또한 IP 주소를 얻은 후에도 "http" URI의 권한 설정은 인터넷 프로토콜 라우팅에 대한 공격에 취약합니다.

"https" 스킴(4.2.2절)은 협상된 연결이 보호되고 클라이언트가 통신 중인 서버의 식별성이 대상 URI의 authority 구성요소와 일치하는지 올바르게 검증한다면 권한 설정에 대한 이러한 잠재적 공격 중 다수를 방지(또는 적어도 드러내기)하도록 의도되었습니다(4.3.4절). 이러한 검증을 올바르게 구현하는 것은 어려울 수 있습니다([Georgiev] 참조).

주어진 오리진 서버에 대한 권한은 프로토콜 확장을 통해 위임할 수 있습니다. 예를 들어 [ALTSVC]가 있습니다. 마찬가지로 연결이 권위 있는 것으로 간주되는 서버 집합은 [RFC8336] 같은 프로토콜 확장으로 변경할 수 있습니다.

공유 프록시 캐시처럼 권위 없는 소스에서 응답을 제공하는 것은 성능과 가용성을 높이는 데 유용한 경우가 많지만, 해당 소스를 신뢰할 수 있거나 신뢰할 수 없는 응답을 안전하게 사용할 수 있는 범위에서만 그렇습니다.

불행히도 사용자에게 권한을 전달하는 것은 어려울 수 있습니다. 예를 들어 피싱은 사용자의 권한 인식을 공격하는 것으로, 하이퍼텍스트에서 유사한 브랜딩을 제시하고 userinfo로 authority 구성요소를 난독화하여 그 인식을 오도할 수 있습니다(4.2.1절 참조). 사용자 에이전트는 사용자가 동작을 수행하기 전에 대상 URI를 쉽게 확인할 수 있도록 하고, userinfo가 존재할 때 이를 눈에 띄게 구분(또는 거부)하며, 참조 문서가 알 수 없거나 신뢰할 수 없는 소스에서 온 경우 저장된 자격 증명과 쿠키를 전송하지 않음으로써 피싱 공격의 영향을 줄일 수 있습니다.

17.2. 중개자의 위험

HTTP 중개자는 본질적으로 경로상 공격이 가능한 위치에 있습니다. 중개자가 실행되는 시스템이 침해되면 심각한 보안 및 개인정보 보호 문제가 발생할 수 있습니다. 중개자는 보안 관련 정보, 개별 사용자와 조직의 개인정보 및 사용자와 콘텐츠 제공자가 소유한 독점 정보에 접근할 수 있습니다. 침해된 중개자 또는 보안과 개인정보 보호 고려사항을 무시하고 구현되거나 구성된 중개자는 광범위한 잠재적 공격에 이용될 수 있습니다.

공유 캐시를 포함하는 중개자는 특히 캐시 오염 공격에 취약하며, 이는 [CACHING]의 7절에 설명되어 있습니다.

구현자는 설계와 코딩 결정 및 운영자에게 제공하는 구성 옵션 (특히 기본 구성)의 개인정보 보호 및 보안 영향을 고려해야 합니다.

중개자는 이를 운영하는 사람과 정책보다 더 신뢰할 수 없습니다. HTTP는 이 문제를 해결할 수 없습니다.

17.3. 파일 및 경로 이름 기반 공격

오리진 서버는 대상 URI에서 리소스 표현으로의 매핑을 관리하기 위해 로컬 파일 시스템을 자주 사용합니다. 대부분의 파일 시스템은 악의적인 파일 또는 경로 이름으로부터 보호하도록 설계되지 않았습니다. 따라서 오리진 서버는 대상 리소스를 파일, 폴더 또는 디렉터리에 매핑할 때 시스템에 특별한 의미가 있는 이름에 접근하지 않도록 해야 합니다.

예를 들어 UNIX, Microsoft Windows 및 기타 운영 체제는 ".."를 현재 디렉터리보다 한 단계 위를 나타내는 경로 구성요소로 사용하며 특별한 이름의 경로나 파일 이름을 사용해 시스템 장치로 데이터를 전송합니다. 유사한 명명 규칙이 다른 유형의 저장 시스템에도 존재할 수 있습니다. 마찬가지로 로컬 저장 시스템은 유효하지 않거나 예상하지 못한 문자 처리, 분해된 문자의 재조합 및 대소문자를 구분하지 않는 이름의 대소문자 정규화에서 보안보다 사용자 편의를 우선하는 성가신 경향이 있습니다.

이러한 특별한 이름을 기반으로 한 공격은 서비스 거부(예: 서버에 COM 포트에서 읽도록 지시) 또는 제공되도록 의도되지 않은 구성 및 소스 파일 공개에 집중하는 경향이 있습니다.

17.4. 명령, 코드 또는 쿼리 삽입 기반 공격

오리진 서버는 시스템 서비스를 식별하거나 데이터베이스 항목을 선택하거나 데이터 소스를 선택하는 수단으로 URI 안의 매개변수를 자주 사용합니다. 그러나 요청에서 수신한 데이터는 신뢰할 수 없습니다. 공격자는 요청 데이터 요소(메서드, 대상 URI, 헤더 필드 또는 콘텐츠)를 명령 호출, 언어 인터프리터 또는 데이터베이스 인터페이스를 통과할 때 명령, 코드 또는 쿼리로 잘못 해석될 수 있는 데이터를 포함하도록 구성할 수 있습니다.

예를 들어 SQL 삽입은 추가 쿼리 언어가 대상 URI 또는 헤더 필드의 일부(예: Host, Referer 등)에 삽입되는 일반적인 공격입니다. 수신한 데이터가 SELECT 문 안에서 직접 사용되면 쿼리 언어가 단순 문자열 값이 아니라 데이터베이스 명령으로 해석될 수 있습니다. 이러한 유형의 구현 취약점은 예방하기 쉬운데도 매우 흔합니다.

일반적으로 리소스 구현은 요청 데이터를 명령으로 처리하거나 해석하는 컨텍스트에서 사용하지 않는 것이 바람직합니다. 매개변수는 고정 문자열과 비교하고 그 비교 결과에 따라 동작해야 하며, 신뢰할 수 없는 데이터를 처리할 준비가 되지 않은 인터페이스로 전달해서는 안 됩니다. 고정된 매개변수를 기반으로 하지 않는 수신 데이터는 잘못 해석되지 않도록 신중하게 필터링하거나 인코딩하는 것이 바람직합니다.

요청 데이터를 저장했다가 나중에 처리하는 경우에도 유사한 고려사항이 적용됩니다. 예를 들어 로그 파일, 모니터링 도구 안에서 처리하거나 포함된 스크립트를 허용하는 데이터 형식 안에 포함하는 경우입니다.

17.5. 프로토콜 요소 길이를 통한 공격

HTTP는 대부분 텍스트 기반의 문자 구분 필드를 사용하므로 파서는 매우 긴(또는 매우 느린) 데이터 스트림을 전송하는 공격에 취약한 경우가 많으며, 특히 구현이 미리 정의된 길이가 없는 프로토콜 요소를 예상하는 경우 그렇습니다(2.3절).

상호운용성을 촉진하기 위해 필드의 최소 크기 제한에 대한 구체적인 권장 사항이 제공됩니다(5.4절). 이는 리소스가 제한된 구현에서도 지원할 수 있도록 선택된 최소 권장 사항이며, 대부분의 구현은 훨씬 높은 제한을 선택할 것으로 예상됩니다.

서버는 대상 URI가 너무 긴 메시지(15.5.15절)나 너무 큰 요청 콘텐츠(15.5.14절)가 있는 메시지를 거부할 수 있습니다. 용량 제한과 관련된 추가 상태 코드는 HTTP 확장 [RFC6585]에서 정의되었습니다.

수신자는 요청 메서드, 응답 상태 구문, 필드 이름, 숫자 값 및 청크 길이를 포함하되 이에 국한되지 않는 다른 프로토콜 요소를 처리하는 범위를 신중하게 제한하는 것이 바람직합니다. 이러한 처리를 제한하지 않으면 버퍼 또는 산술 오버플로로 인한 임의 코드 실행과 서비스 거부 공격에 대한 취약성 증가로 이어질 수 있습니다.

17.6. 공유 사전 압축을 사용하는 공격

암호화된 프로토콜에 대한 일부 공격은 동적 압축으로 생기는 크기 차이를 이용해 기밀 정보를 드러냅니다. 예: [BREACH]. 이러한 공격은 공격자가 제어하는 콘텐츠와 기밀 정보 사이에 중복을 만들어 두 콘텐츠에 동일한 사전을 사용하는 동적 압축 알고리즘이 공격자가 제어하는 콘텐츠가 기밀 콘텐츠의 일부와 일치할 때 더 효율적으로 압축하도록 하는 데 의존합니다.

HTTP 메시지는 TLS 압축, 콘텐츠 코딩, 전송 코딩 및 기타 확장 또는 버전별 메커니즘 사용을 포함하여 여러 방식으로 압축할 수 있습니다.

이 위험을 완화하는 가장 효과적인 방법은 민감한 데이터의 압축을 비활성화하거나 민감한 데이터와 공격자가 제어하는 데이터를 엄격히 분리하여 같은 압축 사전을 공유하지 못하도록 하는 것입니다. 신중하게 설계하면 압축 스킴을 HPACK([HPACK])처럼 제한된 사용 사례에서 악용 가능하다고 간주되지 않는 방식으로 설계할 수 있습니다.

17.7. 개인정보 공개

클라이언트는 리소스와 상호작용하기 위해 사용자가 제공한 정보(예: 사용자 이름, 위치, 이메일 주소, 암호, 암호화 키 등)와 시간에 따른 사용자의 탐색 활동에 관한 정보(예: 방문 기록, 북마크 등)를 포함하여 많은 양의 개인정보를 알게 되는 경우가 많습니다. 구현은 개인정보가 의도치 않게 공개되지 않도록 해야 합니다.

17.8. 서버 로그 정보의 개인정보 보호

서버는 시간이 지남에 따라 사용자의 요청에 관한 개인 데이터를 저장할 수 있으며, 이를 통해 사용자의 읽기 패턴이나 관심 주제를 식별할 수 있습니다. 특히 중개자에서 수집된 로그 정보에는 여러 사이트에 걸친 사용자 에이전트 상호작용 기록이 포함되는 경우가 많으며 개별 사용자까지 추적할 수 있습니다.

HTTP 로그 정보는 본질적으로 기밀이며, 법률과 규정에 따라 처리가 제한되는 경우가 많습니다. 로그 정보는 안전하게 저장하고 분석 시 적절한 지침을 따라야 합니다. 개별 항목 안의 개인정보를 익명화하면 도움이 되지만 다른 접근 특성과의 상관관계를 기반으로 실제 로그 추적을 다시 식별하는 것을 방지하기에는 일반적으로 충분하지 않습니다. 따라서 특정 클라이언트에 연결된 접근 추적은 키가 가명이어도 게시하기에 안전하지 않습니다.

도난이나 우발적 공개 위험을 최소화하기 위해 로그 정보에서 사용자 식별자, IP 주소 및 사용자가 제공한 쿼리 매개변수를 포함한 개인 식별 가능 정보를, 해당 정보가 보안, 감사 또는 사기 제어의 운영 요구를 지원하는 데 더 이상 필요하지 않은 즉시 제거하는 것이 바람직합니다.

17.9. URI의 민감 정보 공개

URI는 보안 리소스를 식별하는 경우에도 보호되기보다 공유되도록 의도되었습니다. URI는 화면에 표시되고, 페이지를 인쇄할 때 템플릿에 추가되며, 보호되지 않은 다양한 북마크 목록에 저장되는 경우가 많습니다. 많은 서버, 프록시 및 사용자 에이전트는 제3자가 볼 수 있는 위치에 대상 URI를 기록하거나 표시합니다. 따라서 민감하거나 개인을 식별할 수 있거나 공개 시 위험한 정보를 URI 안에 포함하는 것은 바람직하지 않습니다.

애플리케이션이 GET을 사용하는 양식의 쿼리 필드처럼 사용자가 제공한 정보로 대상 URI를 구성하기 위해 클라이언트 측 메커니즘을 사용할 때 URI 안에서 공개하기에 적절하지 않은 잠재적으로 민감한 데이터가 제공될 수 있습니다. POST는 일반적으로 URI를 구성하지 않으므로 이러한 경우에 선호됩니다. 대신 양식의 POST는 잠재적으로 민감한 데이터를 요청 콘텐츠로 전송합니다. 그러나 이는 캐싱을 방해하고 그렇지 않았다면 안전한 요청에 안전하지 않은 메서드를 사용합니다. 다른 우회 방법으로는 URI를 구성하기 전에 사용자가 제공한 데이터를 변환하거나 민감하지 않은 일반적인 값만 포함하도록 데이터를 필터링하는 것이 있습니다. 마찬가지로 쿼리 결과를 다른(서버가 생성한) URI로 리디렉션하면 이후 링크에서 잠재적으로 민감한 데이터를 제거하고 이후 재사용을 위한 캐시 가능한 응답을 제공할 수 있습니다.

Referer 헤더 필드는 대상 사이트에 요청을 발생시킨 컨텍스트를 알려 주므로 사용자의 즉각적인 탐색 기록과 참조 리소스의 URI에서 발견될 수 있는 개인정보를 공개할 가능성이 있습니다. Referer 헤더 필드의 일부 보안 고려사항을 다루기 위한 제한은 10.1.3절에 설명되어 있습니다.

17.10. 필드 이름의 애플리케이션 처리

서버는 수신된 요청을 처리하고 응답 콘텐츠를 생성하기 위해 비 HTTP 게이트웨이 인터페이스와 프레임워크를 자주 사용합니다. 역사적인 이유로 이러한 인터페이스는 환경 변수에 적합한 이름 매핑을 사용하여 수신된 필드 이름을 외부 변수 이름으로 전달하는 경우가 많습니다.

예를 들어 [RFC3875]의 4.1.18절에 정의된 Common Gateway Interface(CGI)의 프로토콜별 메타 변수 매핑은 CGI의 표준 변수 중 하나에 대응하지 않는 수신 헤더 필드에 적용됩니다. 매핑은 각 이름 앞에 "HTTP_"를 붙이고 하이픈("-")의 모든 인스턴스를 밑줄("_")로 변경하는 것으로 구성됩니다. 애플리케이션을 한 플랫폼에서 다음 플랫폼으로 쉽게 이동할 수 있도록 여러 다른 애플리케이션 프레임워크도 동일한 매핑을 이어받았습니다.

CGI에서 수신된 Content-Length 필드는 수신된 필드 값과 일치하는 문자열 값을 가진 메타 변수 "CONTENT_LENGTH"로 전달됩니다. 반면 수신된 "Content_Length" 헤더 필드는 프로토콜별 메타 변수 "HTTP_CONTENT_LENGTH"로 전달되며, 애플리케이션이 기본 변수 대신 프로토콜별 메타 변수를 잘못 읽으면 혼동이 발생할 수 있습니다. (이 역사적인 관행 때문에 16.3.2.1절에서는 밑줄을 포함하는 새 필드 이름을 만들지 않도록 권장합니다.)

불행히도 필드 이름을 다른 인터페이스 이름으로 매핑할 때 매핑이 불완전하거나 모호하면 보안 취약점이 발생할 수 있습니다. 예를 들어 공격자가 "Transfer_Encoding"이라는 필드를 전송하면 단순한 인터페이스가 이를 "Transfer-Encoding" 필드와 동일한 변수 이름으로 매핑하여 잠재적인 요청 스머글링 취약점을 일으킬 수 있습니다([HTTP/1.1]의 11.2절).

관련 위험을 완화하기 위해 이러한 매핑을 수행하는 구현은 이름으로 수신될 수 있는 전체 옥텟 범위 (HTTP 문법에서 권장하지 않거나 금지한 것 포함)에 대해 매핑을 모호하지 않고 완전하게 만드는 것이 권장됩니다. 예를 들어 특이한 이름 문자를 가진 필드는 요청을 차단하거나, 해당 필드를 제거하거나, 다른 필드와 구별하기 위해 이름을 다른 접두사와 함께 전달하도록 할 수 있습니다.

17.11. 리디렉션 후 프래그먼트 공개

URI 참조 안에서 사용되는 프래그먼트 식별자는 요청으로 전송되지 않지만 구현자는 사용자 에이전트 및 응답의 결과로 실행되는 확장이나 스크립트에서 이를 볼 수 있음을 알아야 합니다. 특히 리디렉션이 발생하고 원래 요청의 프래그먼트 식별자가 Location의 새 참조에 상속되는 경우(10.2.2절) 한 사이트의 프래그먼트가 다른 사이트에 공개되는 효과가 있을 수 있습니다. 첫 번째 사이트가 프래그먼트에 개인정보를 사용하는 경우 다른 사이트로의 리디렉션에 상속을 차단하기 위한 프래그먼트 구성요소(비어 있을 수도 있음)를 포함하도록 하는 것이 바람직합니다.

17.12. 제품 정보 공개

User-Agent(10.1.5절), Via(7.6.3절) 및 Server(10.2.4절) 헤더 필드는 종종 각 송신자의 소프트웨어 시스템에 관한 정보를 드러냅니다. 이론적으로 이는 공격자가 알려진 보안 허점을 악용하기 쉽게 만들 수 있습니다. 실제로 공격자는 사용 중인 것으로 보이는 소프트웨어 버전과 관계없이 잠재적인 모든 허점을 시도하는 경향이 있습니다.

네트워크 방화벽을 통과하는 포털 역할을 하는 프록시는 방화벽 뒤의 host를 식별할 수 있는 헤더 정보 전송에 특별히 주의하는 것이 바람직합니다. Via 헤더 필드를 사용하면 중개자가 민감한 머신 이름을 가명으로 대체할 수 있습니다.

17.13. 브라우저 핑거프린팅

브라우저 핑거프린팅은 고유한 특성 집합을 통해 특정 사용자 에이전트를 시간에 걸쳐 식별하는 기법 집합입니다. 이러한 특성에는 기본 전송 프로토콜 사용 방식, 기능 능력 및 스크립팅 환경과 관련된 정보가 포함될 수 있지만 여기서 특히 중요한 것은 HTTP를 통해 전달될 수 있는 고유한 특성 집합입니다. 핑거프린팅은 사용자가 다른 형태의 데이터 수집(예: 쿠키)에 대해 가질 수 있는 대응 제어 없이 시간에 따른 사용자 에이전트의 동작을 추적할 수 있게 하기 때문에 개인정보 보호 문제로 간주됩니다([Bujlow]). 많은 범용 사용자 에이전트(즉, 웹 브라우저)는 핑거프린트를 줄이기 위한 조치를 취했습니다.

핑거프린팅이 가능할 정도로 고유한 정보를 서버에 공개할 수 있는 여러 요청 헤더 필드가 있습니다. From 헤더 필드가 가장 명백하지만 사용자가 자기 식별을 원하는 경우에만 From이 전송될 것으로 예상됩니다. 마찬가지로 Cookie 헤더 필드는 의도적으로 재식별을 가능하게 하도록 설계되었으므로 핑거프린팅 문제는 쿠키가 사용자 에이전트의 구성에 의해 비활성화되거나 제한된 상황에만 적용됩니다.

User-Agent 헤더 필드는 특히 사용자 에이전트가 사용자 시스템이나 확장에 관한 과도한 세부 정보를 전송하는 경우 일반적으로 다른 특성과 결합하여 특정 장치를 고유하게 식별하기에 충분한 정보를 포함할 수 있습니다. 그러나 사용자가 가장 예상하기 어려운 고유 정보의 출처는 선제적 협상(12.1절)이며, 여기에는 Accept, Accept-Charset, Accept-Encoding 및 Accept-Language 헤더 필드가 포함됩니다.

핑거프린팅 문제뿐 아니라 Accept-Language 헤더 필드를 상세하게 사용하면 사용자가 사적인 성격이라고 생각할 수 있는 정보가 드러날 수 있습니다. 예를 들어 특정 언어 집합을 이해하는 것은 특정 민족 집단의 구성원이라는 사실과 강하게 연관될 수 있습니다. 이러한 개인정보 손실을 제한하는 한 가지 접근 방식은 사용자 에이전트가 명시적으로 허용한 사이트를 제외하고 Accept-Language 전송을 생략하는 것입니다. 이는 언어 협상이 유용할 수 있음을 나타내는 Vary 헤더 필드를 감지한 후 상호작용을 통해 허용할 수도 있습니다.

개인정보 보호를 강화하기 위해 프록시를 사용하는 환경에서 사용자 에이전트는 선제적 협상 헤더 필드 전송에 보수적인 것이 바람직합니다. 헤더 필드를 높은 수준으로 구성할 수 있는 범용 사용자 에이전트는 너무 많은 세부 정보를 제공할 경우 발생할 수 있는 개인정보 손실을 사용자에게 알리는 것이 바람직합니다. 극단적인 개인정보 보호 조치로 프록시는 중계되는 요청에서 선제적 협상 헤더 필드를 필터링할 수 있습니다.

17.14. 검증자 유지

이 사양에서 정의한 검증자는 표현의 유효성을 보장하거나 악의적인 변경을 방지하거나 경로상 공격을 감지하도록 의도되지 않았습니다. 기껏해야 모든 참여자가 올바르게 동작할 때 더 효율적인 캐시 갱신과 낙관적 동시 쓰기를 가능하게 합니다. 최악의 경우 조건이 실패하고 클라이언트는 조건부 요청이 없는 HTTP 교환보다 더 해롭지 않은 응답을 받습니다.

엔터티 태그는 개인정보 보호 위험을 만드는 방식으로 악용될 수 있습니다. 예를 들어 사이트는 사용자 또는 사용자 에이전트에 고유한 의미상 유효하지 않은 엔터티 태그를 의도적으로 구성하여 긴 신선도 시간과 함께 캐시 가능한 응답으로 전송한 뒤 나중의 조건부 요청에서 해당 엔터티 태그를 읽어 사용자 또는 사용자 에이전트를 재식별할 수 있습니다. 그러한 식별 태그는 사용자 에이전트가 원래 캐시 항목을 유지하는 동안 지속적인 식별자가 됩니다. 표현을 캐시하는 사용자 에이전트는 사용자가 저장된 쿠키를 지우거나 비공개 브라우징 모드로 전환하는 것 같은 개인정보 보호 동작을 수행할 때마다 캐시가 지워지거나 대체되도록 하는 것이 바람직합니다.

17.15. 범위를 사용하는 서비스 거부 공격

제약 없는 다중 범위 요청은 서비스 거부 공격에 취약합니다. 동일한 데이터의 많은 중첩 범위를 요청하는 데 드는 노력은 요청된 데이터를 여러 부분으로 제공하려 할 때 소비되는 시간, 메모리 및 대역폭에 비해 매우 작기 때문입니다. 서버는 두 개를 초과하는 중첩 범위를 요청하거나 하나의 집합에 많은 작은 범위를 요청하는 등 지나친 범위 요청을 무시, 병합 또는 거부하는 것이 바람직하며, 특히 명백한 이유 없이 범위를 순서와 다르게 요청하는 경우 그렇습니다. 멀티파트 범위 요청은 임의 접근을 지원하도록 설계되지 않았습니다.

17.16. 인증 고려사항

HTTP 인증이라는 주제의 모든 것은 보안 고려사항이므로 아래 고려사항 목록은 완전하지 않습니다. 또한 특정 인증 스킴의 모든 잠재적 고려사항 (해당 스킴을 정의하는 사양에서 문서화하는 것이 바람직함)을 논의하기보다 일반적인 인증 프레임워크에 관한 보안 고려사항으로 제한됩니다. 여러 조직은 웹 애플리케이션 보안에 대한 주제별 정보와 최신 연구 링크를 유지하며 (예: [OWASP]), 실제로 사용되는 인증 스킴을 구현하고 사용할 때 흔히 발생하는 문제도 포함합니다.

17.16.1. 자격 증명의 기밀성

HTTP 인증 프레임워크는 자격 증명의 기밀성을 유지하기 위한 단일 메커니즘을 정의하지 않습니다. 대신 각 인증 스킴이 전송 전에 자격 증명을 인코딩하는 방식을 정의합니다. 이는 향후 인증 스킴 개발에 유연성을 제공하지만 자체적으로 기밀성을 제공하지 않거나 재생 공격에 대해 충분히 보호하지 못하는 기존 스킴을 보호하기에는 충분하지 않습니다. 또한 서버가 개별 사용자별 자격 증명을 기대한다면 자격 증명 안의 콘텐츠가 기밀로 유지되더라도 해당 자격 증명의 교환 자체가 사용자를 식별하는 효과를 갖습니다.

HTTP는 필드의 기밀 전송을 제공하기 위해 기본 전송 계층 또는 세션 계층 연결의 보안 속성에 의존합니다. 개별 사용자 인증에 의존하는 서비스는 자격 증명을 교환하기 전에 보호된 연결이 필요합니다(4.2.2절).

17.16.2. 자격 증명과 유휴 클라이언트

기존 HTTP 클라이언트와 사용자 에이전트는 일반적으로 인증 정보를 무기한 유지합니다. HTTP는 자격 증명이 사용자 에이전트에 의해 어떻게 얻어지거나 관리되는지 프로토콜이 인식하지 못하므로 오리진 서버가 클라이언트에 캐시된 자격 증명을 버리도록 지시하는 메커니즘을 제공하지 않습니다. 자격 증명을 만료하거나 취소하는 메커니즘은 인증 스킴 정의의 일부로 지정할 수 있습니다.

자격 증명 캐싱이 애플리케이션의 보안 모델을 방해할 수 있는 상황은 다음을 포함하지만 이에 국한되지 않습니다.

  • 클라이언트가 장시간 유휴 상태였고 이후 서버가 클라이언트가 사용자에게 자격 증명을 다시 요청하도록 하려는 경우.
  • 애플리케이션에 세션 종료 표시(예: 페이지의 "logout" 또는 "commit" 버튼)가 포함되어 있고 그 이후 애플리케이션의 서버 측이 클라이언트가 자격 증명을 계속 유지할 이유가 없다고 "알고" 있는 경우.

자격 증명을 캐시하는 사용자 에이전트는 사용자가 제어하여 캐시된 자격 증명을 버릴 수 있는 쉽게 접근 가능한 메커니즘을 제공하는 것이 권장됩니다.

17.16.3. 보호 공간

보호 공간을 설정할 때 "realm" 메커니즘에만 의존하는 인증 스킴은 오리진 서버의 모든 리소스에 자격 증명을 노출합니다. 어떤 리소스에 인증된 요청을 성공적으로 수행한 클라이언트는 동일한 오리진 서버의 다른 리소스에 같은 인증 자격 증명을 사용할 수 있습니다. 이로 인해 다른 리소스가 다른 리소스의 인증 자격 증명을 수집할 수 있습니다.

이는 오리진 서버가 동일한 오리진 아래에서 여러 당사자의 리소스를 호스팅할 때 특히 문제가 됩니다(11.5절). 가능한 완화 전략으로는 인증 자격 증명에 대한 직접 접근을 제한하는 것 (즉, Authorization 요청 헤더 필드의 콘텐츠를 제공하지 않음)과 각 당사자에 서로 다른 host 이름(또는 port 번호)을 사용하여 보호 공간을 분리하는 것이 있습니다.

17.16.4. 추가 응답 필드

암호화되지 않은 채널을 통해 전송되는 응답에 정보를 추가하면 보안과 개인정보 보호에 영향을 줄 수 있습니다. Authentication-Info 및 Proxy-Authentication-Info 헤더 필드가 존재한다는 사실만으로도 HTTP 인증이 사용 중임을 나타냅니다. 인증 스킴별 매개변수의 콘텐츠로 추가 정보가 노출될 수 있으므로 해당 스킴의 정의에서 이를 고려해야 합니다.

18. IANA 고려사항

다음 등록의 변경 관리자는 "IETF (iesg@ietf.org) - Internet Engineering Task Force"입니다.

18.1. URI 스킴 등록

IANA는 4.2절의 표 2에 나열된 영구 스킴으로 [BCP35]의 "Uniform Resource Identifier (URI) Schemes" 레지스트리 https://www.iana.org/assignments/uri-schemes/를 갱신했습니다.

18.2. 메서드 등록

IANA는 16.1.1절의 등록 절차와 다음 표에 요약된 메서드 이름으로 https://www.iana.org/assignments/http-methods의 "Hypertext Transfer Protocol (HTTP) Method Registry"를 갱신했습니다.

표 7
메서드 안전함 멱등 절
CONNECT no no 9.3.6
DELETE no yes 9.3.5
GET yes yes 9.3.1
HEAD yes yes 9.3.2
OPTIONS yes yes 9.3.7
POST no no 9.3.3
PUT no yes 9.3.4
TRACE yes yes 9.3.8
* no no 18.2

메서드 이름 "*"는 일부 필드(예: "Access-Control-Request-Method")에서 와일드카드로 사용하는 것과 충돌할 수 있으므로 예약되어 있습니다.

18.3. 상태 코드 등록

IANA는 16.2.1절의 등록 절차와 다음 표에 요약된 상태 코드 값으로 https://www.iana.org/assignments/http-status-codes의 "Hypertext Transfer Protocol (HTTP) Status Code Registry"를 갱신했습니다.

표 8
값 설명 절
100 계속 15.2.1
101 프로토콜 전환 15.2.2
200 OK 15.3.1
201 생성됨 15.3.2
202 수락됨 15.3.3
203 비권위 정보 15.3.4
204 콘텐츠 없음 15.3.5
205 콘텐츠 재설정 15.3.6
206 부분 콘텐츠 15.3.7
300 여러 선택지 15.4.1
301 영구 이동 15.4.2
302 발견됨 15.4.3
303 다른 위치 참조 15.4.4
304 수정되지 않음 15.4.5
305 프록시 사용 15.4.6
306 (사용되지 않음) 15.4.7
307 임시 리디렉션 15.4.8
308 영구 리디렉션 15.4.9
400 잘못된 요청 15.5.1
401 인증되지 않음 15.5.2
402 결제 필요 15.5.3
403 금지됨 15.5.4
404 찾을 수 없음 15.5.5
405 허용되지 않는 메서드 15.5.6
406 허용할 수 없음 15.5.7
407 프록시 인증 필요 15.5.8
408 요청 시간 초과 15.5.9
409 충돌 15.5.10
410 사라짐 15.5.11
411 길이 필요 15.5.12
412 사전 조건 실패 15.5.13
413 콘텐츠가 너무 큼 15.5.14
414 URI가 너무 김 15.5.15
415 지원되지 않는 미디어 유형 15.5.16
416 범위를 충족할 수 없음 15.5.17
417 기대 조건 실패 15.5.18
418 (사용되지 않음) 15.5.19
421 잘못 전달된 요청 15.5.20
422 처리할 수 없는 콘텐츠 15.5.21
426 업그레이드 필요 15.5.22
500 내부 서버 오류 15.6.1
501 구현되지 않음 15.6.2
502 잘못된 게이트웨이 15.6.3
503 서비스 사용 불가 15.6.4
504 게이트웨이 시간 초과 15.6.5
505 지원되지 않는 HTTP 버전 15.6.6

18.4. 필드 이름 등록

이 사양은 [RFC3864]에 정의된 메시지 헤더 필드의 기존 등록 절차 중 HTTP 관련 측면을 갱신합니다. 새 등록 절차를 정의하고 HTTP 필드 정의를 별도 레지스트리로 옮겨 HTTP와 관련된 기존 절차를 대체합니다.

IANA는 16.3.1절에 설명된 대로 "Hypertext Transfer Protocol (HTTP) Field Name Registry"라는 새 레지스트리를 만들었습니다.

IANA는 "Permanent Message Header Field Names" 및 "Provisional Message Header Field Names" 레지스트리(https://www.iana.org/assignments/message-headers/ 참조)에서 프로토콜이 'http'인 모든 항목을 이 레지스트리로 옮기고 다음 변경을 적용했습니다.

  1. 'Applicable Protocol' 필드를 생략했습니다.
  2. 상태가 'standard', 'experimental', 'reserved' 또는 'informational'이었던 항목의 상태를 'permanent'로 변경했습니다.
  3. 상태가 없던 provisional 항목의 상태를 'provisional'로 변경했습니다.
  4. 상태가 없던 permanent 항목(등록 문서가 상태를 정의하지 않았음을 확인한 후)의 상태를 'provisional'로 변경했습니다. 전문가가 다른 상태가 더 적절하다는 증거가 있으면 항목의 상태를 갱신할 수 있습니다.

IANA는 HTTP 필드 이름 등록이 이동했음을 나타내기 위해 "Permanent Message Header Field Names" 및 "Provisional Message Header Field Names" 레지스트리에 다음 참고를 추가했습니다.

IANA는 다음 표에 나열된 필드 이름으로 "Hypertext Transfer Protocol (HTTP) Field Name Registry"를 갱신했습니다.

표 9
필드 이름 상태 절 주석
Accept permanent 12.5.1
Accept-Charset deprecated 12.5.2
Accept-Encoding permanent 12.5.3
Accept-Language permanent 12.5.4
Accept-Ranges permanent 14.3
Allow permanent 10.2.1
Authentication-Info permanent 11.6.3
Authorization permanent 11.6.2
Connection permanent 7.6.1
Content-Encoding permanent 8.4
Content-Language permanent 8.5
Content-Length permanent 8.6
Content-Location permanent 8.7
Content-Range permanent 14.4
Content-Type permanent 8.3
Date permanent 6.6.1
ETag permanent 8.8.3
Expect permanent 10.1.1
From permanent 10.1.2
Host permanent 7.2
If-Match permanent 13.1.1
If-Modified-Since permanent 13.1.3
If-None-Match permanent 13.1.2
If-Range permanent 13.1.5
If-Unmodified-Since permanent 13.1.4
Last-Modified permanent 8.8.2
Location permanent 10.2.2
Max-Forwards permanent 7.6.2
Proxy-Authenticate permanent 11.7.1
Proxy-Authentication-Info permanent 11.7.3
Proxy-Authorization permanent 11.7.2
Range permanent 14.2
Referer permanent 10.1.3
Retry-After permanent 10.2.3
Server permanent 10.2.4
TE permanent 10.1.4
Trailer permanent 6.6.2
Upgrade permanent 7.8
User-Agent permanent 10.1.5
Vary permanent 12.5.5
Via permanent 7.6.3
WWW-Authenticate permanent 11.6.1
* permanent 12.5.5 (reserved)

필드 이름 "*"는 해당 이름을 HTTP 헤더 필드로 사용하면 Vary 헤더 필드(12.5.5절)의 특별한 의미론과 충돌할 수 있으므로 예약되어 있습니다.

IANA는 새 레지스트리의 "Content-MD5" 항목을 'obsoleted' 상태로 갱신하고 [RFC2616]의 14.15절(헤더 필드 정의)과 [RFC7231]의 부록 B (갱신된 사양에서 필드 정의를 제거함)를 참조하도록 했습니다.

18.5. 인증 스킴 등록

IANA는 16.4.1절의 등록 절차로 https://www.iana.org/assignments/http-authschemes의 "Hypertext Transfer Protocol (HTTP) Authentication Scheme Registry"를 갱신했습니다. 이 문서에서는 인증 스킴을 정의하지 않습니다.

18.6. 콘텐츠 코딩 등록

IANA는 16.6.1절의 등록 절차와 아래 표에 요약된 콘텐츠 코딩 이름으로 https://www.iana.org/assignments/http-parameters/의 "HTTP Content Coding Registry"를 갱신했습니다.

표 10
이름 설명 절
compress UNIX "compress" 데이터 형식 [Welch] 8.4.1.1
deflate "zlib" 데이터 형식([RFC1950]) 안의 "deflate" 압축 데이터([RFC1951]) 8.4.1.2
gzip GZIP 파일 형식 [RFC1952] 8.4.1.3
identity 예약됨 12.5.3
x-compress 폐기됨(compress의 별칭) 8.4.1.1
x-gzip 폐기됨(gzip의 별칭) 8.4.1.3

18.7. 범위 단위 등록

IANA는 16.5.1절의 등록 절차와 아래 표에 요약된 범위 단위 이름으로 https://www.iana.org/assignments/http-parameters/의 "HTTP Range Unit Registry"를 갱신했습니다.

표 11
범위 단위 이름 설명 절
bytes 옥텟 범위 14.1.2
none 범위 요청이 지원되지 않음을 나타내는 키워드로 예약됨 14.3

18.8. 미디어 유형 등록

IANA는 미디어 유형 "multipart/byteranges"에 대해 14.6절의 등록 정보로 https://www.iana.org/assignments/media-types의 "Media Types" 레지스트리를 갱신했습니다.

IANA는 "q" 매개변수에 관한 레지스트리 참고를 이 문서의 12.5.1절 링크로 갱신했습니다.

18.9. 포트 등록

IANA는 UDP 또는 TCP를 사용하는 포트 80과 443의 서비스에 대해 https://www.iana.org/assignments/service-names-port-numbers/의 "Service Name and Transport Protocol Port Number Registry"를 다음과 같이 갱신했습니다.

  1. 이 문서를 "Reference"로 사용하고,
  2. 현재 지정되지 않은 경우 "Assignee"를 "IESG"로, "Contact"를 "IETF_Chair"로 설정합니다.

18.10. 업그레이드 토큰 등록

IANA는 16.7절에 설명된 등록 절차와 다음 표에 요약된 upgrade 토큰 이름으로 https://www.iana.org/assignments/http-upgrade-tokens의 "Hypertext Transfer Protocol (HTTP) Upgrade Token Registry"를 갱신했습니다.

표 12
이름 설명 예상 버전 토큰 절
HTTP 하이퍼텍스트 전송 프로토콜 모든 DIGIT.DIGIT(예: "2.0") 2.5

19. 참조 문헌

19.1. 규범적 참조 문헌

[CACHING]
Fielding, R., 편집자, Nottingham, M., 편집자 및 J. Reschke, 편집자, “HTTP 캐싱”, STD 98, RFC 9111, DOI 10.17487/RFC9111, 2022년 6월.
[RFC1950]
Deutsch, P. 및 J-L. Gailly, “ZLIB 압축 데이터 형식 사양 버전 3.3”, RFC 1950, DOI 10.17487/RFC1950, 1996년 5월, <https://www.rfc-editor.org/info/rfc1950>.
[RFC1951]
Deutsch, P., “DEFLATE 압축 데이터 형식 사양 버전 1.3”, RFC 1951, DOI 10.17487/RFC1951, 1996년 5월, <https://www.rfc-editor.org/info/rfc1951>.
[RFC1952]
Deutsch, P., “GZIP 파일 형식 사양 버전 4.3”, RFC 1952, DOI 10.17487/RFC1952, 1996년 5월, <https://www.rfc-editor.org/info/rfc1952>.
[RFC2046]
Freed, N. 및 N. Borenstein, “다목적 인터넷 메일 확장(MIME) 제2부: 미디어 유형”, RFC 2046, DOI 10.17487/RFC2046, 1996년 11월 , <https://www.rfc-editor.org/info/rfc2046>.
[RFC2119]
Bradner, S., “요구 수준을 나타내기 위해 RFC에서 사용하는 핵심 단어”, BCP 14, RFC 2119, DOI 10.17487/RFC2119, 1997년 3월, <https://www.rfc-editor.org/info/rfc2119>.
[RFC4647]
Phillips, A., 편집자 및 M. Davis, 편집자, “언어 태그 일치”, BCP 47, RFC 4647, DOI 10.17487/RFC4647, 2006년 9월 , <https://www.rfc-editor.org/info/rfc4647>.
[RFC4648]
Josefsson, S., “Base16, Base32 및 Base64 데이터 인코딩”, RFC 4648, DOI 10.17487/RFC4648, 2006년 10월 , <https://www.rfc-editor.org/info/rfc4648>.
[RFC5234]
Crocker, D., 편집자 및 P. Overell, “구문 사양을 위한 확장 BNF: ABNF”, STD 68, RFC 5234, DOI 10.17487/RFC5234, 2008년 1월, <https://www.rfc-editor.org/info/rfc5234>.
[RFC5280]
Cooper, D., Santesson, S., Farrell, S., Boeyen, S., Housley, R. 및 W. Polk, “인터넷 X.509 공개 키 인프라 인증서 및 인증서 폐기 목록(CRL) 프로파일”, RFC 5280, DOI 10.17487/RFC5280, 2008년 5월, <https://www.rfc-editor.org/info/rfc5280>.
[RFC5322]
Resnick, P., 편집자, “인터넷 메시지 형식”, RFC 5322, DOI 10.17487/RFC5322, 2008년 10월, <https://www.rfc-editor.org/info/rfc5322>.
[RFC5646]
Phillips, A., 편집자 및 M. Davis, 편집자, “언어 식별용 태그”, BCP 47, RFC 5646, DOI 10.17487/RFC5646, 2009년 9월, <https://www.rfc-editor.org/info/rfc5646>.
[RFC6125]
Saint-Andre, P. 및 J. Hodges, “전송 계층 보안(TLS) 환경에서 X.509(PKIX) 인증서를 사용한 인터넷 공개 키 인프라 내 도메인 기반 애플리케이션 서비스 ID의 표현 및 검증”, RFC 6125, DOI 10.17487/RFC6125, 2011년 3월, <https://www.rfc-editor.org/info/rfc6125>.
[RFC6365]
Hoffman, P. 및 J. Klensin, “IETF의 국제화에서 사용되는 용어”, BCP 166, RFC 6365, DOI 10.17487/RFC6365, 2011년 9월 , <https://www.rfc-editor.org/info/rfc6365>.
[RFC7405]
Kyzivat, P., “ABNF의 대소문자 구분 문자열 지원”, RFC 7405, DOI 10.17487/RFC7405, 2014년 12월 , <https://www.rfc-editor.org/info/rfc7405>.
[RFC8174]
Leiba, B., “RFC 2119 핵심 단어에서 대문자와 소문자의 모호성”, BCP 14, RFC 8174, DOI 10.17487/RFC8174, 2017년 5월, <https://www.rfc-editor.org/info/rfc8174>.
[TCP]
Postel, J., “전송 제어 프로토콜”, STD 7, RFC 793, DOI 10.17487/RFC0793, 1981년 9월, <https://www.rfc-editor.org/info/rfc793>.
[TLS13]
Rescorla, E., “전송 계층 보안(TLS) 프로토콜 버전 1.3”, RFC 8446, DOI 10.17487/RFC8446, 2018년 8월 , <https://www.rfc-editor.org/info/rfc8446>.
[URI]
Berners-Lee, T., Fielding, R. 및 L. Masinter, “URI(Uniform Resource Identifier): 일반 구문”, STD 66, RFC 3986, DOI 10.17487/RFC3986, 2005년 1월, <https://www.rfc-editor.org/info/rfc3986>.
[USASCII]
American National Standards Institute, “부호화 문자 집합 -- 7비트 미국 정보 교환용 표준 코드”, ANSI X3.4, 1986.
[Welch]
Welch, T., “고성능 데이터 압축 기법”, IEEE Computer 17(6), DOI 10.1109/MC.1984.1659158, 1984년 6월, <https://ieeexplore.ieee.org/document/1659158/>.

19.2. 정보 제공용 참조 문헌

[ALTSVC]
Nottingham, M., McManus, P. 및 J. Reschke, “HTTP 대체 서비스”, RFC 7838, DOI 10.17487/RFC7838, 2016년 4월, <https://www.rfc-editor.org/info/rfc7838>.
[BCP13]
Freed, N. 및 J. Klensin, “다목적 인터넷 메일 확장(MIME) 제4부: 등록 절차”, BCP 13, RFC 4289, DOI 10.17487/RFC4289, 2005년 12월 .
Freed, N., Klensin, J. 및 T. Hansen, “미디어 유형 사양 및 등록 절차”, BCP 13, RFC 6838, DOI 10.17487/RFC6838, 2013년 1월 .
<https://www.rfc-editor.org/info/bcp13>
[BCP178]
Saint-Andre, P., Crocker, D. 및 M. Nottingham, “애플리케이션 프로토콜에서 "X-" 접두사 및 유사한 구조 폐기”, BCP 178, RFC 6648, DOI 10.17487/RFC6648, 2012년 6월.
<https://www.rfc-editor.org/info/bcp178>
[BCP35]
Thaler, D., 편집자, Hansen, T. 및 T. Hardie, “URI 스킴 지침 및 등록 절차”, BCP 35, RFC 7595, DOI 10.17487/RFC7595, 2015년 6월.
<https://www.rfc-editor.org/info/bcp35>
[BREACH]
Gluck, Y., Harris, N. 및 A. Prado, “BREACH: CRIME 공격의 부활”, 2013년 7월, <http://breachattack.com/resources/BREACH%20-%20SSL,%20gone%20in%2030%20seconds.pdf>.
[Bujlow]
Bujlow, T., Carela-Español, V., Solé-Pareta, J. 및 P. Barlet-Ros, “웹 추적 조사: 메커니즘, 영향 및 방어”, DOI 10.1109/JPROC.2016.2637878, Proceedings of the IEEE 105(8), 2017년 8월.
Barth, A., “HTTP 상태 관리 메커니즘”, RFC 6265, DOI 10.17487/RFC6265, 2011년 4월, <https://www.rfc-editor.org/info/rfc6265>.
[Err1912]
RFC 정오표, 정오표 ID 1912, RFC 2978, <https://www.rfc-editor.org/errata/eid1912>.
[Err5433]
RFC 정오표, 정오표 ID 5433, RFC 2978, <https://www.rfc-editor.org/errata/eid5433>.
[Georgiev]
Georgiev, M., Iyengar, S., Jana, S., Anubhai, R., Boneh, D. 및 V. Shmatikov, “세계에서 가장 위험한 코드: 비브라우저 소프트웨어에서 SSL 인증서 검증”, DOI 10.1145/2382196.2382204, 2012 ACM Conference on Computer and Communications Security (CCS '12) 논문집, pp. 38-49, 2012년 10월.
[HPACK]
Peon, R. 및 H. Ruellan, “HPACK: HTTP/2용 헤더 압축”, RFC 7541, DOI 10.17487/RFC7541, 2015년 5월, <https://www.rfc-editor.org/info/rfc7541>.
[HTTP/1.0]
Berners-Lee, T., Fielding, R. 및 H. Frystyk, “하이퍼텍스트 전송 프로토콜 -- HTTP/1.0”, RFC 1945, DOI 10.17487/RFC1945, 1996년 5월, <https://www.rfc-editor.org/info/rfc1945>.
[HTTP/1.1]
Fielding, R., 편집자, Nottingham, M., 편집자 및 J. Reschke, 편집자, “HTTP/1.1”, STD 99, RFC 9112, DOI 10.17487/RFC9112, 2022년 6월.
[HTTP/2]
Thomson, M., 편집자 및 C. Benfield, 편집자, “HTTP/2”, RFC 9113, DOI 10.17487/RFC9113, 2022년 6월, <https://www.rfc-editor.org/info/rfc9113>.
[HTTP/3]
Bishop, M., 편집자, “HTTP/3”, RFC 9114, DOI 10.17487/RFC9114, 2022년 6월, <https://www.rfc-editor.org/info/rfc9114>.
[ISO-8859-1]
International Organization for Standardization, “정보 기술 -- 8비트 단일 바이트 부호화 그래픽 문자 집합 -- 제1부: 라틴 알파벳 1번”, ISO/IEC 8859-1:1998, 1998.
[Kri2001]
Kristol, D., “HTTP 쿠키: 표준, 개인정보 보호 및 정치”, ACM Transactions on Internet Technology 1(2), 2001년 11월, <http://arxiv.org/abs/cs.SE/0105018>.
[OWASP]
Open Web Application Security Project, <https://www.owasp.org/>.
[REST]
Fielding, R., “아키텍처 스타일과 네트워크 기반 소프트웨어 아키텍처 설계”, 박사 학위 논문, University of California, Irvine, 2000년 9월, <https://roy.gbiv.com/pubs/dissertation/top.htm>.
[RFC1919]
Chatel, M., “고전적 IP 프록시와 투명 IP 프록시”, RFC 1919, DOI 10.17487/RFC1919, 1996년 3월, <https://www.rfc-editor.org/info/rfc1919>.
[RFC2047]
Moore, K., “MIME(다목적 인터넷 메일 확장) 제3부: 비 ASCII 텍스트용 메시지 헤더 확장”, RFC 2047, DOI 10.17487/RFC2047, 1996년 11월, <https://www.rfc-editor.org/info/rfc2047>.
[RFC2068]
Fielding, R., Gettys, J., Mogul, J., Frystyk, H. 및 T. Berners-Lee, “하이퍼텍스트 전송 프로토콜 -- HTTP/1.1”, RFC 2068, DOI 10.17487/RFC2068, 1997년 1월, <https://www.rfc-editor.org/info/rfc2068>.
[RFC2145]
Mogul, J., Fielding, R., Gettys, J. 및 H. Frystyk, “HTTP 버전 번호의 사용 및 해석”, RFC 2145, DOI 10.17487/RFC2145, 1997년 5월, <https://www.rfc-editor.org/info/rfc2145>.
[RFC2295]
Holtman, K. 및 A. Mutz, “HTTP의 투명 콘텐츠 협상”, RFC 2295, DOI 10.17487/RFC2295, 1998년 3월, <https://www.rfc-editor.org/info/rfc2295>.
[RFC2324]
Masinter, L., “하이퍼텍스트 커피 포트 제어 프로토콜(HTCPCP/1.0)”, RFC 2324, DOI 10.17487/RFC2324, 1998년 4월 1일 , <https://www.rfc-editor.org/info/rfc2324>.
[RFC2557]
Palme, J., Hopmann, A. 및 N. Shelness, “HTML(MHTML) 같은 집합 문서의 MIME 캡슐화”, RFC 2557, DOI 10.17487/RFC2557, 1999년 3월, <https://www.rfc-editor.org/info/rfc2557>.
[RFC2616]
Fielding, R., Gettys, J., Mogul, J., Frystyk, H., Masinter, L., Leach, P. 및 T. Berners-Lee, “하이퍼텍스트 전송 프로토콜 -- HTTP/1.1”, RFC 2616, DOI 10.17487/RFC2616, 1999년 6월, <https://www.rfc-editor.org/info/rfc2616>.
[RFC2617]
Franks, J., Hallam-Baker, P., Hostetler, J., Lawrence, S., Leach, P., Luotonen, A., 및 L. Stewart, “HTTP 인증: Basic 및 Digest 접근 인증”, RFC 2617, DOI 10.17487/RFC2617, 1999년 6월, <https://www.rfc-editor.org/info/rfc2617>.
[RFC2774]
Nielsen, H., Leach, P. 및 S. Lawrence, “HTTP 확장 프레임워크”, RFC 2774, DOI 10.17487/RFC2774, 2000년 2월, <https://www.rfc-editor.org/info/rfc2774>.
[RFC2818]
Rescorla, E., “TLS를 통한 HTTP”, RFC 2818, DOI 10.17487/RFC2818, 2000년 5월, <https://www.rfc-editor.org/info/rfc2818>.
[RFC2978]
Freed, N. 및 J. Postel, “IANA Charset 등록 절차”, BCP 19, RFC 2978, DOI 10.17487/RFC2978, 2000년 10월 , <https://www.rfc-editor.org/info/rfc2978>.
[RFC3040]
Cooper, I., Melve, I. 및 G. Tomlinson, “인터넷 웹 복제 및 캐싱 분류”, RFC 3040, DOI 10.17487/RFC3040, 2001년 1월 , <https://www.rfc-editor.org/info/rfc3040>.
[RFC3864]
Klyne, G., Nottingham, M. 및 J. Mogul, “메시지 헤더 필드 등록 절차”, BCP 90, RFC 3864, DOI 10.17487/RFC3864, 2004년 9월, <https://www.rfc-editor.org/info/rfc3864>.
[RFC3875]
Robinson, D. 및 K. Coar, “Common Gateway Interface(CGI) 버전 1.1”, RFC 3875, DOI 10.17487/RFC3875, 2004년 10월 , <https://www.rfc-editor.org/info/rfc3875>.
[RFC4033]
Arends, R., Austein, R., Larson, M., Massey, D. 및 S. Rose, “DNS 보안 소개 및 요구사항”, RFC 4033, DOI 10.17487/RFC4033, 2005년 3월, <https://www.rfc-editor.org/info/rfc4033>.
[RFC4559]
Jaganathan, K., Zhu, L. 및 J. Brezak, “Microsoft Windows의 SPNEGO 기반 Kerberos 및 NTLM HTTP 인증”, RFC 4559, DOI 10.17487/RFC4559, 2006년 6월, <https://www.rfc-editor.org/info/rfc4559>.
[RFC5789]
Dusseault, L. 및 J. Snell, “HTTP용 PATCH 메서드”, RFC 5789, DOI 10.17487/RFC5789, 2010년 3월, <https://www.rfc-editor.org/info/rfc5789>.
[RFC5905]
Mills, D., Martin, J., 편집자, Burbank, J. 및 W. Kasch, “네트워크 시간 프로토콜 버전 4: 프로토콜 및 알고리즘 사양”, RFC 5905, DOI 10.17487/RFC5905, 2010년 6월, <https://www.rfc-editor.org/info/rfc5905>.
[RFC6454]
Barth, A., “웹 오리진 개념”, RFC 6454, DOI 10.17487/RFC6454, 2011년 12월, <https://www.rfc-editor.org/info/rfc6454>.
[RFC6585]
Nottingham, M. 및 R. Fielding, “추가 HTTP 상태 코드”, RFC 6585, DOI 10.17487/RFC6585, 2012년 4월, <https://www.rfc-editor.org/info/rfc6585>.
[RFC7230]
Fielding, R., 편집자 및 J. Reschke, 편집자, “하이퍼텍스트 전송 프로토콜 (HTTP/1.1): 메시지 구문 및 라우팅”, RFC 7230, DOI 10.17487/RFC7230, 2014년 6월, <https://www.rfc-editor.org/info/rfc7230>.
[RFC7231]
Fielding, R., 편집자 및 J. Reschke, 편집자, “하이퍼텍스트 전송 프로토콜 (HTTP/1.1): 의미론 및 콘텐츠”, RFC 7231, DOI 10.17487/RFC7231, 2014년 6월, <https://www.rfc-editor.org/info/rfc7231>.
[RFC7232]
Fielding, R., 편집자 및 J. Reschke, 편집자, “하이퍼텍스트 전송 프로토콜 (HTTP/1.1): 조건부 요청”, RFC 7232, DOI 10.17487/RFC7232, 2014년 6월, <https://www.rfc-editor.org/info/rfc7232>.
[RFC7233]
Fielding, R., 편집자, Lafon, Y., 편집자 및 J. Reschke, 편집자, “하이퍼텍스트 전송 프로토콜 (HTTP/1.1): 범위 요청”, RFC 7233, DOI 10.17487/RFC7233, 2014년 6월, <https://www.rfc-editor.org/info/rfc7233>.
[RFC7234]
Fielding, R., 편집자, Nottingham, M., 편집자 및 J. Reschke, 편집자, “하이퍼텍스트 전송 프로토콜 (HTTP/1.1): 캐싱”, RFC 7234, DOI 10.17487/RFC7234, 2014년 6월, <https://www.rfc-editor.org/info/rfc7234>.
[RFC7235]
Fielding, R., 편집자 및 J. Reschke, 편집자, “하이퍼텍스트 전송 프로토콜 (HTTP/1.1): 인증”, RFC 7235, DOI 10.17487/RFC7235, 2014년 6월, <https://www.rfc-editor.org/info/rfc7235>.
[RFC7538]
Reschke, J., “하이퍼텍스트 전송 프로토콜 상태 코드 308(영구 리디렉션)”, RFC 7538, DOI 10.17487/RFC7538, 2015년 4월, <https://www.rfc-editor.org/info/rfc7538>.
[RFC7540]
Belshe, M., Peon, R. 및 M. Thomson, 편집자, “하이퍼텍스트 전송 프로토콜 버전 2(HTTP/2)”, RFC 7540, DOI 10.17487/RFC7540, 2015년 5월, <https://www.rfc-editor.org/info/rfc7540>.
[RFC7578]
Masinter, L., “양식에서 값 반환: multipart/form-data”, RFC 7578, DOI 10.17487/RFC7578, 2015년 7월, <https://www.rfc-editor.org/info/rfc7578>.
[RFC7615]
Reschke, J., “HTTP Authentication-Info 및 Proxy-Authentication-Info 응답 헤더 필드”, RFC 7615, DOI 10.17487/RFC7615, 2015년 9월, <https://www.rfc-editor.org/info/rfc7615>.
[RFC7616]
Shekh-Yusef, R., 편집자, Ahrens, D. 및 S. Bremer, “HTTP Digest 접근 인증”, RFC 7616, DOI 10.17487/RFC7616, 2015년 9월, <https://www.rfc-editor.org/info/rfc7616>.
[RFC7617]
Reschke, J., “'Basic' HTTP 인증 스킴”, RFC 7617, DOI 10.17487/RFC7617, 2015년 9월 , <https://www.rfc-editor.org/info/rfc7617>.
[RFC7694]
Reschke, J., “하이퍼텍스트 전송 프로토콜(HTTP) 클라이언트 주도 Content-Encoding”, RFC 7694, DOI 10.17487/RFC7694, 2015년 11월 , <https://www.rfc-editor.org/info/rfc7694>.
[RFC8126]
Cotton, M., Leiba, B. 및 T. Narten, “RFC에서 IANA 고려사항 절을 작성하기 위한 지침”, BCP 26, RFC 8126, DOI 10.17487/RFC8126, 2017년 6월, <https://www.rfc-editor.org/info/rfc8126>.
[RFC8187]
Reschke, J., “HTTP 헤더 필드 매개변수의 문자 인코딩 및 언어 표시”, RFC 8187, DOI 10.17487/RFC8187, 2017년 9월 , <https://www.rfc-editor.org/info/rfc8187>.
[RFC8246]
McManus, P., “HTTP 불변 응답”, RFC 8246, DOI 10.17487/RFC8246, 2017년 9월, <https://www.rfc-editor.org/info/rfc8246>.
[RFC8288]
Nottingham, M., “웹 링크”, RFC 8288, DOI 10.17487/RFC8288, 2017년 10월, <https://www.rfc-editor.org/info/rfc8288>.
[RFC8336]
Nottingham, M. 및 E. Nygren, “ORIGIN HTTP/2 프레임”, RFC 8336, DOI 10.17487/RFC8336, 2018년 3월, <https://www.rfc-editor.org/info/rfc8336>.
[RFC8615]
Nottingham, M., “Well-Known URI(Uniform Resource Identifier)”, RFC 8615, DOI 10.17487/RFC8615, 2019년 5월, <https://www.rfc-editor.org/info/rfc8615>.
[RFC8941]
Nottingham, M. 및 P-H. Kamp, “HTTP용 구조화 필드 값”, RFC 8941, DOI 10.17487/RFC8941, 2021년 2월, <https://www.rfc-editor.org/info/rfc8941>.
[Sniffing]
WHATWG, “MIME 스니핑”, <https://mimesniff.spec.whatwg.org>.
[WEBDAV]
Dusseault, L., 편집자, “웹 분산 작성 및 버전 관리를 위한 HTTP 확장(WebDAV)”, RFC 4918, DOI 10.17487/RFC4918, 2007년 6월, <https://www.rfc-editor.org/info/rfc4918>.

부록 A. 수집된 ABNF

아래에 수집된 ABNF에서는 목록 규칙이 5.6.1절에 따라 확장되어 있습니다.

Accept = [ ( media-range [ weight ] ) *( OWS "," OWS ( media-range [
 weight ] ) ) ]
Accept-Charset = [ ( ( token / "*" ) [ weight ] ) *( OWS "," OWS ( (
 token / "*" ) [ weight ] ) ) ]
Accept-Encoding = [ ( codings [ weight ] ) *( OWS "," OWS ( codings [
 weight ] ) ) ]
Accept-Language = [ ( language-range [ weight ] ) *( OWS "," OWS (
 language-range [ weight ] ) ) ]
Accept-Ranges = acceptable-ranges
Allow = [ method *( OWS "," OWS method ) ]
Authentication-Info = [ auth-param *( OWS "," OWS auth-param ) ]
Authorization = credentials

BWS = OWS

Connection = [ connection-option *( OWS "," OWS connection-option )
 ]
Content-Encoding = [ content-coding *( OWS "," OWS content-coding )
 ]
Content-Language = [ language-tag *( OWS "," OWS language-tag ) ]
Content-Length = 1*DIGIT
Content-Location = absolute-URI / partial-URI
Content-Range = range-unit SP ( range-resp / unsatisfied-range )
Content-Type = media-type

Date = HTTP-date

ETag = entity-tag
Expect = [ expectation *( OWS "," OWS expectation ) ]

From = mailbox

GMT = %x47.4D.54 ; GMT

HTTP-date = IMF-fixdate / obs-date
Host = uri-host [ ":" port ]

IMF-fixdate = day-name "," SP date1 SP time-of-day SP GMT
If-Match = "*" / [ entity-tag *( OWS "," OWS entity-tag ) ]
If-Modified-Since = HTTP-date
If-None-Match = "*" / [ entity-tag *( OWS "," OWS entity-tag ) ]
If-Range = entity-tag / HTTP-date
If-Unmodified-Since = HTTP-date

Last-Modified = HTTP-date
Location = URI-reference

Max-Forwards = 1*DIGIT

OWS = *( SP / HTAB )

Proxy-Authenticate = [ challenge *( OWS "," OWS challenge ) ]
Proxy-Authentication-Info = [ auth-param *( OWS "," OWS auth-param )
 ]
Proxy-Authorization = credentials

RWS = 1*( SP / HTAB )
Range = ranges-specifier
Referer = absolute-URI / partial-URI
Retry-After = HTTP-date / delay-seconds

Server = product *( RWS ( product / comment ) )

TE = [ t-codings *( OWS "," OWS t-codings ) ]
Trailer = [ field-name *( OWS "," OWS field-name ) ]

URI-reference = <URI-reference, see [URI], Section 4.1>
Upgrade = [ protocol *( OWS "," OWS protocol ) ]
User-Agent = product *( RWS ( product / comment ) )

Vary = [ ( "*" / field-name ) *( OWS "," OWS ( "*" / field-name ) )
 ]
Via = [ ( received-protocol RWS received-by [ RWS comment ] ) *( OWS
 "," OWS ( received-protocol RWS received-by [ RWS comment ] ) ) ]

WWW-Authenticate = [ challenge *( OWS "," OWS challenge ) ]

absolute-URI = <absolute-URI, see [URI], Section 4.3>
absolute-path = 1*( "/" segment )
acceptable-ranges = range-unit *( OWS "," OWS range-unit )
asctime-date = day-name SP date3 SP time-of-day SP year
auth-param = token BWS "=" BWS ( token / quoted-string )
auth-scheme = token
authority = <authority, see [URI], Section 3.2>

challenge = auth-scheme [ 1*SP ( token68 / [ auth-param *( OWS ","
 OWS auth-param ) ] ) ]
codings = content-coding / "identity" / "*"
comment = "(" *( ctext / quoted-pair / comment ) ")"
complete-length = 1*DIGIT
connection-option = token
content-coding = token
credentials = auth-scheme [ 1*SP ( token68 / [ auth-param *( OWS ","
 OWS auth-param ) ] ) ]
ctext = HTAB / SP / %x21-27 ; '!'-'''
 / %x2A-5B ; '*'-'['
 / %x5D-7E ; ']'-'~'
 / obs-text

date1 = day SP month SP year
date2 = day "-" month "-" 2DIGIT
date3 = month SP ( 2DIGIT / ( SP DIGIT ) )
day = 2DIGIT
day-name = %x4D.6F.6E ; Mon
 / %x54.75.65 ; Tue
 / %x57.65.64 ; Wed
 / %x54.68.75 ; Thu
 / %x46.72.69 ; Fri
 / %x53.61.74 ; Sat
 / %x53.75.6E ; Sun
day-name-l = %x4D.6F.6E.64.61.79 ; Monday
 / %x54.75.65.73.64.61.79 ; Tuesday
 / %x57.65.64.6E.65.73.64.61.79 ; Wednesday
 / %x54.68.75.72.73.64.61.79 ; Thursday
 / %x46.72.69.64.61.79 ; Friday
 / %x53.61.74.75.72.64.61.79 ; Saturday
 / %x53.75.6E.64.61.79 ; Sunday
delay-seconds = 1*DIGIT

entity-tag = [ weak ] opaque-tag
etagc = "!" / %x23-7E ; '#'-'~'
 / obs-text
expectation = token [ "=" ( token / quoted-string ) parameters ]

field-content = field-vchar [ 1*( SP / HTAB / field-vchar )
 field-vchar ]
field-name = token
field-value = *field-content
field-vchar = VCHAR / obs-text
first-pos = 1*DIGIT

hour = 2DIGIT
http-URI = "http://" authority path-abempty [ "?" query ]
https-URI = "https://" authority path-abempty [ "?" query ]

incl-range = first-pos "-" last-pos
int-range = first-pos "-" [ last-pos ]

language-range = <language-range, see [RFC4647], Section 2.1>
language-tag = <Language-Tag, see [RFC5646], Section 2.1>
last-pos = 1*DIGIT

mailbox = <mailbox, see [RFC5322], Section 3.4>
media-range = ( "*/*" / ( type "/*" ) / ( type "/" subtype ) )
 parameters
media-type = type "/" subtype parameters
method = token
minute = 2DIGIT
month = %x4A.61.6E ; Jan
 / %x46.65.62 ; Feb
 / %x4D.61.72 ; Mar
 / %x41.70.72 ; Apr
 / %x4D.61.79 ; May
 / %x4A.75.6E ; Jun
 / %x4A.75.6C ; Jul
 / %x41.75.67 ; Aug
 / %x53.65.70 ; Sep
 / %x4F.63.74 ; Oct
 / %x4E.6F.76 ; Nov
 / %x44.65.63 ; Dec

obs-date = rfc850-date / asctime-date
obs-text = %x80-FF
opaque-tag = DQUOTE *etagc DQUOTE
other-range = 1*( %x21-2B ; '!'-'+'
 / %x2D-7E ; '-'-'~'
 )

parameter = parameter-name "=" parameter-value
parameter-name = token
parameter-value = ( token / quoted-string )
parameters = *( OWS ";" OWS [ parameter ] )
partial-URI = relative-part [ "?" query ]
path-abempty = <path-abempty, see [URI], Section 3.3>
port = <port, see [URI], Section 3.2.3>
product = token [ "/" product-version ]
product-version = token
protocol = protocol-name [ "/" protocol-version ]
protocol-name = token
protocol-version = token
pseudonym = token

qdtext = HTAB / SP / "!" / %x23-5B ; '#'-'['
 / %x5D-7E ; ']'-'~'
 / obs-text
query = <query, see [URI], Section 3.4>
quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text )
quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE
qvalue = ( "0" [ "." *3DIGIT ] ) / ( "1" [ "." *3"0" ] )

range-resp = incl-range "/" ( complete-length / "*" )
range-set = range-spec *( OWS "," OWS range-spec )
range-spec = int-range / suffix-range / other-range
range-unit = token
ranges-specifier = range-unit "=" range-set
received-by = pseudonym [ ":" port ]
received-protocol = [ protocol-name "/" ] protocol-version
relative-part = <relative-part, see [URI], Section 4.2>
rfc850-date = day-name-l "," SP date2 SP time-of-day SP GMT

second = 2DIGIT
segment = <segment, see [URI], Section 3.3>
subtype = token
suffix-length = 1*DIGIT
suffix-range = "-" suffix-length

t-codings = "trailers" / ( transfer-coding [ weight ] )
tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." /
 "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA
time-of-day = hour ":" minute ":" second
token = 1*tchar
token68 = 1*( ALPHA / DIGIT / "-" / "." / "_" / "~" / "+" / "/" )
 *"="
transfer-coding = token *( OWS ";" OWS transfer-parameter )
transfer-parameter = token BWS "=" BWS ( token / quoted-string )
type = token

unsatisfied-range = "*/" complete-length
uri-host = <host, see [URI], Section 3.2.2>

weak = %x57.2F ; W/
weight = OWS ";" OWS "q=" qvalue

year = 4DIGIT

부록 B. 이전 RFC에서의 변경 사항

B.1. RFC 2818에서의 변경 사항

없습니다.

B.2. RFC 7230에서의 변경 사항

HTTP의 설계 목표, 역사, 아키텍처, 적합성 기준, 프로토콜 버전 관리, URI, 메시지 라우팅 및 헤더 필드를 소개하는 절이 여기로 이동되었습니다.

의미론적 적합성에 관한 요구사항은 구현별 실패를 무시하거나 우회할 수 있는 허용으로 대체되었습니다. (2.2절)

오리진과 오리진 서버에 대한 권위 있는 접근의 설명이 "http" 및 "https" URI 모두에 대해 확장되어 대체 서비스와 반드시 TCP에 기반하지 않는 보호된 연결을 고려합니다. (4.2.1절, 4.2.2절, 4.3.1절, 및 7.3.3절)

대상 URI 스킴의 의미론을 확인하고 관련 요구사항을 충족하지 않는 요청을 거부하도록 하는 명시적 요구사항이 추가되었습니다. (7.4절)

미디어 유형, 미디어 범위 및 기대 사항의 매개변수는 하나 이상의 후행 세미콜론을 통해 비어 있을 수 있습니다. (5.6.6절)

"필드 값"은 이제 여러 필드 라인이 쉼표로 결합된 뒤의 값을 의미합니다 — 가장 일반적인 사용 방식입니다. 단일 헤더 라인의 값을 가리킬 때는 "필드 라인 값"을 사용합니다. (6.3절)

트레일러 필드 의미론은 이제 청크 전송 코딩의 세부 사항을 넘어섭니다. 트레일러 필드의 사용은 송신자가 해당 필드가 그러한 사용을 정의한다는 것을 아는 경우에만 트레일러 필드로 생성할 수 있도록 추가로 제한되었으며, 수신자가 대응하는 필드 정의가 병합을 허용하고 방법을 정의한다는 것을 아는 경우에만 헤더 섹션으로 병합할 수 있도록 제한되었습니다. 그 밖의 모든 경우 구현은 트레일러 필드를 병합하는 대신 별도로 저장하거나 버리는 것이 권장됩니다. (6.5.1절)

오리진 서버에서 요청 URI의 절대 형식을 Host 헤더 필드보다 우선하는 규칙이 프록시 처리와 일치하도록 명시되었습니다. (7.2절)

Via 필드의 "received-by" 문법 정의는 host에 관한 URI 문법 변경 때문에 RFC 7230에서 확장되었지만 [URI]의 변경 사항은 Via에는 바람직하지 않습니다. 단순화를 위해 uri-host는 기존 pseudonym 문법으로 포괄할 수 있으므로 received-by 생성식에서 제거했습니다. 특히 이 변경으로 received-by의 host 이름에 허용되는 문자 집합에서 쉼표가 제거되었습니다. (7.6.3절)

B.3. RFC 7231에서의 변경 사항

구현이 지원해야 하는 최소 URI 길이가 이제 권장됩니다. (4.1절)

다음 사항이 명확해졌습니다. 필드 값의 CR과 NUL은 거부하거나 SP로 매핑해야 하며, 필드 값을 사용하기 전에 선행 및 후행 공백을 제거해야 합니다. (5.5절)

미디어 유형, 미디어 범위 및 기대 사항의 매개변수는 하나 이상의 후행 세미콜론을 통해 비어 있을 수 있습니다. (5.6.6절)

HTTP 메시지를 위한 추상 데이터 유형이 도입되어 HTTP/1.1의 특정 구문 형식이 아니라 여러 HTTP 버전에 걸친 추상화로서 메시지 구성요소와 그 의미론을 정의하고 [HTTP/1.1]의 내용을 메시지가 구문 분석된 뒤의 콘텐츠에 반영합니다. 이를 통해 콘텐츠에 대한 요구사항(무엇을 전달하는지)과 메시징 구문에 대한 요구사항(어떻게 전달하는지)을 더 쉽게 구별하고 초기 프로토콜 버전의 제한이 HTTP의 미래에 고정되는 것을 방지합니다. (6절)

"payload" 및 "payload body"라는 용어를 "content"로 대체하여 다른 곳의 사용 (예: 필드 이름)과 더 잘 맞추고 HTTP/2 및 HTTP/3의 프레임 payload와 혼동하지 않도록 했습니다. (6.4절)

"유효 요청 URI"라는 용어를 "대상 URI"로 대체했습니다. (7.1절)

클라이언트 재시도에 대한 제한을 구현 동작을 반영하도록 완화했습니다. (9.2.2절)

GET, HEAD 및 DELETE의 요청 본문이 상호운용되지 않는다는 사실을 명확히 했습니다. (9.3.1절, 9.3.2절 및 9.3.5절)

PUT의 요청 수정자로 Content-Range 헤더 필드(14.4절)를 사용하는 것이 허용됩니다. (9.3.4절)

Content-Length 설정에 관한 불필요한 요구사항이 OPTIONS 메서드 설명에서 제거되었습니다. (9.3.7절)

TRACE 응답에서 "message/http" 미디어 유형을 사용해야 한다는 규범적 요구사항이 제거되었습니다. (9.3.8절)

RFC 2616과의 호환성을 위해 Expect의 목록 기반 문법이 복원되었습니다. (10.1.1절)

Accept 및 Accept-Encoding은 응답 메시지에서 허용됩니다. 후자는 [RFC7694]에서 도입되었습니다. (12.3절)

"Accept Parameters"(accept-params 및 accept-ext ABNF 생성식)가 Accept 필드 정의에서 제거되었습니다. (12.5.1절)

Accept-Charset 필드는 이제 폐기되었습니다. (12.5.2절)

다른 값이 존재할 때 Vary 헤더 필드의 "*" 의미론이 명확해졌습니다. (12.5.5절)

범위 단위는 대소문자를 구분하지 않고 비교합니다. (14.1절)

Accept-Ranges 필드의 사용은 오리진 서버로 제한되지 않습니다. (14.3절)

리디렉션된 요청을 만드는 과정이 명확해졌습니다. (15.4절)

상태 코드 308(이전에 [RFC7538]에서 정의됨)이 상태 코드 301, 302 및 307에 더 가깝게 정의되도록 추가되었습니다. (15.4.9절)

상태 코드 421(이전에 [RFC7540]의 9.1.2절에서 정의됨)은 일반적인 적용 가능성 때문에 추가되었습니다. 응답은 대상 리소스가 아니라 연결에 특화되므로 421은 더 이상 휴리스틱하게 캐시 가능한 것으로 정의되지 않습니다. (15.5.20절)

상태 코드 422(이전에 [WEBDAV]의 11.2절에서 정의됨)는 일반적인 적용 가능성 때문에 추가되었습니다. (15.5.21절)

B.4. RFC 7232에서의 변경 사항

이전 HTTP 개정판은 Date와 Last-Modified 값이 서로 다른 시계에서 생성되거나 응답 준비 중 약간 다른 시점에 생성될 가능성에 대비하기 위해 Last-Modified가 강한 검증자인지 판단하는 데 임의의 60초 제한을 두었습니다. 이 사양에서는 합리적인 재량을 허용하도록 이를 완화했습니다. (8.8.2.2절)

If-Match 및 If-Unmodified-Since의 예외적인 요구사항 중 변경 요청이 이미 적용되어 검증이 실패한 경우 2xx 응답에서 검증자를 전송하지 않도록 요구했던 내용이 제거되었습니다. (13.1.1절 및 13.1.4절)

If-Unmodified-Since는 수정 시간이라는 개념이 없는 리소스에는 적용되지 않는다는 사실이 명확해졌습니다. (13.1.4절)

사전 조건은 응답이 그렇지 않았다면 성공했을 때까지 기다리는 대신 이제 요청 콘텐츠를 처리하기 전에 평가할 수 있습니다. (13.2절)

B.5. RFC 7233에서의 변경 사항

range-unit 및 ranges-specifier 문법을 리팩터링하여 bytes와 다른 (확장) 범위 단위 사이의 인위적 구분을 단순화하고 줄였으며, 범위 단위를 일반적으로 token으로 정의하고 확장을 range-spec(other-range)의 범위 안에 배치하여 other-range-unit의 중복 문법을 제거했습니다. 이는 확장 범위 단위를 포함한 모든 범위 집합에서 둘 이상의 범위로 구성된 range-set을 나타내는 목록 구문(쉼표)의 역할을 명확하게 합니다. 확장 문법을 범위 지정자로 이동하면 바이트 범위에 특화된 프로토콜도 별도로 지정할 수 있습니다.

이제 확장 메서드에 Range 처리를 정의할 수 있습니다. (14.2절)

부분 PUT을 수행하기 위한 요청 수정자로 Content-Range 헤더 필드(14.4절)를 사용하는 방법을 설명했습니다. (14.5절)

B.6. RFC 7235에서의 변경 사항

없습니다.

B.7. RFC 7538에서의 변경 사항

없습니다.

B.8. RFC 7615에서의 변경 사항

없습니다.

B.9. RFC 7694에서의 변경 사항

이 사양에는 [RFC7694]에서 정의된 확장이 포함되지만 예제와 배포 고려사항은 제외합니다.

감사의 말

현재 편집자 외에도 다음 인물들은 HTTP의 초기 측면과 핵심 사양에 기여한 공로로 특별히 인정받을 만합니다: Marc Andreessen, Tim Berners-Lee, Robert Cailliau, Daniel W. Connolly, Bob Denny, John Franks, Jim Gettys, Jean-François Groff, Phillip M. Hallam-Baker, Koen Holtman, Jeffery L. Hostetler, Shel Kaphan, Dave Kristol, Yves Lafon, Scott D. Lawrence, Paul J. Leach, Håkon W. Lie, Ari Luotonen, Larry Masinter, Rob McCool, Jeffrey C. Mogul, Lou Montulli, David Morris, Henrik Frystyk Nielsen, Dave Raggett, Eric Rescorla, Tony Sanders, Lawrence C. Stewart, Marc VanHeyningen 및 Steve Zilles.

이 문서는 다음을 포함하여 과거 HTTP 사양에 반영된 수많은 기여를 바탕으로 합니다. [HTTP/1.0], [RFC2068], [RFC2145], [RFC2616], [RFC2617], [RFC2818], [RFC7230], [RFC7231], [RFC7232], [RFC7233], [RFC7234] 및 [RFC7235]. 해당 문서의 감사의 말도 여전히 적용됩니다.

2014년 이후 다음 기여자들은 버그를 보고하고 좋은 질문을 하며, 텍스트를 작성하거나 검토하고, 이슈를 평가하여 이 사양을 개선하는 데 도움을 주었습니다:

Alan Egerton, Alex Rousskov, Amichai Rothman, Amos Jeffries, Anders Kaseorg, Andreas Gebhardt, Anne van Kesteren, Armin Abfalterer, Aron Duby, Asanka Herath, Asbjørn Ulsberg, Asta Olofsson, Attila Gulyas, Austin Wright, Barry Pollard, Ben Burkert, Benjamin Kaduk, Björn Höhrmann, Brad Fitzpatrick, Chris Pacejo, Colin Bendell, Cory Benfield, Cory Nelson, Daisuke Miyakawa, Dale Worley, Daniel Stenberg, Danil Suits, David Benjamin, David Matson, David Schinazi, Дилян Палаузов (Dilyan Palauzov), Eric Anderson, Eric Rescorla, Éric Vyncke, Erik Kline, Erwin Pe, Etan Kissling, Evert Pot, Evgeny Vrublevsky, Florian Best, Francesca Palombini, Igor Lubashev, James Callahan, James Peach, Jeffrey Yasskin, Kalin Gyokov, Kannan Goundan, 奥 一穂 (Kazuho Oku), Ken Murchison, Krzysztof Maczyński, Lars Eggert, Lucas Pardue, Martin Duke, Martin Dürst, Martin Thomson, Martynas Jusevičius, Matt Menke, Matthias Pigulla, Mattias Grenfeldt, Michael Osipov, Mike Bishop, Mike Pennisi, Mike Taylor, Mike West, Mohit Sethi, Murray Kucherawy, Nathaniel J. Smith, Nicholas Hurley, Nikita Prokhorov, Patrick McManus, Piotr Sikora, Poul-Henning Kamp, Rick van Rein, Robert Wilton, Roberto Polli, Roman Danyliw, Samuel Williams, Semyon Kholodnov, Simon Pieters, Simon Schüppel, Stefan Eissing, Taylor Hunt, Todd Greer, Tommy Pauly, Vasiliy Faronov, Vladimir Lashchev, Wenbo Zhu, William A. Rowe Jr., Willy Tarreau, Xingwei Liu, Yishuai Li 및 Zaheduzzaman Sarker.

색인

1 2 3 4 5 A B C D E F G H I K L M N O P R S T U V W X

저자 주소

Roy T. Fielding (편집자)
Adobe
345 Park Ave
San Jose, CA 95110
미국
이메일: fielding@gbiv.com
URI: https://roy.gbiv.com/
Mark Nottingham (편집자)
Fastly
Prahran
호주
이메일: mnot@mnot.net
URI: https://www.mnot.net/
Julian Reschke (편집자)
greenbytes GmbH
Hafenweg 16
48155 Münster
독일
이메일: julian.reschke@greenbytes.de
URI: https://greenbytes.de/tech/webdav/