목표
이 표준의 목표는 웹 플랫폼 전반에 걸쳐 패칭을 통합하고, 이에 관련된 모든 것에 대해 일관된 처리를 제공하는 것입니다. 여기에는 다음이 포함됩니다:
- URL 스킴
- 리디렉션
- 교차 출처(Cross-origin) 의미
- CSP [CSP]
- 패치 메타데이터 [FETCH-METADATA]
- 서비스 워커 [SW]
- 혼합 콘텐츠 [MIX]
- 비보안 요청 업그레이드 [UPGRADE-INSECURE-REQUESTS]
- `
Referer
` [REFERRER]
이를 위해 HTTP `Origin
` 헤더 의미를
원래 The Web Origin Concept에서 정의했던 것보다 대체합니다. [ORIGIN]
1. 서문
상위 관점에서 리소스를 패칭하는 것은 꽤 단순한 작업입니다. 요청이 들어가고, 응답이 나옵니다. 하지만 그 작업의 세부사항은 매우 복잡하며, 예전에는 명확하게 문서화되지 않았고 API마다 다르게 동작했습니다.
수많은 API가 리소스를 패치하는 기능을 제공합니다. 예를 들면 HTML의 img
와
script
요소, CSS의 cursor
와 list-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 params는 struct로, 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)
- process request end-of-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 controller는 struct로, 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을 받아 다음을 실행합니다:
-
Assert: controller의 report timing steps가 null이 아님을 확인합니다.
-
controller의 report timing steps를 global과 함께 호출합니다.
특정 fetch controller controller에 대해 다음 수동 리디렉트 처리를 하려면:
-
Assert: controller의 next manual redirect steps가 null이 아님을 확인합니다.
-
controller의 next manual redirect steps를 호출합니다.
fetch controller controller에 대해 전체 타이밍 정보 추출을 하려면:
-
Assert: controller의 full timing info가 null이 아님을 확인합니다.
-
controller의 full timing info를 반환합니다.
특정 fetch controller controller에 대해 선택적 error와 함께 abort 하려면:
-
controller의 state를 "
aborted
"로 설정합니다. -
fallbackError를 "
AbortError
"DOMException
으로 둡니다. -
error가 주어지지 않았다면 fallbackError로 설정합니다.
-
serializedError를 StructuredSerialize(error)로 둡니다. 예외가 발생하면 serializedError를 StructuredSerialize(fallbackError)로 둡니다.
-
controller의 serialized abort reason을 serializedError로 설정합니다.
null 또는 Record abortReason 및 realm realm이 주어졌을 때 serialize된 abort reason 역직렬화는 다음과 같습니다:
-
fallbackError를 "
AbortError
"DOMException
으로 둡니다. -
deserializedError를 fallbackError로 둡니다.
-
abortReason이 null이 아니면, deserializedError를 StructuredDeserialize(abortReason, realm)로 둡니다. 예외가 발생하거나 undefined를 반환하면 deserializedError를 fallbackError로 둡니다.
-
deserializedError를 반환합니다.
fetch controller
controller를 종료(terminate)하려면, controller의 state를
"terminated
"로 설정합니다.
fetch params
fetchParams는, 그 controller의 state가
"aborted
"일 때 중단(aborted) 상태입니다.
fetch params
fetchParams는, 그 controller의 state가
"aborted
" 또는 "terminated
"일 때 취소(canceled) 상태입니다.
fetch timing info는 struct로, Resource Timing과 Navigation 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)
- redirect start time (기본값 0)
DOMHighResTimeStamp
.- final connection timing info (기본값 null)
- Null 또는 connection timing info.
- server-timing headers (기본값 « »)
- 문자열의 list.
- render-blocking (기본값 false)
- 불리언 값.
response body info 는 struct로, Resource Timing과 Navigation Timing에 필요한 정보를 유지합니다. 다음의 항목을 가집니다: [RESOURCE-TIMING] [NAVIGATION-TIMING]
- encoded size
(기본값 0)
- decoded size (기본값 0)
- 숫자.
- content type (기본값 빈 문자열)
- ASCII 문자열.
- content encoding (기본값 빈 문자열)
- ASCII 문자열.
fetch timing info timingInfo가 주어졌을 때 불투명 타이밍 정보 생성은, timingInfo의 start time과 post-redirect start time이 timingInfo의 start time인 새로운 fetch timing info를 반환합니다.
알고리즘 algorithm, global object 또는 parallel queue taskDestination이 주어졌을 때 fetch 태스크 큐잉(queue a fetch task)은 다음과 같이 실행합니다:
-
taskDestination이 parallel queue라면, enqueue algorithm을 taskDestination에 추가합니다.
-
그렇지 않으면, 글로벌 태스크(global task)를 networking task source에 taskDestination과 algorithm으로 큐잉합니다.
정수 직렬화(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)가 주어졌을 때 다음을 수행합니다:
-
positionStart를 position으로 둡니다.
-
value를 빈 문자열로 둡니다.
-
position을 1만큼 증가시킵니다.
-
다음이 참인 동안:
-
U+0022 (") 또는 U+005C (\)가 아닌 코드 포인트 시퀀스 수집 결과를 input, position으로부터 value에 추가합니다.
-
position이 input의 끝을 지난 경우, break합니다.
-
quoteOrBackslash를 input의 position에 있는 코드 포인트로 둡니다.
-
position을 1만큼 증가시킵니다.
-
quoteOrBackslash가 U+005C (\)이면:
-
그 외의 경우:
-
-
extract-value가 true라면 value를 반환합니다.
-
input의 positionStart부터 position까지(포함)의 코드 포인트들을 반환합니다.
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)입니다.
-
Assert: type은 "
dictionary
", "list
", 또는 "item
" 중 하나입니다. -
value를 헤더 목록에서 name을 가져온 결과로 둡니다.
-
value가 null이면 null을 반환합니다.
-
result를 구조화 필드 파싱(parsing structured fields)의 결과로 둡니다. input_string은 value, header_type은 type입니다.
-
파싱에 실패했다면 null을 반환합니다.
-
result를 반환합니다.
구조화 필드 값 가져오기는 해당 헤더가 존재하지 않는 것과 값이 구조화 필드 값으로 파싱에 실패한 것을 의도적으로 구분하지 않습니다. 이는 웹 플랫폼 전반에서 일관된 처리를 보장합니다.
구조화 필드 값 설정(set a structured field value) 을 하려면 튜플(tuple) (헤더 이름 name, 구조화 필드 값 structuredValue)과 헤더 목록 list가 주어집니다:
-
serializedValue를 구조화 필드 직렬화(serializing structured fields) 알고리즘을 structuredValue에 적용한 결과로 둡니다.
-
Set (name, serializedValue) 를 list에 적용합니다.
구조화 필드 값은 HTTP가(결국) 흥미롭고 효율적으로 직렬화할 수 있는 객체로 정의되어 있습니다. 현재 Fetch는 헤더 값만 바이트 시퀀스로 지원하므로, 이 객체들은 직렬화를 통해서만 헤더 목록에 설정할 수 있고, 파싱을 통해서만 헤더 목록에서 얻을 수 있습니다. 앞으로는 객체 상태가 끝까지 유지될 수도 있습니다. [RFC9651]
헤더 목록 list가 헤더를 포함(contains)하는지 여부는 헤더 이름 name이 list에 포함된 헤더 중 name이 바이트 대소문자 구분 없이 name과 일치하는 것이 있는지로 판단합니다.
가져오기(get)는 헤더 이름 name과 헤더 목록 list가 주어졌을 때 다음 단계를 실행합니다. 결과는 null 또는 헤더 값입니다.
-
list가 name을 포함하지 않으면 null을 반환합니다.
-
list에서 헤더 중 name이 바이트 대소문자 구분 없이 name과 일치하는 모든 값을 0x2C 0x20(쉼표+공백)으로 구분하여 순서대로 반환합니다.
가져오기, 디코드 및 분할(get, decode, and split) 은 헤더 이름 name과 헤더 목록 list가 주어졌을 때 다음 단계를 실행합니다. 결과는 null 또는 리스트 ( 문자열(string) )입니다.
-
value를 name을 가져온 결과로 둡니다.
-
value가 null이면 null을 반환합니다.
-
get, decode, and split을 value에 적용한 결과를 반환합니다.
다음은 get, decode, and split이 실제로 어떻게 동작하는지,
name 인자가 `A
`일 때의 예시입니다:
헤더(네트워크 상) | 출력 |
---|---|
| « "nosniff ", "" »
|
| |
| « "" » |
| null |
| « "text/html;", x/x " »
|
| |
| « "x/x;test="hi" ", "y/y " »
|
| |
| « "x / x ", "", "", "1 " »
|
| |
| « ""1,2" ", "3 " »
|
|
get, decode, and split 을 헤더 값(header value) value에 대해 실행하려면 다음 단계를 따릅니다. 반환 값은 문자열 리스트(list of strings)입니다.
-
input을 isomorphic decoding value 결과로 둡니다.
-
position을 위치 변수(position variable)로, input의 시작 위치로 지정합니다.
-
values를 문자열 리스트(list of strings)로, 처음에는 « »로 둡니다.
-
temporaryValue를 빈 문자열로 둡니다.
-
다음이 참인 동안 반복합니다:
-
U+0022 (") 또는 U+002C (,)가 아닌 코드 포인트 시퀀스 수집 결과를 input, position으로부터 temporaryValue에 추가합니다.
이 결과는 빈 문자열일 수도 있습니다.
-
position이 input의 끝을 지나지 않았고, position 위치의 코드 포인트가 U+0022 (")이면:
-
temporaryValue에 HTTP 따옴표 문자열 수집 결과를 input, position으로부터 추가합니다.
- position이 끝을 지나지 않았다면 continue합니다.
-
-
temporaryValue의 시작과 끝에서 HTTP 탭 또는 공백을 모두 제거합니다.
-
Append temporaryValue를 values에 추가합니다.
-
temporaryValue를 빈 문자열로 설정합니다.
-
position이 input의 끝을 지났다면 values를 반환합니다.
-
position을 1만큼 증가시킵니다.
-
특정 허용된 호출지(blessed call sites)를 제외하고, 위 알고리즘을 직접 호출하지 않아야 합니다. 대신 get, decode, and split을 사용하세요.
append는 헤더(header) (name, value)를 헤더 목록(header list) list에 추가하는 알고리즘입니다:
delete는 헤더 이름(header name) name을 헤더 목록(header list) list에서 제거하는 알고리즘입니다. 이때 헤더의 name이 바이트 대소문자 구분 없이 name과 일치하는 모든 헤더를 list에서 제거합니다.
set은 헤더(header) (name, value)를 헤더 목록(header list) list에 설정하는 방법입니다:
-
list가 name을 포함하면, 첫 번째 해당 헤더(header)의 값(value)을 value로 설정하고, 나머지 해당 헤더들은 제거한다.
-
그렇지 않으면, append (name, value)를 list에 추가합니다.
combine은 헤더(header) (name, value)를 헤더 목록(header list) list에 결합하는 방법입니다:
-
list가 name을 포함하면, 첫 번째 해당 헤더의 value 뒤에 0x2C 0x20(쉼표+공백), value를 순서대로 이어붙입니다.
-
그렇지 않으면, append (name, value)를 list에 추가합니다.
combine은 XMLHttpRequest
및
WebSocket 프로토콜 핸드셰이크에서 사용됩니다.
헤더 이름을 정렬된 소문자 집합으로 변환(convert header names to a sorted-lowercase set)하려면, 리스트(list) headerNames가 주어졌을 때 다음 단계를 따릅니다. 반환값은 순서 있는 집합(ordered set)의 헤더 이름(header name)입니다.
-
headerNamesSet을 새로운 순서 있는 집합으로 둡니다.
-
각 name에 대해, 바이트 소문자화(byte-lowercasing) name을 headerNamesSet에 append합니다.
-
오름차순 정렬을 headerNamesSet에 바이트 비교(byte less than)로 적용한 결과를 반환합니다.
sort and combine은 헤더 목록(header list) list를 입력받아, 다음 단계를 실행합니다. 반환값은 헤더 목록(header list)입니다.
-
headers를 헤더 목록(header list)으로 둡니다.
-
names를 헤더 이름을 정렬된 소문자 집합으로 변환한 결과로 둡니다. 이때 list 내 헤더들의 이름을 사용합니다.
-
각 name에 대해:
-
headers를 반환합니다.
헤더(header)는 튜플(tuple)로, 이름(name) (헤더 이름)과 값(value) (헤더 값)으로 구성됩니다.
헤더 이름(header name)은 바이트 시퀀스로, field-name 토큰 생성식을 만족합니다.
헤더 값(header value)은 바이트 시퀀스로, 다음 조건을 모두 만족해야 합니다:
-
선행 또는 후행 HTTP 탭 또는 공백 바이트가 없어야 합니다.
-
0x00 (NUL) 또는 HTTP 줄바꿈 바이트를 포함하지 않아야 합니다.
헤더 값의 정의는 field-value 토큰 생성식을 따르지 않는 것이, 배포된 콘텐츠와 호환되지 않기 때문입니다.
헤더 값 정규화(normalize)는 바이트 시퀀스 potentialValue에서 선행 및 후행 HTTP 공백 바이트를 제거하는 것입니다.
헤더 (name, value) 가 CORS-안전 목록 요청 헤더(CORS-safelisted request-header)인지 판단하려면 다음 단계를 실행합니다:
-
value의 길이가 128을 초과하면 false를 반환합니다.
-
바이트 소문자화(Byte-lowercase)한 name에 따라 분기합니다:
- `
accept
` -
value에 CORS-비안전 요청 헤더 바이트가 있으면 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
` -
-
value에 CORS-비안전 요청 헤더 바이트가 있으면 false를 반환합니다.
-
mimeType을 파싱(parsing)한 등가 디코딩(isomorphic decoding) value 결과로 둡니다.
-
mimeType이 실패(failure)라면 false를 반환합니다.
-
mimeType의 essence가 "
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
` -
-
rangeValue를 단일 range 헤더 값 파싱(parsing a single range header value) 에 value와 false를 넘긴 결과로 둡니다.
-
rangeValue가 실패(failure)면 false를 반환합니다.
-
rangeValue[0]이 null이면 false를 반환합니다.
웹 브라우저는 `
bytes=-500
`와 같은 range를 내보내지 않으므로 이 알고리즘은 그런 경우를 safelist하지 않습니다.
-
- 기타
-
false를 반환합니다.
- `
-
true를 반환합니다.
`Content-Type
` 헤더 safelist에는 제한적 예외가 있습니다. 자세한 내용은 CORS 프로토콜 예외를 참고하세요.
CORS-비안전 요청 헤더 바이트(CORS-unsafe request-header byte)는 바이트 byte가 다음 중 하나에 해당할 때입니다:
-
byte가 0x20 미만이고 0x09 HT가 아닌 경우
-
byte가 0x22 ("), 0x28 (왼쪽 괄호), 0x29 (오른쪽 괄호), 0x3A (:), 0x3C (<), 0x3E (>), 0x3F (?), 0x40 (@), 0x5B ([), 0x5C (\), 0x5D (]), 0x7B ({), 0x7D (}), 또는 0x7F DEL인 경우.
CORS-비안전 요청 헤더 이름(CORS-unsafe request-header names)은 헤더 목록 headers에 대해 다음과 같이 결정합니다:
CORS
non-wildcard 요청 헤더 이름(CORS non-wildcard request-header name)은 헤더 이름 중
바이트 대소문자 구분 없이 `Authorization
`와 일치하는 것입니다.
특권 no-CORS 요청 헤더 이름(privileged no-CORS request-header name)은 헤더 이름 중 바이트 대소문자 구분 없이 다음 중 하나와 일치하는 것입니다:
- `
Range
`.
이들은 특권 API에서 설정할 수 있으며, 관련 요청 객체가 복사될 때는 보존되지만, 권한이 없는 API가 요청을 수정하는 경우 제거됩니다.
`Range
` 헤더는 주로 다운로드
및 미디어 패치에서 사용됩니다.
특정 요청에 range 헤더 추가를 위한 헬퍼가 제공됩니다.
CORS-안전 목록 응답 헤더 이름(CORS-safelisted response-header name)은 리스트의 헤더 이름 list에 대해, 다음 중 하나와 바이트 대소문자 구분 없이 일치하는 것입니다:
- `
Cache-Control
` - `
Content-Language
` - `
Content-Length
` - `
Content-Type
` - `
Expires
` - `
Last-Modified
` - `
Pragma
` - 리스트(list)의 모든 항목 중 금지된 응답 헤더 이름(forbidden response-header name)이 아닌 것.
no-CORS-안전 목록 요청 헤더 이름(no-CORS-safelisted request-header name)은 헤더 이름 중 바이트 대소문자 구분 없이 다음 중 하나와 일치하는 것입니다:
- `
Accept
` - `
Accept-Language
` - `
Content-Language
` - `
Content-Type
`
헤더 (name, value)가 no-CORS-안전 목록 요청 헤더(no-CORS-safelisted request-header)인지 판단하려면 다음 단계를 실행합니다:
-
name이 no-CORS-안전 목록 요청 헤더 이름이 아니면 false를 반환합니다.
-
(name, value)가 CORS-안전 목록 요청 헤더인지 여부를 반환합니다.
헤더 (name, value)가 금지된 요청 헤더(forbidden request-header)인지 판단하려면 다음 단계가 true를 반환하면 됩니다:
-
name이 다음 중 하나와 바이트 대소문자 구분 없이 일치하면:
- `
Accept-Charset
` - `
Accept-Encoding
` - `
- `