목표
이 표준의 목표는 웹 플랫폼 전반에 걸쳐 패칭을 통합하고, 이에 관련된 모든 것에 대해 일관된 처리를 제공하는 것입니다. 여기에는 다음이 포함됩니다:
- 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
` - `
Access-Control-Request-Headers
` - `
Access-Control-Request-Method
` - `
Connection
` - `
Content-Length
` - `
Cookie
` - `
Cookie2
` - `
Date
` - `
DNT
` - `
Expect
` - `
Host
` - `
Keep-Alive
` - `
Origin
` - `
Referer
` - `
Set-Cookie
` - `
TE
` - `
Trailer
` - `
Transfer-Encoding
` - `
Upgrade
` - `
Via
`
true를 반환합니다.
- `
-
name이 다음 중 하나와 바이트 대소문자 구분 없이 일치하면:
- `
X-HTTP-Method
` - `
X-HTTP-Method-Override
` - `
X-Method-Override
`
다음 절차를 실행합니다:
-
parsedValues를 get, decode, and split value의 결과로 둡니다.
-
각 parsedValues의 method에 대해, isomorphic encoding한 method가 금지된 메서드(forbidden method)라면 true를 반환합니다.
- `
-
false를 반환합니다.
이 헤더들은 사용자 에이전트가 완전히 제어할 수 있도록 금지됩니다.
헤더 이름이
`Sec-
`로 시작하는 경우, 헤더가
fetch 등 개발자가 헤더를 제어할 수
있는 API에 의해 사용될 때, 새 헤더가 안전하게 도입될 수 있도록 예약되어 있습니다. 예: XMLHttpRequest
.
[XHR]
`Set-Cookie
` 헤더는 의미상 응답 헤더이므로 요청에서는 쓸모가 없습니다. `Set-Cookie
` 헤더는 결합(combine)될
수 없으므로, Headers
객체에서 더 복잡하게 처리해야 합니다. 여기서 금지하는 이유는 이 복잡성이 요청으로 새어 나가는 것을 막기 위함입니다.
금지된 응답 헤더 이름(forbidden response-header name)은 헤더 이름 중 바이트 대소문자 구분 없이 다음 중 하나와 일치하는 것입니다:
- `
Set-Cookie
` - `
Set-Cookie2
`
요청 본문 헤더 이름(request-body-header name)은 헤더 이름 중 바이트 대소문자 구분 없이 다음 중 하나와 일치하는 것입니다:
- `
Content-Encoding
` - `
Content-Language
` - `
Content-Location
` - `
Content-Type
`
헤더 값 추출(extract header values) 은 헤더(header) header가 주어졌을 때 다음 단계를 실행합니다:
헤더 목록 값 추출(extract header list values) 은 헤더 이름 name과 헤더 목록(header list) list가 주어졌을 때 다음 단계를 실행합니다:
-
list가 name을 포함하지 않으면 null을 반환합니다.
-
name에 대한 ABNF가 단일 헤더(header)만 허용하고, list가 name을 중복 포함하면 failure를 반환합니다.
다른 오류 처리가 필요하다면, 먼저 원하는 헤더를 추출하세요.
-
values를 빈 리스트로 둡니다.
-
list에 name을 포함하는 모든 헤더(header) header에 대해:
-
values를 반환합니다.
콘텐츠 범위 생성(build a content range)은 정수 rangeStart, 정수 rangeEnd, 정수 fullLength가 주어졌을 때 다음 단계를 실행합니다:
단일 range 헤더 값 파싱(parse a single range header value)은 바이트 시퀀스 value와 불리언 allowWhitespace가 주어졌을 때 다음을 실행합니다:
-
data를 등가 디코딩(isomorphic decoding) value 결과로 둡니다.
-
data가 "
bytes
"로 시작하지 않으면 failure를 반환합니다. -
position을 위치 변수(position variable)로, data의 5번째 코드 포인트 위치로 둡니다.
-
allowWhitespace가 true라면, HTTP 탭 또는 공백 시퀀스를 data, position에서 수집합니다.
-
data의 position 위치 코드 포인트가 U+003D (=)가 아니면 failure를 반환합니다.
-
position을 1만큼 증가시킵니다.
-
allowWhitespace가 true라면, HTTP 탭 또는 공백 시퀀스를 data, position에서 수집합니다.
-
rangeStart를 ASCII 숫자(ASCII digits) 시퀀스를 data, position에서 수집한 결과로 둡니다.
-
rangeStartValue를 rangeStart가 빈 문자열이 아니면 10진수로 해석한 값, 아니면 null로 둡니다.
-
allowWhitespace가 true라면, HTTP 탭 또는 공백 시퀀스를 data, position에서 수집합니다.
-
data의 position 위치 코드 포인트가 U+002D (-)가 아니면 failure를 반환합니다.
-
position을 1만큼 증가시킵니다.
-
allowWhitespace가 true라면, HTTP 탭 또는 공백 시퀀스를 data, position에서 수집합니다.
-
rangeEnd를 ASCII 숫자(ASCII digits) 시퀀스를 data, position에서 수집한 결과로 둡니다.
-
rangeEndValue를 rangeEnd가 빈 문자열이 아니면 10진수로 해석한 값, 아니면 null로 둡니다.
-
position이 data의 끝을 지나지 않았다면 failure를 반환합니다.
-
rangeEndValue와 rangeStartValue가 모두 null이면 failure를 반환합니다.
-
rangeStartValue와 rangeEndValue가 모두 숫자이고, rangeStartValue가 rangeEndValue보다 크면 failure를 반환합니다.
-
(rangeStartValue, rangeEndValue)를 반환합니다.
range 끝이나 시작이 생략될 수 있습니다. 예: `
bytes=0-
` 또는 `bytes=-500
`도 유효한 range입니다.
단일 range 헤더 값 파싱은 허용된 range 헤더 값의 일부만 성공하지만, 미디어 요청이나 다운로드 재개 등에서 사용자 에이전트가 가장 자주 사용하는 형식입니다. 이 range 헤더 값 형식은 range 헤더 추가를 통해 설정할 수 있습니다.
기본
`User-Agent
` 값(default `User-Agent
` value)은
구현 정의(implementation-defined) 헤더 값입니다 (`User-Agent
` 헤더용).
웹 호환성 문제로 인해, 웹 브라우저는 이 값이 `Mozilla/5.0 (
`로 시작하도록 하고, 일반적으로 다른 웹 브라우저를
따라하도록 강하게 권장됩니다.
문서
`Accept
` 헤더 값(document `Accept
` header value)은
`text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
`입니다.
2.2.3. 상태
상태(status)는 0부터 999까지(포함)의 정수입니다.
HTTP/1의 status-code
를 이 개념에 매핑할 때의 다양한 경계 사례는 이슈 #1156에서 논의되고 있습니다.
null 본문 상태(null body status)는 101, 103, 204, 205, 304인 상태입니다.
ok 상태(ok status)는 200부터 299까지(포함)의 상태입니다.
리다이렉트 상태(redirect status)는 301, 302, 303, 307, 308인 상태입니다.
2.2.4. 본문
본문(body)은 다음으로 구성됩니다:
-
스트림(stream) (
ReadableStream
객체). -
소스(source) (null, 바이트 시퀀스,
Blob
객체, 또는FormData
객체), 초기값은 null. -
길이(length) (null 또는 정수), 초기값은 null.
복제(clone)를 본문 body에 대해 실행하려면 다음을 따릅니다:
바이트 시퀀스 bytes를 본문으로(as a body) 얻으려면, 안전하게 추출(safely extracting) bytes의 결과 중 body를 반환합니다.
점진적으로 읽기(incrementally read)는 본문(body) body와 알고리즘 processBodyChunk, 알고리즘 processEndOfBody, 알고리즘 processBodyError, 옵션으로 null, parallel queue 또는 global object taskDestination (기본값 null)이 주어졌을 때 다음을 실행합니다. processBodyChunk는 바이트 시퀀스를 인자로 받는 알고리즘이어야 하며, processEndOfBody는 인자 없이, processBodyError는 예외를 인자로 받는 알고리즘이어야 합니다.
-
taskDestination이 null이면 새 parallel queue 시작 결과를 taskDestination로 둡니다.
-
reader를 리더(getting a reader)로 body의 스트림에 대해 구합니다.
이 동작은 예외를 발생시키지 않습니다.
-
점진적 읽기 루프(incrementally-read loop)를 reader, taskDestination, processBodyChunk, processEndOfBody, processBodyError로 실행합니다.
점진적 읽기
루프(incrementally-read loop)를 실행하려면, ReadableStreamDefaultReader
객체
reader, parallel queue 또는 global object
taskDestination, 알고리즘 processBodyChunk, 알고리즘
processEndOfBody, 알고리즘 processBodyError가 주어집니다:
-
readRequest를 다음 read request로 둡니다:
- chunk steps (chunk)
-
-
continueAlgorithm을 null로 둡니다.
-
chunk가
Uint8Array
객체가 아니라면, continueAlgorithm을 다음 단계로 설정합니다: processBodyError를TypeError
와 함께 실행. -
그 외의 경우:
-
fetch 태스크 큐잉을 continueAlgorithm, taskDestination에 실행합니다.
-
- close steps
-
-
fetch 태스크 큐잉을 processEndOfBody, taskDestination에 실행합니다.
-
- error steps (e)
-
-
fetch 태스크 큐잉을 processBodyError에 e와 taskDestination로 실행합니다.
-
-
청크 읽기(Read a chunk)를 reader와 readRequest로 실행합니다.
완전히 읽기(fully read)는 본문(body) body, 알고리즘 processBody, 알고리즘 processBodyError, 옵션으로 null, parallel queue 또는 global object taskDestination (기본값 null)이 주어졌을 때 다음을 실행합니다. processBody는 바이트 시퀀스를 인자로 받는 알고리즘이어야 하며, processBodyError는 예외(옵션)를 인자로 받을 수 있는 알고리즘이어야 합니다.
-
taskDestination이 null이면 새 parallel queue 시작 결과를 taskDestination로 둡니다.
-
successSteps를 fetch 태스크 큐잉을 processBody에 bytes, taskDestination로 실행하는 알고리즘으로 둡니다.
-
errorSteps를 fetch 태스크 큐잉을 processBodyError에 exception, taskDestination로 실행하는 알고리즘으로 둡니다.
-
reader를 리더(getting a reader)로 body의 스트림에 대해 구합니다. 예외가 발생하면 errorSteps를 그 예외와 함께 실행하고 종료합니다.
-
모든 바이트 읽기(Read all bytes)를 reader, successSteps, errorSteps로 실행합니다.
타입이 있는 본문(body with type)은 튜플로, 본문(body) (body)과 타입(type) (헤더 값 또는 null)으로 구성됩니다.
콘텐츠 코딩 처리(handle content codings)는 codings와 bytes가 주어졌을 때 다음 단계를 수행합니다:
-
codings가 지원되지 않으면 bytes를 반환합니다.
-
HTTP에서 설명한 대로 codings로 bytes를 디코딩한 결과를 반환합니다. 디코딩 중 오류가 발생하면 failure를 반환합니다. [HTTP]
2.2.5. 요청
이 절은 요청이 어떻게 동작하는지 자세히 문서화합니다. 시작하려면 요청 설정을 참고하세요.
fetch의 입력값은 요청(request)입니다.
요청은 연관된
메서드(method)를 가집니다.
(method) 별도의 언급이 없으면
`GET
`입니다.
리다이렉트 중 HTTP fetch에서 설명된 대로 `GET
`으로 변경될 수 있습니다.
구현은 URL 목록 중 첫 번째 요청의 URL 목록을 가리키게 만드는 것이 권장됩니다. 이 필드는 Fetch에 연결되는 다른 표준의 편의를 위해 별도로 제공됩니다.
요청은 연관된 로컬 URL 전용 플래그(local-URLs-only flag)를 가집니다. 별도의 언급이 없으면 설정되지 않음(unset)입니다.
요청은 연관된 헤더 목록(header list)을 가집니다. (header list) 별도의 언급이 없으면 « »입니다.
요청은 연관된 unsafe-request 플래그를 가집니다. 별도의 언급이 없으면 설정되지 않음(unset)입니다.
unsafe-request 플래그는
fetch()
및 XMLHttpRequest
와
같은 API에서 설정되어,
지정된 메서드 및 헤더
목록에 따라
CORS-프리플라이트
fetch가 수행됨을 보장합니다. 이는 API가 금지된 메서드 및 금지된 요청 헤더를 허용하지 않는 것과는 별개입니다.
요청은 연관된 본문(body)을 가집니다. (null, 바이트 시퀀스, 또는 body) 별도의 언급이 없으면 null입니다.
바이트 시퀀스는 안전하게 추출되어 body로 바뀌며, HTTP fetch 중 일부 리다이렉트로 인해 이 값이 null이 될 수도 있습니다.
요청은 연관된 클라이언트(client)를 가집니다. (null 또는 environment settings object)
요청은 연관된 reserved client (null, environment, 또는 environment settings object), 별도의 언급이 없으면 null입니다.
이 필드는 탐색 요청(navigation requests) 및 워커 요청에만 사용되며, 서비스 워커 요청에는 사용되지 않습니다. environment는 탐색 요청용, environment settings object는 워커 요청용입니다.
요청은 연관된 replaces client id (문자열) 값을 가집니다. 별도의 언급이 없으면 빈 문자열입니다.
이 필드는 탐색 요청에만 사용됩니다. id는 대상 브라우징 컨텍스트(target browsing context)의 active document 의 environment settings object입니다.
요청은 연관된
사용자 프롬프트용 traversable(traversable for user prompts)을 가집니다.
"no-traversable
", "client
", 또는 traversable navigable 중 하나입니다. 별도의 언급이 없으면
"client
"입니다.
이 필드는 요청과 연관된 UI(예: 인증 프롬프트, 클라이언트 인증서 대화상자 등)를 어디에 표시할지 결정할 때 사용합니다.
- "
no-traversable
" - UI를 표시하지 않음; 보통 요청이 네트워크 오류(network error)로 실패함.
- "
client
" - 이 값은 fetch 중에 자동으로 "
no-traversable
" 또는 traversable navigable로 바뀝니다. 이를 통해 표준에서 요청의 사용자 프롬프트용 traversable을 명시적으로 설정하지 않아도 됩니다. - traversable navigable
- 표시되는 UI는 해당 traversable navigable을 보여주는 브라우저 인터페이스와 연결됩니다.
요청과 연관된 사용자 인터페이스를 사용자 프롬프트용 traversable에서 표시할 때, 사용자 에이전트는 주소 표시줄에 요청의 현재 URL(current URL)에서 유도된 값을 표시해야 합니다(예: 이전 값, 즉 요청의 시작자 URL에서 유도된 값을 표시하지 않아야 함). 또한, 특히 교차 출처 요청의 경우, 요청의 시작자 콘텐츠를 사용자 프롬프트용 traversable에 표시하지 않도록 해야 합니다. 이러한 프롬프트 뒤에 빈 페이지를 표시하는 것이 좋은 방법입니다. 이를 준수하지 않으면 사용자가 어느 출처가 해당 프롬프트를 유발했는지 혼동할 수 있습니다.
요청은 연관된 불리언 keepalive를 가집니다. 별도의 언급이 없으면 false입니다.
이 값이 true이면 요청이 environment settings object보다 오래 지속될 수 있습니다. 예:
navigator.sendBeacon()
및 HTML img
요소가 이 기능을 사용합니다. 이 값이 true인 요청은 추가 처리 요구 사항이
적용됩니다.
요청은 연관된
initiator type을 가집니다. 값은 null,
"audio
",
"beacon
",
"body
",
"css
",
"early-hints
",
"embed
",
"fetch
",
"font
",
"frame
",
"iframe
",
"image
",
"img
",
"input
",
"link
",
"object
",
"ping
",
"script
",
"track
",
"video
",
"xmlhttprequest
", 또는
"other
" 중 하나입니다. 별도의 언급이 없으면 null입니다. [RESOURCE-TIMING]
요청은 연관된
service-workers mode를 가집니다.
값은 "all
" 또는 "none
" 중 하나입니다. 별도의 언급이 없으면 "all
"입니다.
이 값은 어떤 서비스 워커가 이 fetch에 대해 fetch
이벤트를 받을지 결정합니다.
- "
all
" - 해당 서비스 워커가 이 fetch에 대해
fetch
이벤트를 받게 됩니다. - "
none
" - 어떤 서비스 워커도 이 fetch에 대해 이벤트를 받지 않습니다.
요청은 연관된
initiator를 가집니다. 값은 빈 문자열,
"download
",
"imageset
",
"manifest
",
"prefetch
",
"prerender
", 또는
"xslt
" 중 하나입니다. 별도의 언급이 없으면 빈 문자열입니다.
요청의 initiator는 현재로서는 다른 명세에서 더 세분화가 필요하지 않아 비교적 단순합니다. 주로 CSP와 혼합 콘텐츠 정의를 돕는 명세 장치입니다. JavaScript에는 노출되지 않습니다. [CSP] [MIX]
대상 타입(destination type)은
다음 중 하나입니다:
빈 문자열,
"audio
",
"audioworklet
",
"document
",
"embed
",
"font
",
"frame
",
"iframe
",
"image
",
"json
",
"manifest
",
"object
",
"paintworklet
",
"report
",
"script
",
"serviceworker
",
"sharedworker
",
"style
",
"track
",
"video
",
"webidentity
",
"worker
", 또는
"xslt
".
요청은 연관된 대상(destination)을 가집니다. (destination type) 별도의 언급이 없으면 빈 문자열입니다.
이 값들은 RequestDestination
에 반영됩니다. 단, "serviceworker
"와 "webidentity
"는 해당 destination으로의 fetch가 서비스 워커를
건너뜁니다.
요청의 destination이
스크립트류(script-like)이면, 값이 "audioworklet
",
"paintworklet
", "script
", "serviceworker
",
"sharedworker
", "worker
" 중 하나입니다.
알고리즘에서 스크립트류를 사용할 때는 "xslt
"도 스크립트 실행을 유발할 수 있음을
고려해야 합니다. 다만 항상 관련되지 않으며 별도 동작이 필요할 수 있어 목록에 포함하지 않았습니다.
다음 표는 요청의 initiator, destination, CSP 지시어, 그리고 기능(feature) 간의 관계를 보여줍니다. 이 표는 모든 기능을 포괄하지 않습니다. 각 기능은 해당 표준에서 관련 값을 정의해야 합니다.
Initiator | Destination | CSP 지시어 | 기능(Features) |
---|---|---|---|
"" | "report "
| — | CSP, NEL 보고서. |
"document "
| HTML의 navigate 알고리즘(최상위만). | ||
"frame "
| child-src
| HTML의 <frame>
| |
"iframe "
| child-src
| HTML의 <iframe>
| |
"" | connect-src
| navigator.sendBeacon() , EventSource ,
HTML의 <a ping=""> , <area ping=""> ,
fetch() , fetchLater() , XMLHttpRequest ,
WebSocket ,
Cache API
| |
"object "
| object-src
| HTML의 <object>
| |
"embed "
| object-src
| HTML의 <embed>
| |
"audio "
| media-src
| HTML의 <audio>
| |
"font "
| font-src
| CSS의 @font-face
| |
"image "
| img-src
| HTML의 <img src> , /favicon.ico 리소스,
SVG의 <image> , CSS의 background-image , CSS의
cursor , CSS의 list-style-image 등
| |
"audioworklet "
| script-src
| audioWorklet.addModule()
| |
"paintworklet "
| script-src
| CSS.paintWorklet.addModule()
| |
"script "
| script-src
| HTML의 <script> , importScripts()
| |
"serviceworker "
| child-src , script-src , worker-src
| navigator.serviceWorker.register()
| |
"sharedworker "
| child-src , script-src , worker-src
| SharedWorker
| |
"webidentity "
| connect-src
| Federated Credential Management 요청
| |
"worker "
| child-src , script-src , worker-src
| Worker
| |
"json "
| connect-src
| import "..." with { type: "json" }
| |
"style "
| style-src
| HTML의 <link rel=stylesheet> , CSS의 @import ,
import "..." with { type: "css" }
| |
"track "
| media-src
| HTML의 <track>
| |
"video "
| media-src
| HTML의 <video> 요소
| |
"download "
| "" | — | HTML의 download="" , "다른 이름으로 링크 저장…" UI
|
"imageset "
| "image "
| img-src
| HTML의 <img srcset> , <picture>
|
"manifest "
| "manifest "
| manifest-src
| HTML의 <link rel=manifest>
|
"prefetch "
| "" | default-src (특정 지시어 없음)
| HTML의 <link rel=prefetch>
|
"prerender "
| HTML의 <link rel=prerender>
| ||
"xslt "
| "xslt "
| script-src
| <?xml-stylesheet>
|
CSP의 form-action
은 HTML의 navigate 또는 form 제출 알고리즘에 직접 연결되어야 합니다.
CSP는 또한 다양한 CSP 지시어에 대해 요청의 client의
global object의 연관 Document
의
조상 navigable을 확인해야 합니다.
요청은 연관된
우선순위(priority)를 가집니다. 값은 "high
", "low
",
"auto
" 중 하나이며, 별도의 언급이 없으면 "auto
"입니다.
요청은 연관된 내부 우선순위(internal priority)(null 또는 구현 정의(implementation-defined) 객체) 값을 가집니다. 별도의 언급이 없으면 null입니다.
요청은 연관된
origin을 가집니다. 값은 "client
" 또는 origin입니다. 별도의 언급이 없으면 "client
"입니다.
"client
"는 origin으로 fetch 중에 변경됩니다. 이를 통해 표준에서 요청의 origin을 직접 설정하지 않아도 됩니다.
요청은 연관된 최상위 navigation initiator origin(top-level navigation initiator origin)을 가집니다. 값은 origin 또는 null입니다. 별도의 언급이 없으면 null입니다.
요청은 연관된
policy container를 가집니다. 값은 "client
" 또는 policy container이며, 별도의 언급이 없으면 "client
"입니다.
"client
"는 policy container로 fetch 중에 변경됩니다. 이를 통해 표준에서 요청의 policy
container를 직접 설정하지 않아도 됩니다.
요청은 연관된
referrer를 가집니다. 값은 "no-referrer
",
"client
", 또는 URL입니다. 별도의 언급이 없으면 "client
"입니다.
"client
"는 URL 또는
"no-referrer
"로 fetch 중에 변경됩니다. 이를 통해 표준에서 요청의 referrer를 직접 설정하지 않아도 됩니다.
요청은 연관된 referrer policy를 가집니다. 값은 referrer policy이며, 별도의 언급이 없으면 빈 문자열입니다. [REFERRER]
이 값은 해당 요청에 사용할 referrer policy를 덮어쓸 때 사용될 수 있습니다.
요청은 연관된
mode를 가집니다. 값은
"same-origin
", "cors
", "no-cors
",
"navigate
", 또는 "websocket
"입니다. 별도의 언급이 없으면 "no-cors
"입니다.
- "
same-origin
" - 동일 출처 URL에 대한 요청임을 보장합니다. fetch는 동일 출처가 아니면 네트워크 오류(network error)를 반환합니다.
- "
cors
" - response tainting이 "
cors
"로 설정된 요청에 사용되며, CORS 요청이 되어, fetch는 요청된 리소스가 CORS 프로토콜을 이해하지 못하거나 CORS 프로토콜에 일부러 참여하지 않는 경우 네트워크 오류를 반환합니다. - "
no-cors
" - CORS-안전 목록 메서드와 CORS-안전 목록 요청 헤더만 사용할 수 있도록 제한합니다. 성공 시 fetch는 opaque 필터링된 응답을 반환합니다.
- "
navigate
" - 문서 간 탐색(navigating)에만 사용되는 특수 모드입니다.
- "
websocket
" - 웹소켓 연결(WebSocket connection)을 설정할 때만 사용되는 특수 모드입니다.
기본 요청의 mode가
"no-cors
"이기는 하지만,
표준에서는 새로운 기능에 이 모드 사용을 적극 권장하지 않습니다. 이 모드는 안전하지 않습니다.
요청은 연관된 use-CORS-preflight 플래그를 가진다. 별도 언급이 없으면 설정되지 않은 상태다.
use-CORS-preflight 플래그가 설정된 것은 CORS-프리플라이트 요청이 발생하는 여러 조건 중
하나이다. use-CORS-preflight 플래그는 XMLHttpRequestUpload
객체에 하나 이상의 이벤트 리스너가 등록되었거나, ReadableStream
객체가 요청에 사용된 경우 설정된다.
요청은
연관된
credentials mode
를 가진다. 값은 "omit
", "same-origin
", "include
" 중 하나이며, 별도 언급이 없으면
"same-origin
"이다.
- "
omit
" - 이 요청에 credentials를 포함하지 않으며, 응답에 포함된 credentials도 무시된다.
- "
same-origin
" - 동일 출처 URL에 대한 요청에는 credentials를 포함하고, 동일 출처 응답에 포함된 credentials도 사용한다.
- "
include
" - 이 요청에는 항상 credentials를 포함하고, 응답에 포함된 credentials도 항상 사용한다.
요청의 credentials mode는 fetch 중 credentials의 흐름을 제어한다. 요청의 mode가 "navigate
"이면
credentials mode는 "include
"로 간주되며,
fetch는 현재 다른 값을 고려하지 않는다.
HTML이 이 부분을 변경하면 이 표준도 그에 맞게 변경되어야 한다.
요청은 연관된 use-URL-credentials 플래그 를 가진다. 별도 언급이 없으면 설정되지 않은 상태다.
이 플래그가 설정된 경우, 요청의 URL에 username과 password가 있고, 해당 인증 항목(authentication entry)이 존재한다면, URL의 credentials가 인증 항목의 credentials보다 우선된다. 최신 명세에서는 URL에 credentials를 넣는 것을 권장하지 않으므로 이 플래그를 잘 사용하지 않지만, 과거 호환성 때문에 설정하는 경우가 있다.
요청은
연관된
cache mode를 가진다. 값은
"default
", "no-store
", "reload
",
"no-cache
", "force-cache
", "only-if-cached
" 중 하나이며, 별도 언급이 없으면
"default
"이다.
- "
default
" - fetch는 네트워크로 가기 전에 HTTP 캐시를 검사한다. 캐시에 일치하는 fresh response가 있으면 이를 반환한다. stale-while-revalidate response가 있으면 반환 후 조건부 네트워크 fetch로 캐시를 갱신한다. stale response가 있으면 조건부 네트워크 fetch로 캐시를 갱신한다. 없으면 조건 없는 네트워크 fetch로 캐시를 갱신한다. [HTTP] [HTTP-CACHING] [STALE-WHILE-REVALIDATE]
- "
no-store
" - fetch는 HTTP 캐시가 전혀 없는 것처럼 동작한다.
- "
reload
" - fetch는 네트워크로 가기 전 HTTP 캐시가 없는 것처럼 동작한다. 즉, 일반 요청을 만들고, 응답으로 캐시를 갱신한다.
- "
no-cache
" - HTTP 캐시에 응답이 있으면 조건부 요청을, 없으면 일반 요청을 만든다. 그런 뒤 응답으로 캐시를 갱신한다.
- "
force-cache
" - HTTP 캐시에 해당 요청에 일치하는 응답이 있으면 무조건 사용한다(오래됐는지 신경쓰지 않음). 없으면 일반 요청을 만들고, 응답으로 캐시를 갱신한다.
- "
only-if-cached
" - HTTP 캐시에 해당 요청에 일치하는 응답이 있으면 무조건 사용한다(오래됐는지 신경쓰지 않음). 없으면 네트워크 오류를 반환한다. (요청의 mode가
"
same-origin
"일 때만 사용 가능. 캐시된 리다이렉트는 redirect mode가 "follow
"이고 리다이렉트가 mode를 위반하지 않으면 따라감.)
헤더
목록이 다음 중
하나를 포함하면:
`If-Modified-Since
`,
`If-None-Match
`,
`If-Unmodified-Since
`,
`If-Match
`, 또는
`If-Range
`,
fetch는
cache
mode가 "default
"라면 "no-store
"로 설정한다.
요청은
연관된
redirect mode를 가진다.
값은 "follow
", "error
", "manual
" 중 하나이며, 별도 언급이 없으면
"follow
"이다.
- "
follow
" - 리소스를 패칭할 때 발생하는 모든 리다이렉트를 따른다.
- "
error
" - 요청이 리다이렉트에 부딪히면 네트워크 오류(network error)를 반환한다.
- "
manual
" - 요청이 리다이렉트에 부딪히면 서비스 워커가 오프라인으로 리다이렉트를 재생할 수 있도록 opaque-redirect 필터링된 응답을 가져온다. 이 응답은 네트워크 오류와 구별할 수 없다. (원자적 HTTP 리다이렉트 처리를 위반하지 않기 위해.)
요청은 연관된 integrity metadata (문자열)을 가진다. 별도 언급이 없으면 빈 문자열이다.
요청은 연관된 암호학적 nonce metadata(cryptographic nonce metadata) (문자열)을 가진다. 별도 언급이 없으면 빈 문자열이다.
요청은
연관된
파서 메타데이터(parser metadata)
를 가진다. 값은 빈 문자열, "parser-inserted
", "not-parser-inserted
" 중 하나이며, 별도 언급이 없으면 빈
문자열이다.
요청의 암호학적 nonce metadata와 파서 메타데이터는 일반적으로 해당 요청을 생성한 HTML 요소의 속성 및 플래그에서 채워진다. 이는 콘텐츠 보안 정책(Content Security Policy)의 여러 알고리즘에서 특정 맥락에서 요청 또는 응답을 차단할지 판단하는 데 사용된다. [CSP]
요청은 연관된 reload-navigation 플래그 를 가진다. 별도 언급이 없으면 설정되지 않은 상태다.
이 플래그는 HTML의 navigate 알고리즘에서만 사용된다. [HTML]
요청은 연관된 history-navigation 플래그 를 가진다. 별도 언급이 없으면 설정되지 않은 상태다.
이 플래그는 HTML의 navigate 알고리즘에서만 사용된다. [HTML]
요청은 연관된 불리언 user-activation 을 가진다. 별도 언급이 없으면 false다.
이 값은 HTML의 navigate 알고리즘에서만 사용된다.