패치

현행 표준 — 마지막 갱신

참여:
GitHub whatwg/fetch (새 이슈, 열린 이슈)
Matrix에서 채팅
커밋:
GitHub whatwg/fetch/commits
이 커밋 기준 스냅샷
@fetchstandard
테스트:
web-platform-tests fetch/ (진행 중 작업)
번역 (비규범적):
日本語
简体中文
한국어

요약

패치 표준은 요청, 응답, 그리고 이를 연결하는 과정인 패칭을 정의합니다.

목표

이 표준의 목표는 웹 플랫폼 전반에 걸쳐 패칭을 통합하고, 이에 관련된 모든 것에 대해 일관된 처리를 제공하는 것입니다. 여기에는 다음이 포함됩니다:

이를 위해 HTTP `Origin` 헤더 의미를 원래 The Web Origin Concept에서 정의했던 것보다 대체합니다. [ORIGIN]

1. 서문

상위 관점에서 리소스를 패칭하는 것은 꽤 단순한 작업입니다. 요청이 들어가고, 응답이 나옵니다. 하지만 그 작업의 세부사항은 매우 복잡하며, 예전에는 명확하게 문서화되지 않았고 API마다 다르게 동작했습니다.

수많은 API가 리소스를 패치하는 기능을 제공합니다. 예를 들면 HTML의 imgscript 요소, CSS의 cursorlist-style-image, navigator.sendBeacon()self.importScripts() 같은 JavaScript API들이 있습니다. 패치 표준은 이러한 기능들을 위한 통합된 아키텍처를 제공하여, 리디렉션 및 CORS 프로토콜 등 패칭의 다양한 측면에서 모두 일관성을 갖도록 합니다.

패치 표준은 또한 fetch() JavaScript API를 정의하며, 이는 대부분의 네트워킹 기능을 비교적 낮은 추상화 수준에서 노출합니다.

2. 인프라스트럭처

이 명세는 Infra 표준에 의존합니다. [INFRA]

이 명세는 ABNF, Encoding, HTML, HTTP, MIME Sniffing, Streams, URL, Web IDL, WebSockets의 용어를 사용합니다. [ABNF] [ENCODING] [HTML] [HTTP] [MIMESNIFF] [STREAMS] [URL] [WEBIDL] [WEBSOCKETS]

ABNF는 HTTP에서 확장된 ABNF(특히 #의 추가)와 RFC 7405를 의미합니다. [RFC7405]


인증 정보(Credentials)는 HTTP 쿠키, TLS 클라이언트 인증서, 그리고 인증 항목(HTTP 인증용)입니다. [COOKIES] [TLS] [HTTP]


fetch paramsstruct로, fetch 알고리즘에서 부기 용도로 사용됩니다. 다음과 같은 항목을 가집니다:

request
request.
요청 본문 청크 길이 처리 (기본값 null)
process request end-of-body (기본값 null)
process early hints response (기본값 null)
process response (기본값 null)
process response end-of-body (기본값 null)
process response consume body (기본값 null)
Null 또는 알고리즘.
task destination (기본값 null)
Null, global object, 또는 parallel queue.
cross-origin isolated capability (기본값 false)
불리언 값.
controller (기본값 새 fetch controller)
fetch controller.
timing info
fetch timing info.
preloaded response candidate (기본값 null)
Null, "pending", 또는 response.

fetch controllerstruct로, fetch 호출자가 시작 후 특정 작업을 수행할 수 있도록 합니다. 다음과 같은 항목을 가집니다:

state (기본값 "ongoing")
"ongoing", "terminated", 또는 "aborted"
full timing info (기본값 null)
Null 또는 fetch timing info.
report timing steps (기본값 null)
Null 또는 global object를 인자로 받는 알고리즘.
serialized abort reason (기본값 null)
Null 또는 Record (StructuredSerialize 결과).
next manual redirect steps (기본값 null)
Null 또는 인자를 받지 않는 알고리즘.

특정 fetch controller controller에 대해 타이밍 보고(report timing)를 하려면, global object global을 받아 다음을 실행합니다:

  1. Assert: controllerreport timing steps가 null이 아님을 확인합니다.

  2. controllerreport timing stepsglobal과 함께 호출합니다.

특정 fetch controller controller에 대해 다음 수동 리디렉트 처리를 하려면:

  1. Assert: controllernext manual redirect steps가 null이 아님을 확인합니다.

  2. controllernext manual redirect steps를 호출합니다.

fetch controller controller에 대해 전체 타이밍 정보 추출을 하려면:

  1. Assert: controllerfull timing info가 null이 아님을 확인합니다.

  2. controllerfull timing info를 반환합니다.

특정 fetch controller controller에 대해 선택적 error와 함께 abort 하려면:

  1. controllerstate를 "aborted"로 설정합니다.

  2. fallbackError를 "AbortError" DOMException으로 둡니다.

  3. error가 주어지지 않았다면 fallbackError로 설정합니다.

  4. serializedErrorStructuredSerialize(error)로 둡니다. 예외가 발생하면 serializedErrorStructuredSerialize(fallbackError)로 둡니다.

  5. controllerserialized abort reasonserializedError로 설정합니다.

null 또는 Record abortReasonrealm realm이 주어졌을 때 serialize된 abort reason 역직렬화는 다음과 같습니다:

  1. fallbackError를 "AbortError" DOMException으로 둡니다.

  2. deserializedErrorfallbackError로 둡니다.

  3. abortReason이 null이 아니면, deserializedErrorStructuredDeserialize(abortReason, realm)로 둡니다. 예외가 발생하거나 undefined를 반환하면 deserializedErrorfallbackError로 둡니다.

  4. deserializedError를 반환합니다.

fetch controller controller종료(terminate)하려면, controllerstate를 "terminated"로 설정합니다.

fetch params fetchParams는, 그 controllerstate가 "aborted"일 때 중단(aborted) 상태입니다.

fetch params fetchParams는, 그 controllerstate가 "aborted" 또는 "terminated"일 때 취소(canceled) 상태입니다.

fetch timing infostruct로, Resource TimingNavigation Timing에 필요한 타이밍 정보를 유지합니다. 다음의 항목을 가집니다: [RESOURCE-TIMING] [NAVIGATION-TIMING]

start time (기본값 0)
redirect start time (기본값 0)
redirect end time (기본값 0)
post-redirect start time (기본값 0)
final service worker start time (기본값 0)
final network-request start time (기본값 0)
first interim network-response start time (기본값 0)
final network-response start time (기본값 0)
end time (기본값 0)
DOMHighResTimeStamp.
final connection timing info (기본값 null)
Null 또는 connection timing info.
server-timing headers (기본값 « »)
문자열의 list.
render-blocking (기본값 false)
불리언 값.

response body infostruct로, Resource TimingNavigation Timing에 필요한 정보를 유지합니다. 다음의 항목을 가집니다: [RESOURCE-TIMING] [NAVIGATION-TIMING]

encoded size (기본값 0)
decoded size (기본값 0)
숫자.
content type (기본값 빈 문자열)
ASCII 문자열.
content encoding (기본값 빈 문자열)
ASCII 문자열.

fetch timing info timingInfo가 주어졌을 때 불투명 타이밍 정보 생성은, timingInfostart timepost-redirect start timetimingInfostart time인 새로운 fetch timing info를 반환합니다.

알고리즘 algorithm, global object 또는 parallel queue taskDestination이 주어졌을 때 fetch 태스크 큐잉(queue a fetch task)은 다음과 같이 실행합니다:

  1. taskDestinationparallel queue라면, enqueue algorithmtaskDestination에 추가합니다.

  2. 그렇지 않으면, 글로벌 태스크(global task)networking task sourcetaskDestinationalgorithm으로 큐잉합니다.


정수 직렬화(serialize an integer)란, 정수를 가능한 가장 짧은 십진수 문자열로 표현하는 것입니다.

이 부분은 Infra에서 더 자세한 알고리즘으로 교체될 예정입니다. infra/201 참고.

2.1. URL

로컬 스킴(local scheme)은 "about", "blob", 또는 "data"입니다.

URL로컬임(is local)은 해당 스킴로컬 스킴일 때입니다.

이 정의는 Referrer Policy에서도 사용됩니다. [REFERRER]

HTTP(S) 스킴은 "http" 또는 "https"입니다.

패치 스킴(fetch scheme)은 "about", "blob", "data", "file", 또는 HTTP(S) 스킴입니다.

HTTP(S) 스킴패치 스킴 역시 HTML에서 사용됩니다. [HTML]

2.2. HTTP

패칭은 HTTP에만 국한되지 않지만, HTTP에서 여러 개념을 차용하여 다른 방식(예: data URL)으로 획득한 리소스에도 적용합니다.

HTTP 탭 또는 공백(HTTP tab or space)은 U+0009 TAB 또는 U+0020 SPACE입니다.

HTTP 공백(HTTP whitespace)은 U+000A LF, U+000D CR, 또는 HTTP 탭 또는 공백입니다.

HTTP 공백은 HTTP 헤더 맥락 이외에서 재사용되는 특정 구조에만 유용합니다(예: MIME 타입). HTTP 헤더 값에는 HTTP 탭 또는 공백 사용을 권장하며, 그 외 맥락에서는 ASCII 공백을 권장합니다. ASCII 공백과 달리 U+000C FF는 제외됩니다.

HTTP 줄바꿈 바이트(HTTP newline byte)는 0x0A (LF) 또는 0x0D (CR)입니다.

HTTP 탭 또는 공백 바이트(HTTP tab or space byte)는 0x09 (HT) 또는 0x20 (SP)입니다.

HTTP 공백 바이트(HTTP whitespace byte)HTTP 줄바꿈 바이트 또는 HTTP 탭 또는 공백 바이트입니다.

HTTP 따옴표 문자열 수집(collect an HTTP quoted string) 을 하려면 문자열(string) input, 위치 변수(position variable) position, 선택적 불리언 extract-value (기본값 false)가 주어졌을 때 다음을 수행합니다:

  1. positionStartposition으로 둡니다.

  2. value를 빈 문자열로 둡니다.

  3. Assert: inputposition에 있는 코드 포인트가 U+0022 (")임을 확인합니다.

  4. position을 1만큼 증가시킵니다.

  5. 다음이 참인 동안:

    1. U+0022 (") 또는 U+005C (\)가 아닌 코드 포인트 시퀀스 수집 결과를 input, position으로부터 value에 추가합니다.

    2. positioninput의 끝을 지난 경우, break합니다.

    3. quoteOrBackslashinputposition에 있는 코드 포인트로 둡니다.

    4. position을 1만큼 증가시킵니다.

    5. quoteOrBackslash가 U+005C (\)이면:

      1. positioninput의 끝을 지난 경우 U+005C (\)를 value에 추가하고 break합니다.

      2. inputposition에 있는 코드 포인트value에 추가합니다.

      3. position을 1만큼 증가시킵니다.

    6. 그 외의 경우:

      1. Assert: quoteOrBackslash가 U+0022 (")임을 확인합니다.

      2. Break.

  6. extract-value가 true라면 value를 반환합니다.

  7. inputpositionStart부터 position까지(포함)의 코드 포인트들을 반환합니다.

입력 출력 extract-value가 true일 때의 출력 최종 위치 변수
""\" ""\" "\" 2
""Hello" World" ""Hello"" "Hello" 7
""Hello \\ World\""" ""Hello \\ World\""" "Hello \ World"" 18

이 예시에서 위치 변수는 항상 0에서 시작합니다.

2.2.1. 메서드

메서드(method)바이트 시퀀스로, method 토큰 생성식을 만족하는 것입니다.

CORS-안전 목록 메서드(CORS-safelisted method)메서드 중 `GET`, `HEAD`, 또는 `POST`인 것입니다.

금지된 메서드(forbidden method)메서드바이트 대소문자 구분 없이 `CONNECT`, `TRACE`, 또는 `TRACK`와 일치하는 것입니다. [HTTPVERBSEC1], [HTTPVERBSEC2], [HTTPVERBSEC3]

메서드 정규화(normalize)를 하려면, 메서드바이트 대소문자 구분 없이 `DELETE`, `GET`, `HEAD`, `OPTIONS`, `POST`, 또는 `PUT`와 일치한다면, 대문자 바이트(byte-uppercase)로 변환합니다.

정규화는 과거와의 호환성 및 API 간의 일관성을 위해 수행되며, 메서드는 실제로 "대소문자 구분"입니다.

`patch`를 사용하면 `405 Method Not Allowed`가 발생할 가능성이 높습니다. 반면 `PATCH`는 성공 가능성이 훨씬 더 높습니다.

메서드에는 제한이 없습니다. `CHICKEN`도 완벽하게 허용됩니다(그리고 `CHECKIN`의 오타가 아닙니다). 정규화되는 것 외에는 대소문자 제한도 없습니다. `Egg`나 `eGg`도 괜찮지만, 일관성을 위해 대문자를 권장합니다.

2.2.2. 헤더

HTTP는 일반적으로 헤더를 "필드(field)" 또는 "헤더 필드(header field)"라고 부릅니다. 웹 플랫폼에서는 더 구어체인 "헤더(header)"라는 용어를 사용합니다. [HTTP]

헤더 목록(header list)리스트(list)이며, 0개 이상의 헤더(header)를 포함합니다. 처음에는 « »입니다.

헤더 목록은 본질적으로 특수한 멀티맵: 키-값 쌍의 순서 있는 리스트로, 키가 중복될 수 있습니다. `Set-Cookie`를 제외한 헤더는 클라이언트 측 JavaScript에 노출될 때 항상 합쳐지므로, 구현체는 `Set-Cookie` 헤더용 별도 데이터 구조만 지원하면 더 효율적인 표현을 선택할 수 있습니다.

구조화 필드 값 가져오기(get a structured field value) 를 하려면 헤더 이름 name과 문자열 type헤더 목록 list에서 주어졌을 때 다음 단계를 실행합니다. 결과는 null 또는 구조화 필드 값(structured field value)입니다.

  1. Assert: type은 "dictionary", "list", 또는 "item" 중 하나입니다.

  2. value헤더 목록에서 name을 가져온 결과로 둡니다.

  3. value가 null이면 null을 반환합니다.

  4. result구조화 필드 파싱(parsing structured fields)의 결과로 둡니다. input_stringvalue, header_typetype입니다.

  5. 파싱에 실패했다면 null을 반환합니다.

  6. result를 반환합니다.

구조화 필드 값 가져오기해당 헤더가 존재하지 않는 것과 이 구조화 필드 값으로 파싱에 실패한 것을 의도적으로 구분하지 않습니다. 이는 웹 플랫폼 전반에서 일관된 처리를 보장합니다.

구조화 필드 값 설정(set a structured field value) 을 하려면 튜플(tuple) (헤더 이름 name, 구조화 필드 값 structuredValue)과 헤더 목록 list가 주어집니다:

  1. serializedValue구조화 필드 직렬화(serializing structured fields) 알고리즘을 structuredValue에 적용한 결과로 둡니다.

  2. Set (name, serializedValue) 를 list에 적용합니다.

구조화 필드 값은 HTTP가(결국) 흥미롭고 효율적으로 직렬화할 수 있는 객체로 정의되어 있습니다. 현재 Fetch는 헤더 값바이트 시퀀스로 지원하므로, 이 객체들은 직렬화를 통해서만 헤더 목록에 설정할 수 있고, 파싱을 통해서만 헤더 목록에서 얻을 수 있습니다. 앞으로는 객체 상태가 끝까지 유지될 수도 있습니다. [RFC9651]


헤더 목록 list헤더를 포함(contains)하는지 여부는 헤더 이름 namelist포함헤더name바이트 대소문자 구분 없이 name과 일치하는 것이 있는지로 판단합니다.

가져오기(get)헤더 이름 name헤더 목록 list가 주어졌을 때 다음 단계를 실행합니다. 결과는 null 또는 헤더 값입니다.

  1. listname을 포함하지 않으면 null을 반환합니다.

  2. list에서 헤더name바이트 대소문자 구분 없이 name과 일치하는 모든 을 0x2C 0x20(쉼표+공백)으로 구분하여 순서대로 반환합니다.

가져오기, 디코드 및 분할(get, decode, and split)헤더 이름 name헤더 목록 list가 주어졌을 때 다음 단계를 실행합니다. 결과는 null 또는 리스트 ( 문자열(string) )입니다.

  1. valuename을 가져온 결과로 둡니다.

  2. value가 null이면 null을 반환합니다.

  3. get, decode, and splitvalue에 적용한 결과를 반환합니다.

다음은 get, decode, and split이 실제로 어떻게 동작하는지, name 인자가 `A`일 때의 예시입니다:

헤더(네트워크 상) 출력
A: nosniff,
« "nosniff", "" »
A: nosniff
B: sniff
A:
A:
B: sniff
« "" »
B: sniff
null
A: text/html;", x/x
« "text/html;", x/x" »
A: text/html;"
A: x/x
A: x/x;test="hi",y/y
« "x/x;test="hi"", "y/y" »
A: x/x;test="hi"
C: **bingo**
A: y/y
A: x / x,,,1
« "x / x", "", "", "1" »
A: x / x
A: ,
A: 1
A: "1,2", 3
« ""1,2"", "3" »
A: "1,2"
D: 4
A: 3

get, decode, and split헤더 값(header value) value에 대해 실행하려면 다음 단계를 따릅니다. 반환 값은 문자열 리스트(list of strings)입니다.

  1. inputisomorphic decoding value 결과로 둡니다.

  2. position위치 변수(position variable)로, input의 시작 위치로 지정합니다.

  3. values문자열 리스트(list of strings)로, 처음에는 « »로 둡니다.

  4. temporaryValue를 빈 문자열로 둡니다.

  5. 다음이 참인 동안 반복합니다:

    1. U+0022 (") 또는 U+002C (,)가 아닌 코드 포인트 시퀀스 수집 결과를 input, position으로부터 temporaryValue에 추가합니다.

      이 결과는 빈 문자열일 수도 있습니다.

    2. positioninput의 끝을 지나지 않았고, position 위치의 코드 포인트가 U+0022 (")이면:

      1. temporaryValueHTTP 따옴표 문자열 수집 결과를 input, position으로부터 추가합니다.

      2. position이 끝을 지나지 않았다면 continue합니다.
    3. temporaryValue의 시작과 끝에서 HTTP 탭 또는 공백을 모두 제거합니다.

    4. Append temporaryValuevalues에 추가합니다.

    5. temporaryValue를 빈 문자열로 설정합니다.

    6. positioninput의 끝을 지났다면 values를 반환합니다.

    7. Assert: inputposition 위치의 코드 포인트가 U+002C (,)임을 확인합니다.

    8. position을 1만큼 증가시킵니다.

특정 허용된 호출지(blessed call sites)를 제외하고, 위 알고리즘을 직접 호출하지 않아야 합니다. 대신 get, decode, and split을 사용하세요.

append헤더(header) (name, value)를 헤더 목록(header list) list에 추가하는 알고리즘입니다:

  1. listname을 포함하면, name을 첫 번째 해당 헤더name으로 설정합니다.

    이렇게 하면 list에 이미 존재하는 헤더name의 대소문자가 재사용됩니다. 여러 개가 일치하면 헤더name은 모두 동일합니다.

  2. Append (name, value)를 list에 추가합니다.

delete헤더 이름(header name) name헤더 목록(header list) list에서 제거하는 알고리즘입니다. 이때 헤더name바이트 대소문자 구분 없이 name과 일치하는 모든 헤더를 list에서 제거합니다.

set헤더(header) (name, value)를 헤더 목록(header list) list에 설정하는 방법입니다:

  1. listname을 포함하면, 첫 번째 해당 헤더(header)값(value)value로 설정하고, 나머지 해당 헤더들은 제거한다.

  2. 그렇지 않으면, append (name, value)를 list에 추가합니다.

combine헤더(header) (name, value)를 헤더 목록(header list) list에 결합하는 방법입니다:

  1. listname을 포함하면, 첫 번째 해당 헤더value 뒤에 0x2C 0x20(쉼표+공백), value를 순서대로 이어붙입니다.

  2. 그렇지 않으면, append (name, value)를 list에 추가합니다.

combineXMLHttpRequestWebSocket 프로토콜 핸드셰이크에서 사용됩니다.

헤더 이름을 정렬된 소문자 집합으로 변환(convert header names to a sorted-lowercase set)하려면, 리스트(list) headerNames가 주어졌을 때 다음 단계를 따릅니다. 반환값은 순서 있는 집합(ordered set)헤더 이름(header name)입니다.

  1. headerNamesSet을 새로운 순서 있는 집합으로 둡니다.

  2. name에 대해, 바이트 소문자화(byte-lowercasing) nameheaderNamesSetappend합니다.

  3. 오름차순 정렬headerNamesSet바이트 비교(byte less than)로 적용한 결과를 반환합니다.

sort and combine헤더 목록(header list) list를 입력받아, 다음 단계를 실행합니다. 반환값은 헤더 목록(header list)입니다.

  1. headers헤더 목록(header list)으로 둡니다.

  2. names헤더 이름을 정렬된 소문자 집합으로 변환한 결과로 둡니다. 이때 list헤더들의 이름을 사용합니다.

  3. name에 대해:

    1. name이 `set-cookie`라면:

      1. valueslist에서 헤더name바이트 대소문자 구분 없이 name과 일치하는 모든 의 리스트로 둡니다.

      2. value에 대해 Append (name, value)를 headers에 추가합니다.

    2. 그 외의 경우:

      1. valuelist에서 name을 가져온 결과로 둡니다.

      2. Assert: value가 null이 아님을 확인합니다.

      3. Append (name, value)를 headers에 추가합니다.

  4. headers를 반환합니다.


헤더(header)튜플(tuple)로, 이름(name) (헤더 이름)과 값(value) (헤더 값)으로 구성됩니다.

헤더 이름(header name)바이트 시퀀스로, field-name 토큰 생성식을 만족합니다.

헤더 값(header value)바이트 시퀀스로, 다음 조건을 모두 만족해야 합니다:

헤더 값의 정의는 field-value 토큰 생성식을 따르지 않는 것이, 배포된 콘텐츠와 호환되지 않기 때문입니다.

헤더 값 정규화(normalize)바이트 시퀀스 potentialValue에서 선행 및 후행 HTTP 공백 바이트를 제거하는 것입니다.


헤더 (name, value) 가 CORS-안전 목록 요청 헤더(CORS-safelisted request-header)인지 판단하려면 다음 단계를 실행합니다:

  1. value길이가 128을 초과하면 false를 반환합니다.

  2. 바이트 소문자화(Byte-lowercase)name에 따라 분기합니다:

    `accept`

    valueCORS-비안전 요청 헤더 바이트가 있으면 false를 반환합니다.

    `accept-language`
    `content-language`

    value에 0x30 (0)~0x39 (9), 0x41 (A)~0x5A (Z), 0x61 (a)~0x7A (z), 0x20 (SP), 0x2A (*), 0x2C (,), 0x2D (-), 0x2E (.), 0x3B (;), 0x3D (=)에 속하지 않는 바이트가 있으면 false를 반환합니다.

    `content-type`
    1. valueCORS-비안전 요청 헤더 바이트가 있으면 false를 반환합니다.

    2. mimeType파싱(parsing)등가 디코딩(isomorphic decoding) value 결과로 둡니다.

    3. mimeType이 실패(failure)라면 false를 반환합니다.

    4. mimeTypeessence가 "application/x-www-form-urlencoded", "multipart/form-data", 또는 "text/plain"이 아니면 false를 반환합니다.

    이는 MIME 타입 추출(extract a MIME type) 알고리즘을 사용하지 않습니다. 해당 알고리즘은 관대하며, 서버가 이를 구현해야 한다고 기대하지 않기 때문입니다.

    MIME 타입 추출을 사용할 경우 아래 요청은 CORS 프리플라이트 없이 처리되고, 서버의 단순 파서는 요청 본문을 JSON으로 처리할 수 있습니다:

    fetch("https://victim.example/naïve-endpoint", {
      method: "POST",
      headers: [
        ["Content-Type", "application/json"],
        ["Content-Type", "text/plain"]
      ],
      credentials: "include",
      body: JSON.stringify(exerciseForTheReader)
    });
    
    `range`
    1. rangeValue단일 range 헤더 값 파싱(parsing a single range header value)value와 false를 넘긴 결과로 둡니다.

    2. rangeValue가 실패(failure)면 false를 반환합니다.

    3. rangeValue[0]이 null이면 false를 반환합니다.

      웹 브라우저는 `bytes=-500`와 같은 range를 내보내지 않으므로 이 알고리즘은 그런 경우를 safelist하지 않습니다.

    기타

    false를 반환합니다.

  3. true를 반환합니다.

`Content-Type` 헤더 safelist에는 제한적 예외가 있습니다. 자세한 내용은 CORS 프로토콜 예외를 참고하세요.

CORS-비안전 요청 헤더 바이트(CORS-unsafe request-header byte)는 바이트 byte가 다음 중 하나에 해당할 때입니다:

CORS-비안전 요청 헤더 이름(CORS-unsafe request-header names)헤더 목록 headers에 대해 다음과 같이 결정합니다:

  1. unsafeNames를 새 리스트로 둡니다.

  2. potentiallyUnsafeNames를 새 리스트로 둡니다.

  3. safelistValueSize를 0으로 둡니다.

  4. headersheader에 대해:

    1. headerCORS-안전 목록 요청 헤더가 아니면, append headernameunsafeNames에 추가합니다.

    2. 그 밖의 경우, headernamepotentiallyUnsafeNames에 추가하고, safelistValueSizeheadervalue길이만큼 더합니다.

  5. safelistValueSize가 1024를 초과하면 potentiallyUnsafeNamesnameappendunsafeNames에 추가합니다.

  6. 헤더 이름을 정렬된 소문자 집합으로 변환unsafeNames를 반환합니다.

CORS non-wildcard 요청 헤더 이름(CORS non-wildcard request-header name)헤더 이름바이트 대소문자 구분 없이 `Authorization`와 일치하는 것입니다.

특권 no-CORS 요청 헤더 이름(privileged no-CORS request-header name)헤더 이름바이트 대소문자 구분 없이 다음 중 하나와 일치하는 것입니다:

이들은 특권 API에서 설정할 수 있으며, 관련 요청 객체가 복사될 때는 보존되지만, 권한이 없는 API가 요청을 수정하는 경우 제거됩니다.

`Range` 헤더는 주로 다운로드미디어 패치에서 사용됩니다.

특정 요청에 range 헤더 추가를 위한 헬퍼가 제공됩니다.

CORS-안전 목록 응답 헤더 이름(CORS-safelisted response-header name)리스트헤더 이름 list에 대해, 다음 중 하나와 바이트 대소문자 구분 없이 일치하는 것입니다:

no-CORS-안전 목록 요청 헤더 이름(no-CORS-safelisted request-header name)헤더 이름바이트 대소문자 구분 없이 다음 중 하나와 일치하는 것입니다:

헤더 (name, value)가 no-CORS-안전 목록 요청 헤더(no-CORS-safelisted request-header)인지 판단하려면 다음 단계를 실행합니다:

  1. nameno-CORS-안전 목록 요청 헤더 이름이 아니면 false를 반환합니다.

  2. (name, value)가 CORS-안전 목록 요청 헤더인지 여부를 반환합니다.

헤더 (name, value)가 금지된 요청 헤더(forbidden request-header)인지 판단하려면 다음 단계가 true를 반환하면 됩니다:

  1. name이 다음 중 하나와 바이트 대소문자 구분 없이 일치하면:

    • `Accept-Charset`
    • `Accept-Encoding`
    • `