๐ŸŒ US-Proxy
class="h-entry status-LS">

ํŒจ์น˜

ํ˜„ํ–‰ ํ‘œ์ค€ โ€” ๋งˆ์ง€๋ง‰ ๊ฐฑ์‹ 

์ฐธ์—ฌ:
GitHub whatwg/fetch (์ƒˆ ์ด์Šˆ, ์—ด๋ฆฐ ์ด์Šˆ)
Matrix์—์„œ ์ฑ„ํŒ…
์ปค๋ฐ‹:
GitHub whatwg/fetch/commits
์ด ์ปค๋ฐ‹ ๊ธฐ์ค€ ์Šค๋ƒ…์ƒท
ํ…Œ์ŠคํŠธ:
web-platform-tests fetch/ (์ง„ํ–‰ ์ค‘ ์ž‘์—…)
๋ฒˆ์—ญ (๋น„๊ทœ๋ฒ”์ ):
ๆ—ฅๆœฌ่ชž
็ฎ€ไฝ“ไธญๆ–‡
ํ•œ๊ตญ์–ด

์š”์•ฝ

ํŒจ์น˜ ํ‘œ์ค€์€ ์š”์ฒญ, ์‘๋‹ต, ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ณผ์ •์ธ ํŒจ์นญ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

๋ชฉํ‘œ

์ด ํ‘œ์ค€์˜ ๋ชฉํ‘œ๋Š” ์›น ํ”Œ๋žซํผ ์ „๋ฐ˜์— ๊ฑธ์ณ ํŒจ์นญ์„ ํ†ตํ•ฉํ•˜๊ณ , ์ด์— ๊ด€๋ จ๋œ ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด ์ผ๊ด€๋œ ์ฒ˜๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค:

์ด๋ฅผ ์œ„ํ•ด 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, ๊ทธ๋ฆฌ๊ณ  WebTransport์—์„œ ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. [ABNF] [ENCODING] [HTML] [HTTP] [MIMESNIFF] [STREAMS] [URL] [WEBIDL] [WEBSOCKETS] [WEBTRANSPORT]

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)
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์„ ๋ฐ›์•„ ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. Assert: controller์˜ report timing steps๊ฐ€ null์ด ์•„๋‹˜์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  2. controller์˜ report timing steps๋ฅผ global๊ณผ ํ•จ๊ป˜ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ • fetch controller controller์— ๋Œ€ํ•ด ๋‹ค์Œ ์ˆ˜๋™ ๋ฆฌ๋””๋ ‰ํŠธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ ค๋ฉด:

  1. Assert: controller์˜ next manual redirect steps๊ฐ€ null์ด ์•„๋‹˜์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  2. controller์˜ next manual redirect steps๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

fetch controller controller์— ๋Œ€ํ•ด ์ „์ฒด ํƒ€์ด๋ฐ ์ •๋ณด ์ถ”์ถœ์„ ํ•˜๋ ค๋ฉด:

  1. Assert: controller์˜ full timing info๊ฐ€ null์ด ์•„๋‹˜์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  2. controller์˜ full timing info๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ • fetch controller controller์— ๋Œ€ํ•ด ์„ ํƒ์  error์™€ ํ•จ๊ป˜ abort ํ•˜๋ ค๋ฉด:

  1. controller์˜ state๋ฅผ "aborted"๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. fallbackError๋ฅผ "AbortError" DOMException์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. error๊ฐ€ ์ฃผ์–ด์ง€์ง€ ์•Š์•˜๋‹ค๋ฉด fallbackError๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. serializedError๋ฅผ StructuredSerialize(error)๋กœ ๋‘ก๋‹ˆ๋‹ค. ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด serializedError๋ฅผ StructuredSerialize(fallbackError)๋กœ ๋‘ก๋‹ˆ๋‹ค.

  5. controller์˜ serialized abort reason์„ serializedError๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

null ๋˜๋Š” Record abortReason ๋ฐ realm realm์ด ์ฃผ์–ด์กŒ์„ ๋•Œ serialize๋œ abort reason ์—ญ์ง๋ ฌํ™”๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. fallbackError๋ฅผ "AbortError" DOMException์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. deserializedError๋ฅผ fallbackError๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. abortReason์ด null์ด ์•„๋‹ˆ๋ฉด, deserializedError๋ฅผ StructuredDeserialize(abortReason, realm)๋กœ ๋‘ก๋‹ˆ๋‹ค. ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ undefined๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด deserializedError๋ฅผ fallbackError๋กœ ๋‘ก๋‹ˆ๋‹ค.

  4. 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)
DOMHighResTimeStamp.
final connection timing info (๊ธฐ๋ณธ๊ฐ’ null)
Null ๋˜๋Š” connection timing info.
์„œ๋น„์Šค ์›Œ์ปค ํƒ€์ด๋ฐ ์ •๋ณด (๊ธฐ๋ณธ๊ฐ’ null)
Null ๋˜๋Š” ์„œ๋น„์Šค ์›Œ์ปค ํƒ€์ด๋ฐ ์ •๋ณด.
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 ๋ฌธ์ž์—ด.

๋ถˆํˆฌ๋ช… ํƒ€์ด๋ฐ ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด, ํŽ˜์น˜ ํƒ€์ด๋ฐ ์ •๋ณด timingInfo๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ƒˆ๋กœ์šด ํŽ˜์น˜ ํƒ€์ด๋ฐ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํ•ด๋‹น ์ •๋ณด์˜ ์‹œ์ž‘ ์‹œ๊ฐ„๊ณผ ๋ฆฌ๋””๋ ‰์…˜ ํ›„ ์‹œ์ž‘ ์‹œ๊ฐ„์€ timingInfo์˜ ์‹œ์ž‘ ์‹œ๊ฐ„์ด๊ณ , ์ข…๋ฃŒ ์‹œ๊ฐ„์€ timingInfo์˜ ์ข…๋ฃŒ ์‹œ๊ฐ„์ด๋ฉฐ, ๋ Œ๋”๋ง ์ฐจ๋‹จ์€ timingInfo์˜ ๋ Œ๋”๋ง ์ฐจ๋‹จ์ด๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜ algorithm, global object ๋˜๋Š” parallel queue taskDestination์ด ์ฃผ์–ด์กŒ์„ ๋•Œ fetch ํƒœ์Šคํฌ ํ์ž‰(queue a fetch task)์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. taskDestination์ด parallel queue๋ผ๋ฉด, enqueue algorithm์„ taskDestination์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ๊ธ€๋กœ๋ฒŒ ํƒœ์Šคํฌ(global task)๋ฅผ networking task source์— taskDestination๊ณผ algorithm์œผ๋กœ ํ์ž‰ํ•ฉ๋‹ˆ๋‹ค.

ํ™˜๊ฒฝ ์„ค์ • ๊ฐ์ฒด environment ์˜คํ”„๋ผ์ธ ์—ฌ๋ถ€ ํ™•์ธ:


์ •์ˆ˜ ์ง๋ ฌํ™”(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. positionStart๋ฅผ position์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. value๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. Assert: input์˜ position์— ์žˆ๋Š” ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ U+0022 (")์ž„์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  4. position์„ 1๋งŒํผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.

  5. ๋‹ค์Œ์ด ์ฐธ์ธ ๋™์•ˆ:

    1. U+0022 (") ๋˜๋Š” U+005C (\)๊ฐ€ ์•„๋‹Œ ์ฝ”๋“œ ํฌ์ธํŠธ ์‹œํ€€์Šค ์ˆ˜์ง‘ ๊ฒฐ๊ณผ๋ฅผ input, position์œผ๋กœ๋ถ€ํ„ฐ value์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    2. position์ด input์˜ ๋์„ ์ง€๋‚œ ๊ฒฝ์šฐ, breakํ•ฉ๋‹ˆ๋‹ค.

    3. quoteOrBackslash๋ฅผ input์˜ position์— ์žˆ๋Š” ์ฝ”๋“œ ํฌ์ธํŠธ๋กœ ๋‘ก๋‹ˆ๋‹ค.

    4. position์„ 1๋งŒํผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.

    5. quoteOrBackslash๊ฐ€ U+005C (\)์ด๋ฉด:

      1. position์ด input์˜ ๋์„ ์ง€๋‚œ ๊ฒฝ์šฐ U+005C (\)๋ฅผ value์— ์ถ”๊ฐ€ํ•˜๊ณ  breakํ•ฉ๋‹ˆ๋‹ค.

      2. input์˜ position์— ์žˆ๋Š” ์ฝ”๋“œ ํฌ์ธํŠธ๋ฅผ value์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

      3. position์„ 1๋งŒํผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.

    6. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ:

      1. Assert: quoteOrBackslash๊ฐ€ U+0022 (")์ž„์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

      2. Break.

  6. extract-value๊ฐ€ true๋ผ๋ฉด value๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  7. input์˜ positionStart๋ถ€ํ„ฐ 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_string์€ value, header_type์€ type์ž…๋‹ˆ๋‹ค.

  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)ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋Š” ํ—ค๋” ์ด๋ฆ„ name์ด list์— ํฌํ•จ๋œ ํ—ค๋” ์ค‘ name์ด ๋ฐ”์ดํŠธ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์—†์ด name๊ณผ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์ด ์žˆ๋Š”์ง€๋กœ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์ ธ์˜ค๊ธฐ(get)๋Š” ํ—ค๋” ์ด๋ฆ„ name๊ณผ ํ—ค๋” ๋ชฉ๋ก list๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” null ๋˜๋Š” ํ—ค๋” ๊ฐ’์ž…๋‹ˆ๋‹ค.

  1. list๊ฐ€ name์„ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. list์—์„œ ํ—ค๋” ์ค‘ name์ด ๋ฐ”์ดํŠธ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์—†์ด name๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ๊ฐ’์„ 0x2C 0x20(์‰ผํ‘œ+๊ณต๋ฐฑ)์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์ ธ์˜ค๊ธฐ, ๋””์ฝ”๋“œ ๋ฐ ๋ถ„ํ• (get, decode, and split) ์€ ํ—ค๋” ์ด๋ฆ„ name๊ณผ ํ—ค๋” ๋ชฉ๋ก list๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” null ๋˜๋Š” ๋ฆฌ์ŠคํŠธ ( ๋ฌธ์ž์—ด(string) )์ž…๋‹ˆ๋‹ค.

  1. value๋ฅผ name์„ ๊ฐ€์ ธ์˜จ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. value๊ฐ€ null์ด๋ฉด null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. get, decode, and split์„ value์— ์ ์šฉํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ 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์— ๋Œ€ํ•ด ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜ ๊ฐ’์€ ๋ฌธ์ž์—ด๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

  1. input์„ isomorphic decoding value ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. position์„ ์œ„์น˜ ๋ณ€์ˆ˜(position variable)๋กœ, input์˜ ์‹œ์ž‘ ์œ„์น˜๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. values๋ฅผ ๋ฌธ์ž์—ด๋ฆฌ์ŠคํŠธ๋กœ, ์ฒ˜์Œ์—๋Š” ยซ ยป๋กœ ๋‘ก๋‹ˆ๋‹ค.

  4. temporaryValue๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ๋‘ก๋‹ˆ๋‹ค.

  5. ๋‹ค์Œ์ด ์ฐธ์ธ ๋™์•ˆ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค:

    1. U+0022 (") ๋˜๋Š” U+002C (,)๊ฐ€ ์•„๋‹Œ ์ฝ”๋“œ ํฌ์ธํŠธ ์‹œํ€€์Šค ์ˆ˜์ง‘ ๊ฒฐ๊ณผ๋ฅผ input, position์œผ๋กœ๋ถ€ํ„ฐ temporaryValue์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

      ์ด ๊ฒฐ๊ณผ๋Š” ๋นˆ ๋ฌธ์ž์—ด์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    2. position์ด input์˜ ๋์„ ์ง€๋‚˜์ง€ ์•Š์•˜๊ณ , position ์œ„์น˜์˜ ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ U+0022 (")์ด๋ฉด:

      1. temporaryValue์— HTTP ๋”ฐ์˜ดํ‘œ ๋ฌธ์ž์—ด ์ˆ˜์ง‘ ๊ฒฐ๊ณผ๋ฅผ input, position์œผ๋กœ๋ถ€ํ„ฐ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

      2. position์ด ๋์„ ์ง€๋‚˜์ง€ ์•Š์•˜๋‹ค๋ฉด continueํ•ฉ๋‹ˆ๋‹ค.
    3. temporaryValue์˜ ์‹œ์ž‘๊ณผ ๋์—์„œ HTTP ํƒญ ๋˜๋Š” ๊ณต๋ฐฑ์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    4. Append temporaryValue๋ฅผ values์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    5. temporaryValue๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    6. position์ด input์˜ ๋์„ ์ง€๋‚ฌ๋‹ค๋ฉด values๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    7. Assert: input์˜ position ์œ„์น˜์˜ ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ U+002C (,)์ž„์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    8. position์„ 1๋งŒํผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.

ํŠน์ • ํ—ˆ์šฉ๋œ ํ˜ธ์ถœ์ง€(blessed call sites)๋ฅผ ์ œ์™ธํ•˜๊ณ , ์œ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ง์ ‘ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  get, decode, and split์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

append๋Š” ํ—ค๋”(header) (name, value)๋ฅผ ํ—ค๋” ๋ชฉ๋ก(header list) list์— ์ถ”๊ฐ€ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค:

  1. list๊ฐ€ name์„ ํฌํ•จํ•˜๋ฉด, 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. list๊ฐ€ name์„ ํฌํ•จํ•˜๋ฉด, ์ฒซ ๋ฒˆ์งธ ํ•ด๋‹น ํ—ค๋”(header)์˜ ๊ฐ’(value)์„ value๋กœ ์„ค์ •ํ•˜๊ณ , ๋‚˜๋จธ์ง€ ํ•ด๋‹น ํ—ค๋”๋“ค์€ ์ œ๊ฑฐํ•œ๋‹ค.

  2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, append (name, value)๋ฅผ list์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

combine์€ ํ—ค๋”(header) (name, value)๋ฅผ ํ—ค๋” ๋ชฉ๋ก(header list) list์— ๊ฒฐํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค:

  1. list๊ฐ€ name์„ ํฌํ•จํ•˜๋ฉด, ์ฒซ ๋ฒˆ์งธ ํ•ด๋‹น ํ—ค๋”์˜ value ๋’ค์— 0x2C 0x20(์‰ผํ‘œ+๊ณต๋ฐฑ), value๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์ด์–ด๋ถ™์ž…๋‹ˆ๋‹ค.

  2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, append (name, value)๋ฅผ list์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

combine์€ XMLHttpRequest ๋ฐ WebSocket ํ”„๋กœํ† ์ฝœ ํ•ธ๋“œ์…ฐ์ดํฌ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

ํ—ค๋” ์ด๋ฆ„์„ ์ •๋ ฌ๋œ ์†Œ๋ฌธ์ž ์ง‘ํ•ฉ์œผ๋กœ ๋ณ€ํ™˜(convert header names to a sorted-lowercase set)ํ•˜๋ ค๋ฉด, ๋ฆฌ์ŠคํŠธ(list)์˜ ์ด๋ฆ„๋“ค headerNames๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๊ฐ’์€ ์ˆœ์„œ ์žˆ๋Š” ์ง‘ํ•ฉ(ordered set)์˜ ํ—ค๋” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

  1. headerNamesSet์„ ์ƒˆ๋กœ์šด ์ˆœ์„œ ์žˆ๋Š” ์ง‘ํ•ฉ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. ๊ฐ name์— ๋Œ€ํ•ด, ๋ฐ”์ดํŠธ ์†Œ๋ฌธ์žํ™”(byte-lowercasing) name์„ headerNamesSet์— appendํ•ฉ๋‹ˆ๋‹ค.

  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. values๋ฅผ list์—์„œ ํ—ค๋” ์ค‘ name์ด ๋ฐ”์ดํŠธ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์—†์ด name๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ๊ฐ’์˜ ๋ฆฌ์ŠคํŠธ๋กœ ๋‘ก๋‹ˆ๋‹ค.

      2. ๊ฐ value์— ๋Œ€ํ•ด Append (name, value)๋ฅผ headers์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    2. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ:

      1. value๋ฅผ list์—์„œ 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`

    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`
    1. value์— CORS-๋น„์•ˆ์ „ ์š”์ฒญ ํ—ค๋” ๋ฐ”์ดํŠธ๊ฐ€ ์žˆ์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    2. mimeType์„ ํŒŒ์‹ฑ(parsing)ํ•œ ๋“ฑ๊ฐ€ ๋””์ฝ”๋”ฉ(isomorphic decoding) value ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

    3. mimeType์ด ์‹คํŒจ(failure)๋ผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    4. 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`
    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. ๊ฐ headers์˜ header์— ๋Œ€ํ•ด:

    1. header๊ฐ€ CORS-์•ˆ์ „ ๋ชฉ๋ก ์š”์ฒญ ํ—ค๋”๊ฐ€ ์•„๋‹ˆ๋ฉด, append header์˜ name์„ unsafeNames์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    2. ๊ทธ ๋ฐ–์˜ ๊ฒฝ์šฐ, header์˜ name์„ potentiallyUnsafeNames์— ์ถ”๊ฐ€ํ•˜๊ณ , safelistValueSize์— header์˜ value์˜ ๊ธธ์ด๋งŒํผ ๋”ํ•ฉ๋‹ˆ๋‹ค.

  5. safelistValueSize๊ฐ€ 1024๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ๊ฐ potentiallyUnsafeNames์˜ name์„ append๋กœ unsafeNames์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  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. name์ด no-CORS-์•ˆ์ „ ๋ชฉ๋ก ์š”์ฒญ ํ—ค๋” ์ด๋ฆ„์ด ์•„๋‹ˆ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. (name, value)๊ฐ€ CORS-์•ˆ์ „ ๋ชฉ๋ก ์š”์ฒญ ํ—ค๋”์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ํ—ค๋” (name, value)๊ฐ€ ๊ธˆ์ง€๋œ ์š”์ฒญ ํ—ค๋”(forbidden request-header)์ธ์ง€ ํŒ๋‹จํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๊ฐ€ true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค:

  1. name์ด ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์™€ ๋ฐ”์ดํŠธ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์—†์ด ์ผ์น˜ํ•˜๋ฉด:

    true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. name์„ ๋ฐ”์ดํŠธ ์†Œ๋ฌธ์žํ™”ํ•˜์—ฌ, proxy- ๋˜๋Š” sec-์œผ๋กœ ์‹œ์ž‘ํ•˜๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. name์ด ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์™€ ๋ฐ”์ดํŠธ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์—†์ด ์ผ์น˜ํ•˜๋ฉด:

    • `X-HTTP-Method`
    • `X-HTTP-Method-Override`
    • `X-Method-Override`

    ๋‹ค์Œ ์ ˆ์ฐจ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

    1. parsedValues๋ฅผ get, decode, and split value์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. ๊ฐ parsedValues์˜ method์— ๋Œ€ํ•ด, isomorphic encodingํ•œ method๊ฐ€ ๊ธˆ์ง€๋œ ๋ฉ”์„œ๋“œ(forbidden method)๋ผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ด ํ—ค๋”๋“ค์€ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๊ฐ€ ์™„์ „ํžˆ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ธˆ์ง€๋ฉ๋‹ˆ๋‹ค.

ํ—ค๋” ์ด๋ฆ„์ด `Sec-`๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ, ํ—ค๋”๊ฐ€ fetch ๋“ฑ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ—ค๋”๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” API์— ์˜ํ•ด ์‚ฌ์šฉ๋  ๋•Œ, ์ƒˆ ํ—ค๋”๊ฐ€ ์•ˆ์ „ํ•˜๊ฒŒ ๋„์ž…๋  ์ˆ˜ ์žˆ๋„๋ก ์˜ˆ์•ฝ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ: XMLHttpRequest. [XHR]

`Set-Cookie` ํ—ค๋”๋Š” ์˜๋ฏธ์ƒ ์‘๋‹ต ํ—ค๋”์ด๋ฏ€๋กœ ์š”์ฒญ์—์„œ๋Š” ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. `Set-Cookie` ํ—ค๋”๋Š” ๊ฒฐํ•ฉ(combine)๋  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, Headers ๊ฐ์ฒด์—์„œ ๋” ๋ณต์žกํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ธˆ์ง€ํ•˜๋Š” ์ด์œ ๋Š” ์ด ๋ณต์žก์„ฑ์ด ์š”์ฒญ์œผ๋กœ ์ƒˆ์–ด ๋‚˜๊ฐ€๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

๊ธˆ์ง€๋œ ์‘๋‹ต ํ—ค๋” ์ด๋ฆ„(forbidden response-header name)์€ ํ—ค๋” ์ด๋ฆ„ ์ค‘ ๋ฐ”์ดํŠธ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์—†์ด ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์™€ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค:

์š”์ฒญ ๋ณธ๋ฌธ ํ—ค๋” ์ด๋ฆ„(request-body-header name)์€ ํ—ค๋” ์ด๋ฆ„ ์ค‘ ๋ฐ”์ดํŠธ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์—†์ด ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์™€ ์ผ์น˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค:


ํ—ค๋” ๊ฐ’ ์ถ”์ถœ(extract header values) ์€ ํ—ค๋”(header) header๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. header์˜ value๋ฅผ ABNF ๊ธฐ์ค€์œผ๋กœ header์˜ name์— ๋Œ€ํ•ด ํŒŒ์‹ฑ์— ์‹คํŒจํ•˜๋ฉด failure๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. header ์˜ name ์— ๋Œ€ํ•œ ABNF ์— ๋”ฐ๋ผ header ์˜ value ๋ฅผ ํŒŒ์‹ฑํ•˜์—ฌ ๋‚˜์˜จ ํ•˜๋‚˜ ์ด์ƒ์˜ ๊ฐ’ ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ํ—ค๋” ๋ชฉ๋ก ๊ฐ’ ์ถ”์ถœ(extract header list values) ์€ ํ—ค๋” ์ด๋ฆ„ name๊ณผ ํ—ค๋” ๋ชฉ๋ก(header list) list๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. list๊ฐ€ name์„ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. name์— ๋Œ€ํ•œ ABNF๊ฐ€ ๋‹จ์ผ ํ—ค๋”(header)๋งŒ ํ—ˆ์šฉํ•˜๊ณ , list๊ฐ€ name์„ ์ค‘๋ณต ํฌํ•จํ•˜๋ฉด failure๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    ๋‹ค๋ฅธ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด, ๋จผ์ € ์›ํ•˜๋Š” ํ—ค๋”๋ฅผ ์ถ”์ถœํ•˜์„ธ์š”.

  3. values๋ฅผ ๋นˆ ๋ฆฌ์ŠคํŠธ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  4. list ์— ํฌํ•จ๋œ ๊ฐ ํ—ค๋” header ์ค‘ ์ด๋ฆ„ ์ด name ์ธ ํ—ค๋”์— ๋Œ€ํ•ด:

    1. extract๋ฅผ ํ—ค๋” ๊ฐ’ ์ถ”์ถœ์„ header์— ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. extract๊ฐ€ failure๋ฉด failure๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    3. extract์˜ ๊ฐ ๊ฐ’์„ ์ˆœ์„œ๋Œ€๋กœ values์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  5. values๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ฝ˜ํ…์ธ  ๋ฒ”์œ„ ์ƒ์„ฑ(build a content range)์€ ์ •์ˆ˜ rangeStart, ์ •์ˆ˜ rangeEnd, ์ •์ˆ˜ fullLength๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. contentRange๋ฅผ `bytes `๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. rangeStart๋ฅผ ์ง๋ ฌํ™” ๋ฐ ๋“ฑ๊ฐ€ ์ธ์ฝ”๋”ฉ(isomorphic encoded) ํ•˜์—ฌ contentRange์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  3. 0x2D (-)๋ฅผ contentRange์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  4. rangeEnd๋ฅผ ์ง๋ ฌํ™” ๋ฐ ๋“ฑ๊ฐ€ ์ธ์ฝ”๋”ฉ ํ•˜์—ฌ contentRange์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  5. 0x2F (/)๋ฅผ contentRange์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  6. fullLength๋ฅผ ์ง๋ ฌํ™” ๋ฐ ๋“ฑ๊ฐ€ ์ธ์ฝ”๋”ฉ ํ•˜์—ฌ contentRange์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  7. contentRange๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ผ range ํ—ค๋” ๊ฐ’ ํŒŒ์‹ฑ(parse a single range header value)์€ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค value์™€ ๋ถˆ๋ฆฌ์–ธ allowWhitespace๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. data๋ฅผ ๋“ฑ๊ฐ€ ๋””์ฝ”๋”ฉ(isomorphic decoding) value ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. data๊ฐ€ "bytes"๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š์œผ๋ฉด failure๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. position์„ ์œ„์น˜ ๋ณ€์ˆ˜(position variable)๋กœ, data์˜ 5๋ฒˆ์งธ ์ฝ”๋“œ ํฌ์ธํŠธ ์œ„์น˜๋กœ ๋‘ก๋‹ˆ๋‹ค.

  4. allowWhitespace ๊ฐ€ true๋ผ๋ฉด data ์™€ position ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ HTTP ํƒญ ๋˜๋Š” ๊ณต๋ฐฑ ์ธ ์ฝ”๋“œ ํฌ์ธํŠธ ์‹œํ€€์Šค๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค .

  5. data์˜ position ์œ„์น˜ ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ U+003D (=)๊ฐ€ ์•„๋‹ˆ๋ฉด failure๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  6. position์„ 1๋งŒํผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.

  7. allowWhitespace ๊ฐ€ true๋ผ๋ฉด data ์™€ position ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ HTTP ํƒญ ๋˜๋Š” ๊ณต๋ฐฑ ์ธ ์ฝ”๋“œ ํฌ์ธํŠธ ์‹œํ€€์Šค๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค .

  8. rangeStart ๋ฅผ data ์™€ position ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ASCII ์ˆซ์ž ์ธ ์ฝ”๋“œ ํฌ์ธํŠธ ์‹œํ€€์Šค๋ฅผ ์ˆ˜์ง‘ ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  9. rangeStartValue๋ฅผ rangeStart๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ฉด 10์ง„์ˆ˜๋กœ ํ•ด์„ํ•œ ๊ฐ’, ์•„๋‹ˆ๋ฉด null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  10. allowWhitespace ๊ฐ€ true๋ผ๋ฉด data ์™€ position ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ HTTP ํƒญ ๋˜๋Š” ๊ณต๋ฐฑ ์ธ ์ฝ”๋“œ ํฌ์ธํŠธ ์‹œํ€€์Šค๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค .

  11. data์˜ position ์œ„์น˜ ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ U+002D (-)๊ฐ€ ์•„๋‹ˆ๋ฉด failure๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  12. position์„ 1๋งŒํผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.

  13. allowWhitespace ๊ฐ€ true๋ผ๋ฉด data ์™€ position ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ HTTP ํƒญ ๋˜๋Š” ๊ณต๋ฐฑ ์ธ ์ฝ”๋“œ ํฌ์ธํŠธ ์‹œํ€€์Šค๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค .

  14. rangeEnd ๋ฅผ data ์™€ position ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ASCII ์ˆซ์ž ์ธ ์ฝ”๋“œ ํฌ์ธํŠธ ์‹œํ€€์Šค๋ฅผ ์ˆ˜์ง‘ ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  15. rangeEndValue๋ฅผ rangeEnd๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ฉด 10์ง„์ˆ˜๋กœ ํ•ด์„ํ•œ ๊ฐ’, ์•„๋‹ˆ๋ฉด null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  16. position์ด data์˜ ๋์„ ์ง€๋‚˜์ง€ ์•Š์•˜๋‹ค๋ฉด failure๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  17. rangeEndValue์™€ rangeStartValue๊ฐ€ ๋ชจ๋‘ null์ด๋ฉด failure๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  18. rangeStartValue์™€ rangeEndValue๊ฐ€ ๋ชจ๋‘ ์ˆซ์ž์ด๊ณ , rangeStartValue๊ฐ€ rangeEndValue๋ณด๋‹ค ํฌ๋ฉด failure๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  19. (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 (`๋กœ ์‹œ์ž‘ํ•˜๋„๋ก ํ•˜๊ณ , ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค๋ฅธ ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋”ฐ๋ผํ•˜๋„๋ก ๊ฐ•ํ•˜๊ฒŒ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.

environment settings object environment์˜ environment default `User-Agent` value๋ฅผ ์–ป์œผ๋ ค๋ฉด:

  1. userAgent๋ฅผ WebDriver BiDi emulated User-Agent๋กœ environment์— ๋Œ€ํ•ด ์„ค์ •ํ•œ๋‹ค.

  2. userAgent๊ฐ€ null์ด ์•„๋‹ˆ๋ผ๋ฉด, userAgent๋ฅผ isomorphic encoded๋œ ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. default `User-Agent` value๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋ฌธ์„œ `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๊นŒ์ง€(ํฌํ•จ)์˜ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

๋ฒ”์œ„ ์ƒํƒœ๋Š” 206 ๋˜๋Š” 416์ธ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

๋ฆฌ๋””๋ ‰์…˜ ์ƒํƒœ๋Š” 301, 302, 303, 307 ๋˜๋Š” 308์ธ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

2.2.4. ๋ณธ๋ฌธ

๋ณธ๋ฌธ(body)์€ ๋‹ค์Œ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค:

๋ณต์ œ(clone)๋ฅผ ๋ณธ๋ฌธ body์— ๋Œ€ํ•ด ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค:

  1. ยซ out1, out2 ยป๋ฅผ teeing body์˜ ์ŠคํŠธ๋ฆผ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. body์˜ ์ŠคํŠธ๋ฆผ์„ out1์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. ๋‚˜๋จธ์ง€ ๋ฉค๋ฒ„๋Š” body์—์„œ ๋ณต์‚ฌํ•˜๊ณ , ๋ณธ๋ฌธ์˜ ์ŠคํŠธ๋ฆผ๋งŒ out2๋กœ ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ”์ดํŠธ ์‹œํ€€์Šค 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๋Š” ์˜ˆ์™ธ๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. taskDestination์ด null์ด๋ฉด ์ƒˆ parallel queue ์‹œ์ž‘ ๊ฒฐ๊ณผ๋ฅผ taskDestination๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. reader๋ฅผ ๋ฆฌ๋”(getting a reader)๋กœ body์˜ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•ด ๊ตฌํ•ฉ๋‹ˆ๋‹ค.

    ์ด ๋™์ž‘์€ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  3. ์ ์ง„์  ์ฝ๊ธฐ ๋ฃจํ”„(incrementally-read loop)๋ฅผ reader, taskDestination, processBodyChunk, processEndOfBody, processBodyError๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ ์ง„์  ์ฝ๊ธฐ ๋ฃจํ”„(incrementally-read loop)๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด, ReadableStreamDefaultReader ๊ฐ์ฒด reader, parallel queue ๋˜๋Š” global object taskDestination, ์•Œ๊ณ ๋ฆฌ์ฆ˜ processBodyChunk, ์•Œ๊ณ ๋ฆฌ์ฆ˜ processEndOfBody, ์•Œ๊ณ ๋ฆฌ์ฆ˜ processBodyError๊ฐ€ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค:

  1. readRequest๋ฅผ ๋‹ค์Œ read request๋กœ ๋‘ก๋‹ˆ๋‹ค:

    chunk steps (chunk)
    1. continueAlgorithm์„ null๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. chunk๊ฐ€ Uint8Array ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, continueAlgorithm์„ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: processBodyError๋ฅผ TypeError์™€ ํ•จ๊ป˜ ์‹คํ–‰.

    3. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ:

      1. bytes๋ฅผ ๋ณต์‚ฌ(copy)๋œ chunk๋กœ ๋‘ก๋‹ˆ๋‹ค.

        ๊ตฌํ˜„์€ ์ด ๋ณต์‚ฌ๋ฅผ ํ”ผํ•˜๋Š” ์ „๋žต์„ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

      2. continueAlgorithm์„ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค:

        1. processBodyChunk๋ฅผ bytes๋กœ ์‹คํ–‰.

        2. ์ ์ง„์  ์ฝ๊ธฐ ๋ฃจํ”„๋ฅผ reader, taskDestination, processBodyChunk, processEndOfBody, processBodyError๋กœ ์žฌ๊ท€ ํ˜ธ์ถœ.

    4. fetch ํƒœ์Šคํฌ ํ์ž‰์„ continueAlgorithm, taskDestination์— ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    close steps
    1. fetch ํƒœ์Šคํฌ ํ์ž‰์„ processEndOfBody, taskDestination์— ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    error steps (e)
    1. fetch ํƒœ์Šคํฌ ํ์ž‰์„ processBodyError์— e์™€ taskDestination๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  2. ์ฒญํฌ ์ฝ๊ธฐ(Read a chunk)๋ฅผ reader์™€ readRequest๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์™„์ „ํžˆ ์ฝ๊ธฐ(fully read)๋Š” ๋ณธ๋ฌธ(body) body, ์•Œ๊ณ ๋ฆฌ์ฆ˜ processBody, ์•Œ๊ณ ๋ฆฌ์ฆ˜ processBodyError, ์˜ต์…˜์œผ๋กœ null, parallel queue ๋˜๋Š” global object taskDestination (๊ธฐ๋ณธ๊ฐ’ null)์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. processBody๋Š” ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์–ด์•ผ ํ•˜๋ฉฐ, processBodyError๋Š” ์˜ˆ์™ธ(์˜ต์…˜)๋ฅผ ์ธ์ž๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. taskDestination์ด null์ด๋ฉด ์ƒˆ parallel queue ์‹œ์ž‘ ๊ฒฐ๊ณผ๋ฅผ taskDestination๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. successSteps ๋ฅผ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค bytes ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ taskDestination ์„ ๋Œ€์ƒ์œผ๋กœ bytes ๋ฅผ ์ธ์ž๋กœ processBody ๋ฅผ ์‹คํ–‰ํ•˜๋Š” fetch ํƒœ์Šคํฌ๋ฅผ ํ์— ๋„ฃ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. errorSteps๋ฅผ fetch ํƒœ์Šคํฌ ํ์ž‰์„ processBodyError์— exception, taskDestination๋กœ ์‹คํ–‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  4. reader๋ฅผ ๋ฆฌ๋”(getting a reader)๋กœ body์˜ ์ŠคํŠธ๋ฆผ์— ๋Œ€ํ•ด ๊ตฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด errorSteps๋ฅผ ๊ทธ ์˜ˆ์™ธ์™€ ํ•จ๊ป˜ ์‹คํ–‰ํ•˜๊ณ  ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

  5. ๋ชจ๋“  ๋ฐ”์ดํŠธ ์ฝ๊ธฐ(Read all bytes)๋ฅผ reader, successSteps, errorSteps๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.


ํƒ€์ž…์ด ์žˆ๋Š” ๋ณธ๋ฌธ(body with type)์€ ํŠœํ”Œ๋กœ, ๋ณธ๋ฌธ(body) (body)๊ณผ ํƒ€์ž…(type) (ํ—ค๋” ๊ฐ’ ๋˜๋Š” null)์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.


์ฝ˜ํ…์ธ  ์ฝ”๋”ฉ ์ฒ˜๋ฆฌ(handle content codings)๋Š” codings์™€ bytes๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. codings๊ฐ€ ์ง€์›๋˜์ง€ ์•Š์œผ๋ฉด bytes๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. HTTP์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ codings๋กœ bytes๋ฅผ ๋””์ฝ”๋”ฉํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋””์ฝ”๋”ฉ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด failure๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. [HTTP]

2.2.5. ์š”์ฒญ

์ด ์ ˆ์€ ์š”์ฒญ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์ž์„ธํžˆ ๋ฌธ์„œํ™”ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์ž‘ํ•˜๋ ค๋ฉด ์š”์ฒญ ์„ค์ •์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

fetch์˜ ์ž…๋ ฅ๊ฐ’์€ ์š”์ฒญ(request)์ž…๋‹ˆ๋‹ค.

์š”์ฒญ์€ ์—ฐ๊ด€๋œ ๋ฉ”์„œ๋“œ(method)๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. (method) ๋ณ„๋„์˜ ์–ธ๊ธ‰์ด ์—†์œผ๋ฉด `GET`์ž…๋‹ˆ๋‹ค.

๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์ค‘ HTTP fetch์—์„œ ์„ค๋ช…๋œ ๋Œ€๋กœ `GET`์œผ๋กœ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์š”์ฒญ์€ ์—ฐ๊ด€๋œ URL (URL)์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

๊ตฌํ˜„์€ 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์ž…๋‹ˆ๋‹ค.

๋ฐ”์ดํŠธ ์‹œํ€€์Šค ๋Š” fetch ์ดˆ๊ธฐ์— ๋ณธ๋ฌธ ์œผ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ์ถ”์ถœ ๋ฉ๋‹ˆ๋‹ค. HTTP fetch ๊ณผ์ •์—์„œ ํŠน์ • ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋กœ ์ธํ•ด ์ด ํ•„๋“œ๊ฐ€ null๋กœ ์„ค์ •๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.


์š”์ฒญ์€ ์—ฐ๊ด€๋œ ํด๋ผ์ด์–ธํŠธ(client)๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. (null ๋˜๋Š” environment settings object)

์š”์ฒญ์—๋Š” ์—ฐ๊ฒฐ๋œ ์˜ˆ์•ฝ๋œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. (null ๋˜๋Š” ํ™˜๊ฒฝ). ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ null์ž…๋‹ˆ๋‹ค.

์ด๋Š” ํƒ์ƒ‰ ์š”์ฒญ ๋ฐ ์›Œ์ปค ์š”์ฒญ์—๋งŒ ์‚ฌ์šฉ๋˜๋ฉฐ, ์„œ๋น„์Šค ์›Œ์ปค ์š”์ฒญ์—๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์š”์ฒญ์—๋Š” ์—ฐ๊ฒฐ๋œ ๋Œ€์ฒด ํด๋ผ์ด์–ธํŠธ id๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(๋ฌธ์ž์—ด). ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ ๋นˆ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

์ด๋Š” ํƒ์ƒ‰ ์š”์ฒญ์—๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” id์ด๋ฉฐ, ๋Œ€์ƒ ๋ธŒ๋ผ์šฐ์ง• ์ปจํ…์ŠคํŠธ์˜ ํ™œ์„ฑ ๋ฌธ์„œ์˜ ํ™˜๊ฒฝ ์„ค์ • ๊ฐ์ฒด์˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์š”์ฒญ์—๋Š” ์—ฐ๊ฒฐ๋œ ์‚ฌ์šฉ์ž ํ”„๋กฌํ”„ํŠธ์šฉ ์ˆœํšŒ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ์ด ์žˆ์œผ๋ฉฐ, ์ด๋Š” "no-traversable", "client", ๋˜๋Š” ์ˆœํšŒ ๊ฐ€๋Šฅํ•œ ๋‚ด๋น„๊ฒŒ์ด๋ธ”์ž…๋‹ˆ๋‹ค. ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ "client"์ž…๋‹ˆ๋‹ค.

์ด๋Š” ์ธ์ฆ ํ”„๋กฌํ”„ํŠธ๋‚˜ ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ ๋Œ€ํ™” ์ƒ์ž์™€ ๊ฐ™์ด ์š”์ฒญ์— ํ•„์š”ํ•œ UI๋ฅผ ํ‘œ์‹œํ• ์ง€ ์—ฌ๋ถ€์™€ ํ‘œ์‹œํ•  ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

"no-traversable"
UI๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ์š”์ฒญ์€ ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.
"client"
์ด ๊ฐ’์€ ํŽ˜์น˜ํ•˜๋Š” ๋™์•ˆ ์š”์ฒญ์˜ ํด๋ผ์ด์–ธํŠธ์—์„œ ํŒŒ์ƒ๋œ "no-traversable" ๋˜๋Š” ์ˆœํšŒ ๊ฐ€๋Šฅํ•œ ๋‚ด๋น„๊ฒŒ์ด๋ธ” ์ค‘ ํ•˜๋‚˜๋กœ ์ž๋™ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ‘œ์ค€์—์„œ ์š”์ฒญ์˜ ์‚ฌ์šฉ์ž ํ”„๋กฌํ”„ํŠธ์šฉ ์ˆœํšŒ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ์„ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
์ˆœํšŒ ๊ฐ€๋Šฅํ•œ ๋‚ด๋น„๊ฒŒ์ด๋ธ”
ํ‘œ์‹œ๋˜๋Š” UI๋Š” ํ•ด๋‹น ์ˆœํšŒ ๊ฐ€๋Šฅํ•œ ๋‚ด๋น„๊ฒŒ์ด๋ธ”์„ ํ‘œ์‹œํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ € ์ธํ„ฐํŽ˜์ด์Šค ์š”์†Œ์™€ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

์š”์ฒญ์˜ ์‚ฌ์šฉ์ž ํ”„๋กฌํ”„ํŠธ์šฉ ์ˆœํšŒ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ์—์„œ ํ•ด๋‹น ์š”์ฒญ๊ณผ ์—ฐ๊ฒฐ๋œ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ‘œ์‹œํ•  ๋•Œ, ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ์ฃผ์†Œ ํ‘œ์‹œ์ค„์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์š”์ฒญ์˜ ํ˜„์žฌ URL์—์„œ ํŒŒ์ƒ๋œ ํ•ญ๋ชฉ์„ ํ‘œ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด ์š”์ฒญ ๊ฐœ์‹œ์ž์˜ URL์—์„œ ํŒŒ์ƒ๋œ ์ด์ „ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋‘์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค). ๋˜ํ•œ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ์š”์ฒญ์˜ ๊ฐœ์‹œ์ž์—์„œ ๊ฐ€์ ธ์˜จ ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฌ์šฉ์ž ํ”„๋กฌํ”„ํŠธ์šฉ ์ˆœํšŒ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ์— ํ‘œ์‹œํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์œผ๋ฉฐ, ํŠนํžˆ ๊ต์ฐจ ์ถœ์ฒ˜ ์š”์ฒญ์˜ ๊ฒฝ์šฐ ๊ทธ๋Ÿฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ”„๋กฌํ”„ํŠธ ๋’ค์— ๋นˆ ํŽ˜์ด์ง€๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๊ฒƒ์€ ์ด ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ง€์นจ์„ ๋”ฐ๋ฅด์ง€ ์•Š์œผ๋ฉด ์–ด๋–ค ์ถœ์ฒ˜๊ฐ€ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋‹ด๋‹นํ•˜๋Š”์ง€ ์‚ฌ์šฉ์ž๊ฐ€ ํ˜ผ๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์š”์ฒญ์—๋Š” ์—ฐ๊ฒฐ๋œ ๋ถˆ๋ฆฌ์–ธ keepalive๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ false์ž…๋‹ˆ๋‹ค.

์ด๋Š” ์š”์ฒญ์ด ํ™˜๊ฒฝ ์„ค์ • ๊ฐ์ฒด๋ณด๋‹ค ์˜ค๋ž˜ ์œ ์ง€๋˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 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", "text", "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, WebTransport, 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" }
"text" connect-src import "..." with { type: "text" }
"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๋ฅผ ๋ฎ์–ด์“ธ ๋•Œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

request๋Š” ์—ฐ๊ด€๋œ mode๋ฅผ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ, ์ด ๊ฐ’์€ "same-origin", "cors", "no-cors", "navigate", "websocket", ๋˜๋Š” "webtransport" ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๋ณ„๋„๋กœ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ, ๊ธฐ๋ณธ๊ฐ’์€ "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)์„ ์„ค์ •ํ•  ๋•Œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ํŠน์ˆ˜ ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค.
"webtransport"
์ด๊ฒƒ์€ WebTransport(url, options)์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ํŠน์ˆ˜ ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์š”์ฒญ์˜ 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 ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ๋งŒ ์‚ฌ์šฉ๋œ๋‹ค. [HTML]

request์—๋Š” WebDriver navigation id (null ๋˜๋Š” ๋ฌธ์ž์—ด)์ด ์—ฐ๊ด€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ, ์ด๋Š” null์ž…๋‹ˆ๋‹ค.

์ด ๊ฐ’์€ HTML์˜ navigate ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ๋งŒ ๋…์ ์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. [HTML]

request์—๋Š” boolean ํƒ€์ž…์˜ render-blocking์ด ์—ฐ๊ด€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ, ์ด๋Š” false์ž…๋‹ˆ๋‹ค.

์ด ํ”Œ๋ž˜๊ทธ๋Š” HTML์˜ render-blocking ๋ฉ”์ปค๋‹ˆ์ฆ˜์—์„œ๋งŒ ๋…์ ์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. [HTML]

request์—๋Š” WebTransport-hash list (WebTransport-hash list)๊ฐ€ ์—ฐ๊ด€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š์œผ๋ฉด ยซ ยป์ž…๋‹ˆ๋‹ค.

WebTransport-hash list๋Š” ๋ฆฌ์ŠคํŠธ๋กœ, 0๊ฐœ ์ด์ƒ์˜ WebTransport-hashes๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

WebTransport-hash๋Š” ํŠœํ”Œ์ด๋ฉฐ, algorithm (๋ฌธ์ž์—ด)๊ณผ value (๋ฐ”์ดํŠธ ์‹œํ€€์Šค)๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์ด ๋ฆฌ์ŠคํŠธ๋Š” WebTransport(url, options)๊ฐ€ options์— serverCertificateHashes ๋ฅผ ํฌํ•จํ•  ๋•Œ์—๋งŒ ๋…์ ์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.


request์—๋Š” URL list (ํ•˜๋‚˜ ์ด์ƒ์˜ URL๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฆฌ์ŠคํŠธ)๊ฐ€ ์—ฐ๊ด€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ, request์˜ URL์˜ ๋ณต์‚ฌ๋ณธ ํ•˜๋‚˜๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค.

์š”์ฒญ ์—๋Š” ์—ฐ๊ด€๋œ ํ˜„์žฌ URL ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์š”์ฒญ ์˜ URL ๋ฆฌ์ŠคํŠธ ์—์„œ ๋งˆ์ง€๋ง‰ URL ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ์ž…๋‹ˆ๋‹ค.

request์—๋Š” redirect count๊ฐ€ ์—ฐ๊ด€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ, ์ด๋Š” 0์ž…๋‹ˆ๋‹ค.

request์—๋Š” response tainting์ด ์—ฐ๊ด€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” "basic", "cors", "opaque" ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ, "basic"์ž…๋‹ˆ๋‹ค.

request์—๋Š” prevent no-cache cache-control header modification flag๊ฐ€ ์—ฐ๊ด€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ, ์ด๋Š” ์„ค์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

request์—๋Š” done flag๊ฐ€ ์—ฐ๊ด€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ, ์ด๋Š” ์„ค์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

request์—๋Š” timing allow failed flag๊ฐ€ ์—ฐ๊ด€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ, ์ด๋Š” ์„ค์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

A ์š”์ฒญ์—๋Š” ์—ฐ๊ด€๋œ ๋‚ด๋น„๊ฒŒ์ด์…˜ ํƒ€์ด๋ฐ ํ—ˆ์šฉ ๊ฐ’ ๋ชฉ๋ก(๋ชฉ๋ก์˜ ๋ชฉ๋ก์œผ๋กœ, ๋ฌธ์ž์—ด๋กœ ์ด๋ฃจ์–ด์ง)์ด ์žˆ๋‹ค. ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ, ์ด๋Š” ยซ ยป์ด๋‹ค.

ํ•ญ๋ชฉ ๊ฐ๊ฐ์€ ๋‚ด๋น„๊ฒŒ์ด์…˜ ํƒ€์ด๋ฐ ํ—ˆ์šฉ ๊ฐ’ ๋ชฉ๋ก์—์„œ ๋‚ด๋น„๊ฒŒ์ด์…˜์˜ ๋ฆฌ๋””๋ ‰์…˜ ์ฒด์ธ์— ์žˆ๋Š” ํ•˜๋‚˜์˜ ๋ฆฌ๋””๋ ‰์…˜ ์‘๋‹ต์˜ `Timing-Allow-Origin` ๊ฐ’์„ ๋ณด๊ด€ํ•œ๋‹ค.

์š”์ฒญ์˜ URL ๋ชฉ๋ก, ํ˜„์žฌ URL, ๋ฆฌ๋””๋ ‰์…˜ ํšŸ์ˆ˜, ์‘๋‹ต ์˜ค์—ผ, ์™„๋ฃŒ ํ”Œ๋ž˜๊ทธ, ํƒ€์ด๋ฐ ํ—ˆ์šฉ ์‹คํŒจ ํ”Œ๋ž˜๊ทธ, ๊ทธ๋ฆฌ๊ณ  ๋‚ด๋น„๊ฒŒ์ด์…˜ ํƒ€์ด๋ฐ ํ—ˆ์šฉ ๊ฐ’ ๋ชฉ๋ก์€ fetch ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์žฅ๋ถ€ ๊ธฐ์ž… ์„ธ๋ถ€ ์ •๋ณด๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

A ์š”์ฒญ์—๋Š” ์—ฐ๊ด€๋œ WebDriver id๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๋ฌด์ž‘์œ„ UUID๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋กœ, ์š”์ฒญ์ด ์ƒ์„ฑ๋  ๋•Œ ์„ค์ •๋œ๋‹ค. [WEBCRYPTO]

WebDriver id๋Š” WebDriver-BiDi์—์„œ ์‚ฌ์šฉ๋œ๋‹ค. ์ด๋Š” ๋ฆฌ๋””๋ ‰์…˜, ์ธ์ฆ ์‹œ๋„, ๊ทธ๋ฆฌ๊ณ  ์ตœ์ดˆ ์š”์ฒญ์˜ CORS-preflight fetch ์ „๋ฐ˜์— ๊ฑธ์ณ ์ผ์ •ํ•˜๊ฒŒ ์œ ์ง€๋œ๋‹ค. ์š”์ฒญ์ด ๋ณต์ œ๋  ๋•Œ, ์ƒ์„ฑ๋œ ์š”์ฒญ์€ ๊ณ ์œ ํ•œ WebDriver id๋ฅผ ๊ฐ–๋Š”๋‹ค. [WEBDRIVER-BIDI]


A ํ•˜์œ„ ๋ฆฌ์†Œ์Šค ์š”์ฒญ์€ ์š”์ฒญ์œผ๋กœ, ๊ทธ ๋ชฉ์ ์ง€๊ฐ€ "audio", "audioworklet", "font", "image", "json", "manifest", "paintworklet", "script", "style", "text", "track", "video", "xslt", ๋˜๋Š” ๋นˆ ๋ฌธ์ž์—ด์ธ ๊ฒƒ์ด๋‹ค.

A ๋น„-ํ•˜์œ„ ๋ฆฌ์†Œ์Šค ์š”์ฒญ์€ ์š”์ฒญ์œผ๋กœ, ๊ทธ ๋ชฉ์ ์ง€๊ฐ€ "document", "embed", "frame", "iframe", "object", "report", "serviceworker", "sharedworker", ๋˜๋Š” "worker"์ธ ๊ฒƒ์ด๋‹ค.

A ๋‚ด๋น„๊ฒŒ์ด์…˜ ์š”์ฒญ์€ ์š”์ฒญ์œผ๋กœ, ๊ทธ ๋ชฉ์ ์ง€๊ฐ€ "document", "embed", "frame", "iframe", ๋˜๋Š” "object"์ธ ๊ฒƒ์ด๋‹ค.

์ด ์šฉ์–ด๋“ค์˜ ์‚ฌ์šฉ์— ๋Œ€ํ•ด์„œ๋Š” handle fetch๋ฅผ ์ฐธ์กฐํ•˜๋ผ. [SW]


์š”์ฒญ request์˜ redirect-taint๋ฅผ ๊ณ„์‚ฐํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ด ๋‹จ๊ณ„๋“ค์€ "same-origin", "same-site", ๋˜๋Š” "cross-site"๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  1. Assert: request์˜ origin์€ "client"๊ฐ€ ์•„๋‹ˆ๋‹ค.

  2. lastURL์„ null๋กœ ๋‘”๋‹ค.

  3. taint๋ฅผ "same-origin"์œผ๋กœ ๋‘”๋‹ค.

  4. request์˜ URL ๋ชฉ๋ก์— ์žˆ๋Š” ๊ฐ url์— ๋Œ€ํ•ด For each:

    1. lastURL์ด null์ด๋ฉด, lastURL์„ url๋กœ ์„ค์ •ํ•˜๊ณ  continueํ•œ๋‹ค.

    2. url์˜ origin์ด lastURL์˜ origin๊ณผ same site๊ฐ€ ์•„๋‹ˆ๊ณ , request์˜ origin๋„ lastURL์˜ origin๊ณผ same site๊ฐ€ ์•„๋‹ˆ๋ฉด, "cross-site"๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    3. url์˜ origin์ด lastURL์˜ origin๊ณผ same origin์ด ์•„๋‹ˆ๊ณ , request์˜ origin๋„ lastURL์˜ origin๊ณผ same origin์ด ์•„๋‹ˆ๋ฉด, taint๋ฅผ "same-site"๋กœ ์„ค์ •ํ•œ๋‹ค.

    4. lastURL์„ url๋กœ ์„ค์ •ํ•œ๋‹ค.

  5. taint๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์š”์ฒญ request๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์š”์ฒญ ์ถœ์ฒ˜ ์ง๋ ฌํ™”ํ•˜๊ธฐ๋Š” ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค:

  1. Assert: request์˜ origin์€ "client"๊ฐ€ ์•„๋‹ˆ๋‹ค.

  2. request์˜ redirect-taint๊ฐ€ "same-origin"์ด ์•„๋‹ˆ๋ฉด, "null"์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. request์˜ origin์„ ์ง๋ ฌํ™”ํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์š”์ฒญ request๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์š”์ฒญ ์ถœ์ฒ˜ ๋ฐ”์ดํŠธ ์ง๋ ฌํ™”ํ•˜๊ธฐ๋Š” request๋กœ ์š”์ฒญ ์ถœ์ฒ˜ ์ง๋ ฌํ™”ํ•˜๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋™ํ˜• ์ธ์ฝ”๋”ฉํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.


์š”์ฒญ request๋ฅผ ๋ณต์ œํ•˜๋ ค๋ฉด, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค:

  1. newRequest๋ฅผ request์˜ ์‚ฌ๋ณธ์œผ๋กœ ๋‘๋˜, ๊ทธ body ์™€ WebDriver id๋Š” ์ œ์™ธํ•œ๋‹ค.

  2. newRequest์˜ WebDriver id๋ฅผ ๋ฌด์ž‘์œ„ UUID๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค. [WEBCRYPTO]

  3. request์˜ body๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, newRequest์˜ body ๋ฅผ request์˜ body๋ฅผ ๋ณต์ œํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  4. newRequest๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


์š”์ฒญ request์— ์ •์ˆ˜ first์™€ ์„ ํƒ์  ์ •์ˆ˜ last๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ range header๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค:

  1. Assert: last๊ฐ€ ์ฃผ์–ด์ง€์ง€ ์•Š์•˜๊ฑฐ๋‚˜, first๊ฐ€ last๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค.

  2. rangeValue๋ฅผ `bytes=`๋กœ ๋‘”๋‹ค.

  3. first๋ฅผ ์ง๋ ฌํ™”ํ•˜๊ณ  ๋™ํ˜• ์ธ์ฝ”๋”ฉํ•œ ๋’ค, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ rangeValue์— ๋ง๋ถ™์ธ๋‹ค.

  4. 0x2D (-)๋ฅผ rangeValue์— ๋ง๋ถ™์ธ๋‹ค.

  5. last๊ฐ€ ์ฃผ์–ด์กŒ๋‹ค๋ฉด, ์ด๋ฅผ ์ง๋ ฌํ™”ํ•˜๊ณ  ๋™ํ˜• ์ธ์ฝ”๋”ฉํ•œ ๋’ค, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ rangeValue์— ๋ง๋ถ™์ธ๋‹ค.

  6. (`Range`, rangeValue)๋ฅผ request์˜ ํ—ค๋” ๋ชฉ๋ก์— ๋ง๋ถ™์ธ๋‹ค.

range header๋Š” ํฌํ•จ์  ๋ฐ”์ดํŠธ ๋ฒ”์œ„๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋”ฐ๋ผ์„œ first๊ฐ€ 0์ด๊ณ  last๊ฐ€ 500์ธ range header๋Š” 501๋ฐ”์ดํŠธ ๋ฒ”์œ„์ด๋‹ค.

์—ฌ๋Ÿฌ ์‘๋‹ต์„ ํ•˜๋‚˜์˜ ๋…ผ๋ฆฌ์  ๋ฆฌ์†Œ์Šค๋กœ ๊ฒฐํ•ฉํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์—ญ์‚ฌ์ ์œผ๋กœ ๋ณด์•ˆ ๋ฒ„๊ทธ์˜ ์›์ธ์ด ๋˜์–ด ์™”๋‹ค. ๋ถ€๋ถ„ ์‘๋‹ต์„ ๋‹ค๋ฃจ๋Š” ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด์„œ๋Š” ๋ณด์•ˆ ๊ฒ€ํ† ๋ฅผ ์š”์ฒญํ•˜๋ผ.


์‘๋‹ต response๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ณด๊ณ ์šฉ ์‘๋‹ต URL ์ง๋ ฌํ™”ํ•˜๊ธฐ๋Š” ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค:

  1. Assert: response์˜ URL ๋ชฉ๋ก์€ ๋น„์–ด ์žˆ์ง€ ์•Š๋‹ค.

  2. url์„ response์˜ URL ๋ชฉ๋ก[0]์˜ ์‚ฌ๋ณธ์œผ๋กœ ๋‘”๋‹ค.

    ์ด๋Š” ๋ฆฌ๋””๋ ‰์…˜ ๋Œ€์ƒ์— ๊ด€ํ•œ ์ •๋ณด ๋ˆ„์ถœ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด response์˜ URL์ด ์•„๋‹ˆ๋‹ค(๋‹ค์Œ์˜ CSP ๋ณด๊ณ ์— ๋Œ€ํ•œ ์œ ์‚ฌํ•œ ๊ณ ๋ ค ์‚ฌํ•ญ ๋„ ์ฐธ์กฐ). [CSP]

  3. ์ฃผ์–ด์ง„ url์— ๋Œ€ํ•ด ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ์„ค์ •ํ•˜๋˜ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•œ๋‹ค.

  4. ์ฃผ์–ด์ง„ url์— ๋Œ€ํ•ด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์„ค์ •ํ•˜๋˜ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•œ๋‹ค.

  5. fragment ์ œ์™ธ๋ฅผ true๋กœ ์„ค์ •ํ•˜์—ฌ url์˜ ์ง๋ ฌํ™”๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์š”์ฒญ request๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, Cross-Origin-Embedder-Policy๊ฐ€ ์ž๊ฒฉ ์ฆ๋ช…์„ ํ—ˆ์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค:

  1. Assert: request์˜ origin์€ "client"๊ฐ€ ์•„๋‹ˆ๋‹ค.

  2. request์˜ mode๊ฐ€ "no-cors"๊ฐ€ ์•„๋‹ˆ๋ฉด, true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. request์˜ client๊ฐ€ null์ด๋ฉด, true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  4. request์˜ client์˜ policy container์˜ embedder policy์˜ value๊ฐ€ "credentialless"๊ฐ€ ์•„๋‹ˆ๋ฉด, true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  5. request์˜ ์˜ค๋ฆฌ์ง„์ด ๋™์ผ ์˜ค๋ฆฌ์ง„์œผ๋กœ request์˜ ํ˜„์žฌ URL์˜ ์˜ค๋ฆฌ์ง„๊ณผ ๊ฐ™๊ณ  request์˜ ๋ฆฌ๋””๋ ‰์…˜ ์˜ค์—ผ์ด "same-origin"์ด๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  6. false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

2.2.6. ์‘๋‹ต

The result of fetch is a ์‘๋‹ต. ์‘๋‹ต์€ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ ๋ฐœ์ „ํ•œ๋‹ค. ์ฆ‰, ๊ทธ ๋ชจ๋“  ํ•„๋“œ๊ฐ€ ์ฆ‰์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

์‘๋‹ต์—๋Š” ์—ฐ๊ด€๋œ type์ด ์žˆ์œผ๋ฉฐ, ์ด๋Š” "basic", "cors", "default", "error", "opaque", ๋˜๋Š” "opaqueredirect"์ด๋‹ค. ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ, ์ด๋Š” "default"์ด๋‹ค.

์‘๋‹ต์€ ์—ฐ๊ด€๋œ aborted flag๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ฒ˜์Œ์—๋Š” ์„ค์ •๋˜์ง€ ์•Š๋Š”๋‹ค.

์ด๋Š” ์š”์ฒญ์ด ๊ฐœ๋ฐœ์ž ๋˜๋Š” ์ตœ์ข… ์‚ฌ์šฉ์ž์— ์˜ํ•ด ์˜๋„์ ์œผ๋กœ ์ค‘๋‹จ๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์‘๋‹ต์—๋Š” ์—ฐ๊ด€๋œ URL์ด ์žˆ๋‹ค. ์ด๋Š” ์‘๋‹ต์˜ URL ๋ชฉ๋ก์— ์žˆ๋Š” ๋งˆ์ง€๋ง‰ URL์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ์ด๋ฉฐ, ์‘๋‹ต์˜ URL ๋ชฉ๋ก์ด ๋น„์–ด ์žˆ์œผ๋ฉด null์ด๋‹ค.

์‘๋‹ต์—๋Š” ์—ฐ๊ด€๋œ URL ๋ชฉ๋ก(0๊ฐœ ์ด์ƒ์˜ URL๋กœ ์ด๋ฃจ์–ด์ง„ ๋ชฉ๋ก)์ด ์žˆ๋‹ค. ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ, ์ด๋Š” ยซ ยป์ด๋‹ค.

์žˆ๋Š” ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ์™€ ๋งˆ์ง€๋ง‰ URL์„ ์ œ์™ธํ•˜๋ฉด, ์‘๋‹ต์˜ URL ๋ชฉ๋ก์€ ์Šคํฌ๋ฆฝํŠธ์— ์ง์ ‘ ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์›์ž์  HTTP ๋ฆฌ๋””๋ ‰์…˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„๋ฐ˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์‘๋‹ต์—๋Š” ์—ฐ๊ด€๋œ status๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ด๋Š” status์ด๋‹ค. ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ ์ด๋Š” 200์ด๋‹ค.

์‘๋‹ต์—๋Š” ์—ฐ๊ด€๋œ status message๊ฐ€ ์žˆ๋‹ค. ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ ์ด๋Š” ๋นˆ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค์ด๋‹ค.

HTTP/2 ์—ฐ๊ฒฐ์„ ํ†ตํ•œ ์‘๋‹ต์€ HTTP/2๊ฐ€ ์ด๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ•ญ์ƒ ๋นˆ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๋ฅผ status message๋กœ ๊ฐ€์ง„๋‹ค.

์‘๋‹ต์—๋Š” ์—ฐ๊ด€๋œ ํ—ค๋” ๋ชฉ๋ก( ํ—ค๋” ๋ชฉ๋ก)์ด ์žˆ๋‹ค. ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ ์ด๋Š” ยซ ยป์ด๋‹ค.

์‘๋‹ต์—๋Š” ์—ฐ๊ด€๋œ body(null ๋˜๋Š” body)๊ฐ€ ์žˆ๋‹ค. ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ ์ด๋Š” null์ด๋‹ค.

๋„คํŠธ์›Œํฌ์˜ ์‘๋‹ต์˜ body์— ๋Œ€ํ•œ source ๋ฐ length ๊ฐœ๋…์€ ํ•ญ์ƒ null์ด๋‹ค.

์‘๋‹ต์—๋Š” ์—ฐ๊ด€๋œ cache state(๋นˆ ๋ฌธ์ž์—ด, "local", ๋˜๋Š” "validated")๊ฐ€ ์žˆ๋‹ค. ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ, ์ด๋Š” ๋นˆ ๋ฌธ์ž์—ด์ด๋‹ค.

์ด๋Š” Service Workers ๋ฐ Resource Timing์—์„œ ์‚ฌ์šฉํ•˜๋„๋ก ์˜๋„๋œ ๊ฒƒ์ด๋‹ค. [SW] [RESOURCE-TIMING]

์‘๋‹ต์—๋Š” ์—ฐ๊ด€๋œ CORS-exposed header-name ๋ชฉ๋ก (0๊ฐœ ์ด์ƒ์˜ header name์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ชฉ๋ก)์ด ์žˆ๋‹ค. ์ด ๋ชฉ๋ก์€ ๋‹ฌ๋ฆฌ ์ง€์ •๋˜์ง€ ์•Š๋Š” ํ•œ ๋น„์–ด ์žˆ๋‹ค.

์‘๋‹ต์€ ์ผ๋ฐ˜์ ์œผ๋กœ `Access-Control-Expose-Headers` ํ—ค๋”์—์„œ ํ—ค๋” ๊ฐ’์„ ์ถ”์ถœํ•˜์—ฌ ๊ทธ CORS-exposed header-name ๋ชฉ๋ก์„ ์„ค์ •ํ•œ๋‹ค. ์ด ๋ชฉ๋ก์€ CORS ํ•„ํ„ฐ๋ง๋œ ์‘๋‹ต์ด ์–ด๋–ค ํ—ค๋”๋ฅผ ๋…ธ์ถœํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

์‘๋‹ต์—๋Š” ์—ฐ๊ด€๋œ range-requested flag๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ฒ˜์Œ์—๋Š” ์„ค์ •๋˜์ง€ ์•Š๋Š”๋‹ค.

์ด๋Š” ์ด์ „์˜ ๋ฒ”์œ„ ์š”์ฒญ์—์„œ ์˜จ ๋ถ€๋ถ„ ์‘๋‹ต์ด ๋ฒ”์œ„ ์š”์ฒญ์„ ํ•˜์ง€ ์•Š์€ API์— ์ œ๊ณต๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ๊ณต๊ฒฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ ์ด ํ”Œ๋ž˜๊ทธ์˜ ์‚ฌ์šฉ์ฒ˜๋ฅผ ์ฐธ์กฐํ•˜๋ผ.

์‘๋‹ต์—๋Š” ์—ฐ๊ด€๋œ request-includes-credentials (๋ถˆ๋ฆฌ์–ธ)์ด ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ฒ˜์Œ์—๋Š” true์ด๋‹ค.

์‘๋‹ต์—๋Š” ์—ฐ๊ด€๋œ timing allow passed flag๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ฒ˜์Œ์—๋Š” ์„ค์ •๋˜์ง€ ์•Š๋Š”๋‹ค.

์ด๋Š” fetch ํ˜ธ์ถœ์ž๊ฐ€ ๋ฐ˜ํ™˜๋œ ์‘๋‹ต์˜ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ™•์ธํ•˜์—ฌ ๊ฐ€์ ธ์˜จ ๋ฆฌ์†Œ์Šค์—์„œ ๋ฏผ๊ฐํ•œ ํƒ€์ด๋ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ํ—ˆ์šฉ๋˜๋Š”์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ๋ฆฌ๋””๋ ‰์…˜์˜ ์‘๋‹ต์— ์žˆ๋Š” ํ”Œ๋ž˜๊ทธ๋Š” ๋ฆฌ๋””๋ ‰์…˜ ์ฒด์ธ์˜ ์ด์ „ ์‘๋‹ต๋“ค์— ๋Œ€ํ•ด ์„ค์ •๋˜์—ˆ๋‹ค๋ฉด ์„ค์ •๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ, ์ด๋Š” ์š”์ฒญ์˜ timing allow failed flag๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด๋ถ€์ ์œผ๋กœ๋„ ์ถ”์ ๋œ๋‹ค.

์‘๋‹ต์—๋Š” ์—ฐ๊ด€๋œ navigation timing allow values list(๋ชฉ๋ก์˜ ๋ชฉ๋ก์œผ๋กœ, ๋ฌธ์ž์—ด๋กœ ์ด๋ฃจ์–ด์ง)์ด ์žˆ๋‹ค. ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ, ์ด๋Š” ยซ ยป์ด๋‹ค.

์ด๋Š” ๋‚ด๋น„๊ฒŒ์ด์…˜์˜ ๋ฆฌ๋””๋ ‰์…˜ ์ฒด์ธ์— ์žˆ๋Š” ๊ฐ ๋ฆฌ๋””๋ ‰์…˜ ์‘๋‹ต์˜ `Timing-Allow-Origin` ๊ฐ’์„ ๋ณด๊ด€ํ•œ๋‹ค. ์ด๋Š” ๋‚ด๋น„๊ฒŒ์ด์…˜์˜ ๋ชฉ์ ์ง€ origin์„ ์•Œ๊ฒŒ ๋˜์—ˆ์„ ๋•Œ, ํ˜ธ์ถœ์ž๋“ค์ด ํ•ด๋‹น origin์ด ๋ฆฌ๋””๋ ‰์…˜ ์ฒด์ธ์˜ ๋ชจ๋“  ๋ฆฌ๋””๋ ‰์…˜์—์„œ ํ—ˆ์šฉ๋˜๋Š”์ง€ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค.

์‘๋‹ต์—๋Š” ์—ฐ๊ด€๋œ body info (response body info)๊ฐ€ ์žˆ๋‹ค. ๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ, ์ด๋Š” ์ƒˆ response body info์ด๋‹ค.

์‘๋‹ต์—๋Š” ์—ฐ๊ด€๋œ service worker timing info(null ๋˜๋Š” service worker timing info)๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ฒ˜์Œ์—๋Š” null์ด๋‹ค.

์‘๋‹ต์—๋Š” ์—ฐ๊ด€๋œ redirect taint ("same-origin", "same-site", ๋˜๋Š” "cross-site")๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ฒ˜์Œ์—๋Š” "same-origin"์ด๋‹ค.


network error๋Š” ์‘๋‹ต์œผ๋กœ, ๊ทธ type์€ "error", status๋Š” 0, status message๋Š” ๋นˆ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค, ํ—ค๋” ๋ชฉ๋ก์€ ยซ ยป, body๋Š” null, ๊ทธ๋ฆฌ๊ณ  body info๋Š” ์ƒˆ response body info์ธ ๊ฒƒ์ด๋‹ค.

aborted network error๋Š” network error๋กœ, ๊ทธ aborted flag๊ฐ€ ์„ค์ •๋œ ๊ฒƒ์ด๋‹ค.

fetch params fetchParams๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ appropriate network error๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด:

  1. Assert: fetchParams๋Š” ์ทจ์†Œ๋˜์–ด ์žˆ๋‹ค.

  2. fetchParams๊ฐ€ ์ค‘๋‹จ๋˜์—ˆ์œผ๋ฉด aborted network error๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


ํ•„ํ„ฐ๋ง๋œ ์‘๋‹ต์€ ์—ฐ๊ด€๋œ ์‘๋‹ต์— ๋Œ€ํ•ด ์ œํ•œ๋œ ๋ทฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์‘๋‹ต์ด๋‹ค. ์ด ์—ฐ๊ด€๋œ ์‘๋‹ต์€ ํ•„ํ„ฐ๋ง๋œ ์‘๋‹ต์˜ ๋‚ด๋ถ€ ์‘๋‹ต( ์‘๋‹ต์œผ๋กœ, network error๋„ ์•„๋‹ˆ๊ณ  ํ•„ํ„ฐ๋ง๋œ ์‘๋‹ต๋„ ์•„๋‹Œ ๊ฒƒ)์„ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ฌ๋ฆฌ ๋ช…์‹œ๋˜์ง€ ์•Š๋Š” ํ•œ ํ•„ํ„ฐ๋ง๋œ ์‘๋‹ต์˜ ์—ฐ๊ด€๋œ ๊ฐœ๋…๋“ค(์˜ˆ: ๊ทธ body)์€ ๊ทธ ๋‚ด๋ถ€ ์‘๋‹ต์˜ ์—ฐ๊ด€๋œ ๊ฐœ๋…๋“ค์„ ์ฐธ์กฐํ•œ๋‹ค. (์ด์— ๋Œ€ํ•œ ์˜ˆ์™ธ๋Š” ์•„๋ž˜์—์„œ ํ•„ํ„ฐ๋ง๋œ ์‘๋‹ต์˜ ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์„ ์ •์˜ํ•˜๋Š” ๋ถ€๋ถ„์— ๋‚˜์—ด๋˜์–ด ์žˆ๋‹ค.)

fetch ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ processResponse์™€ ๋™๋“ฑํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ํ•„ํ„ฐ๋ง๋œ ์‘๋‹ต์„ ํ˜ธ์ถœ์ž์—๊ฒŒ ๋…ธ์ถœํ•˜์—ฌ ์ •๋ณด๊ฐ€ ์šฐ๋ฐœ์ ์œผ๋กœ ๋ˆ„์ถœ๋˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•œ๋‹ค. ๋ ˆ๊ฑฐ์‹œ ์ด์œ ๋กœ ์ •๋ณด๊ฐ€ ๊ณต๊ฐœ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๋””์ฝ”๋”์— ๊ณต๊ธ‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š”, ์—ฐ๊ด€๋œ ๋‚ด๋ถ€ ์‘๋‹ต์„ ๋ช…์„ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ƒˆ ๋ช…์„ธ๋Š” opaque ํ•„ํ„ฐ๋ง๋œ ์‘๋‹ต์ด๋‚˜ opaque-redirect ํ•„ํ„ฐ๋ง๋œ ์‘๋‹ต์„ ๋” ์ด์ƒ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ผ์•„์„œ๋Š” ์•ˆ ๋œ๋‹ค. ์ด๋“ค์€ ๋ ˆ๊ฑฐ์‹œ ๊ตฌ์„ฑ๋ฌผ์ด๋ฉฐ ํ˜„๋Œ€ ์ปดํ“จํ„ฐ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ณ ๋ คํ•  ๋•Œ ํ•ญ์ƒ ์ถฉ๋ถ„ํžˆ ๋ณดํ˜ธ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

basic ํ•„ํ„ฐ๋ง๋œ ์‘๋‹ต์€ ํ•„ํ„ฐ๋ง๋œ ์‘๋‹ต์œผ๋กœ, ๊ทธ type์ด "basic"์ด๊ณ  ํ—ค๋” ๋ชฉ๋ก์ด ๋‚ด๋ถ€ ์‘๋‹ต์˜ ํ—ค๋” ๋ชฉ๋ก์— ์žˆ๋Š” ํ—ค๋” ์ค‘์—์„œ ๊ทธ name์ด forbidden response-header name์ธ ๊ฒƒ์„ ์ œ์™ธํ•œ ๊ฒƒ์ด๋‹ค.

CORS ํ•„ํ„ฐ๋ง๋œ ์‘๋‹ต์€ ํ•„ํ„ฐ๋ง๋œ ์‘๋‹ต์œผ๋กœ, ๊ทธ type์ด "cors"์ด๊ณ  ํ—ค๋” ๋ชฉ๋ก์ด ๋‚ด๋ถ€ ์‘๋‹ต์˜ ํ—ค๋” ๋ชฉ๋ก์— ์žˆ๋Š” ํ—ค๋” ์ค‘์—์„œ ๊ทธ name์ด ์ฃผ์–ด์ง„ ๋‚ด๋ถ€ ์‘๋‹ต์˜ CORS-exposed header-name ๋ชฉ๋ก์— ๋Œ€ํ•œ CORS-safelisted response-header name์ด ์•„๋‹Œ ๊ฒƒ์„ ์ œ์™ธํ•œ ๊ฒƒ์ด๋‹ค.

opaque ํ•„ํ„ฐ๋ง๋œ ์‘๋‹ต์€ ํ•„ํ„ฐ๋ง๋œ ์‘๋‹ต์œผ๋กœ, ๊ทธ type์ด "opaque", URL ๋ชฉ๋ก์€ ยซ ยป, status๋Š” 0, status message๋Š” ๋นˆ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค, ํ—ค๋” ๋ชฉ๋ก์€ ยซ ยป, body๋Š” null, ๊ทธ๋ฆฌ๊ณ  body info๋Š” ์ƒˆ response body info์ธ ๊ฒƒ์ด๋‹ค.

opaque-redirect ํ•„ํ„ฐ๋ง๋œ ์‘๋‹ต์€ ํ•„ํ„ฐ๋ง๋œ ์‘๋‹ต์œผ๋กœ, ๊ทธ type์ด "opaqueredirect", status๋Š” 0, status message๋Š” ๋นˆ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค, ํ—ค๋” ๋ชฉ๋ก์€ ยซ ยป, body๋Š” null, ๊ทธ๋ฆฌ๊ณ  body info๋Š” ์ƒˆ response body info์ธ ๊ฒƒ์ด๋‹ค.

opaque-redirect ํ•„ํ„ฐ๋ง๋œ ์‘๋‹ต์— ๋Œ€ํ•ด URL ๋ชฉ๋ก์„ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ๋ฆฌ๋””๋ ‰์…˜์ด ๋”ฐ๋ผ๊ฐ€์ง€์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ฌดํ•ดํ•˜๋‹ค.

๋‹ค์‹œ ๋งํ•ด, opaque ํ•„ํ„ฐ๋ง๋œ ์‘๋‹ต๊ณผ opaque-redirect ํ•„ํ„ฐ๋ง๋œ ์‘๋‹ต์€ network error์™€ ๊ฑฐ์˜ ๊ตฌ๋ณ„๋˜์ง€ ์•Š๋Š”๋‹ค. ์ƒˆ API๋ฅผ ๋„์ž…ํ•  ๋•Œ๋Š” ์ •๋ณด๊ฐ€ ๋ˆ„์ถœ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋‚ด๋ถ€ ๋ช…์„ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ๋‚ด๋ถ€ ์‘๋‹ต์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ.

์ด๋Š” ๋˜ํ•œ response.ok ๊ฐ™์€ JavaScript API๊ฐ€ ๊ทธ๋‹ค์ง€ ์œ ์šฉํ•˜์ง€ ์•Š์€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๋œป์ด๊ธฐ๋„ ํ•˜๋‹ค.

์‘๋‹ต์˜ type์€ type getter๋ฅผ ํ†ตํ•ด ์Šคํฌ๋ฆฝํŠธ์— ๋…ธ์ถœ๋œ๋‹ค:

console.log(new Response().type); // "default"

console.log((await fetch("/")).type); // "basic"

console.log((await fetch("https://api.example/status")).type); // "cors"

console.log((await fetch("https://crossorigin.example/image", { mode: "no-cors" })).type); // "opaque"

console.log((await fetch("/surprise-me", { redirect: "manual" })).type); // "opaqueredirect"

(์ด๋Š” ๋‹ค์–‘ํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์กด์žฌํ•˜๊ณ , https://api.example/status๊ฐ€ ์ ์ ˆํ•œ CORS ํ—ค๋”๋ฅผ ๊ฐ€์ง€๋ฉฐ, /surprise-me๊ฐ€ redirect status๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.)


์‘๋‹ต response๋ฅผ ๋ณต์ œํ•˜๋ ค๋ฉด, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค:

  1. response๊ฐ€ ํ•„ํ„ฐ๋ง๋œ ์‘๋‹ต์ด๋ฉด, ๊ทธ ๋‚ด๋ถ€ ์‘๋‹ต์ด response์˜ ๋‚ด๋ถ€ ์‘๋‹ต์„ ๋ณต์ œํ•œ ๊ฒƒ์ธ ์ƒˆ ๋™์ผํ•œ ํ•„ํ„ฐ๋ง๋œ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. newResponse๋ฅผ response์˜ ์‚ฌ๋ณธ์œผ๋กœ ๋‘๋˜, ๊ทธ body๋Š” ์ œ์™ธํ•œ๋‹ค.

  3. response์˜ body๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, newResponse์˜ body๋ฅผ response์˜ body๋ฅผ ๋ณต์ œํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  4. newResponse๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


fresh response๋Š” ๊ทธ current age๊ฐ€ ํ•ด๋‹น freshness lifetime ์•ˆ์— ์žˆ๋Š” ์‘๋‹ต์ด๋‹ค.

stale-while-revalidate response๋Š” fresh response๊ฐ€ ์•„๋‹ˆ๋ฉฐ, ๊ทธ current age๊ฐ€ stale-while-revalidate lifetime ์•ˆ์— ์žˆ๋Š” ์‘๋‹ต์ด๋‹ค. [HTTP-CACHING] [STALE-WHILE-REVALIDATE]

stale response๋Š” fresh response๋„ ์•„๋‹ˆ๊ณ  stale-while-revalidate response๋„ ์•„๋‹Œ ์‘๋‹ต์ด๋‹ค.


null ๋˜๋Š” ASCII ๋ฌธ์ž์—ด requestFragment๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์‘๋‹ต response์˜ location URL์€ ๋‹ค์Œ ๋‹จ๊ณ„๋“ค์ด ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์ด๋‹ค. ์ด ๋‹จ๊ณ„๋“ค์€ null, failure, ๋˜๋Š” URL์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  1. response์˜ status๊ฐ€ redirect status๊ฐ€ ์•„๋‹ˆ๋ฉด, null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. location์„ `Location`๊ณผ response์˜ ํ—ค๋” ๋ชฉ๋ก์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ํ—ค๋” ๋ชฉ๋ก ๊ฐ’์„ ์ถ”์ถœํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  3. location์ด header value์ด๋ฉด, location์„ response์˜ URL์„ ๊ธฐ์ค€์œผ๋กœ location์„ ํŒŒ์‹ฑํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    response๊ฐ€ Response ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ, response์˜ URL์€ null์ผ ๊ฒƒ์ด๋ฉฐ, ์ด๋Š” location์ด absolute-URL-with-fragment string์ธ ๊ฒฝ์šฐ์—๋งŒ ์„ฑ๊ณต์ ์œผ๋กœ ํŒŒ์‹ฑ๋œ๋‹ค๋Š” ๋œป์ด๋‹ค.

  4. location์ด URL์ด๊ณ  ๊ทธ fragment๊ฐ€ null์ด๋ฉด, location์˜ fragment๋ฅผ requestFragment๋กœ ์„ค์ •ํ•œ๋‹ค.

    ์ด๋Š” ํ•ฉ์„ฑ ์‘๋‹ต(์‹ค์ œ๋กœ๋Š” ๋ชจ๋“  ์‘๋‹ต)์ด HTTP์—์„œ ์ •์˜ํ•œ ๋ฆฌ๋””๋ ‰์…˜ ์ฒ˜๋ฆฌ ๋ชจ๋ธ์„ ๋”ฐ๋ฅด๋„๋ก ๋ณด์žฅํ•œ๋‹ค. [HTTP]

  5. location์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

location URL ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ด ํ‘œ์ค€๊ณผ ๋ฆฌ๋””๋ ‰์…˜์„ ์ˆ˜๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” HTML์˜ navigate ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ๋ฆฌ๋””๋ ‰์…˜ ์ฒ˜๋ฆฌ์—๋งŒ ๋…์ ์ ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. [HTML]

2.2.7. ๊ธฐํƒ€

์ž ์žฌ์  destination(potential destination)์€ "fetch"์ด๊ฑฐ๋‚˜ ๋นˆ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ destination์ด๋‹ค.

๋ณ€ํ™˜(translate)์„ ์ž ์žฌ์  destination potentialDestination์— ๋Œ€ํ•ด ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ๋”ฐ๋ฅธ๋‹ค:

  1. potentialDestination์ด "fetch"๋ผ๋ฉด ๋นˆ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. Assert: potentialDestination์ด destination์ž„์„ ํ™•์ธํ•œ๋‹ค.

  3. potentialDestination์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

2.3. ์ธ์ฆ ์—”ํŠธ๋ฆฌ(Authentication entries)

์ธ์ฆ ์—”ํŠธ๋ฆฌ(authentication entry)์™€ ํ”„๋ก์‹œ ์ธ์ฆ ์—”ํŠธ๋ฆฌ(proxy-authentication entry)๋Š” HTTP ์ธ์ฆ ๋ฐ HTTP ํ”„๋ก์‹œ ์ธ์ฆ์— ์‚ฌ์šฉ๋˜๋Š” username, password, realm์˜ ํŠœํ”Œ์ด๋ฉฐ, ํ•˜๋‚˜ ์ด์ƒ์˜ ์š”์ฒญ(requests)๊ณผ ์—ฐ๊ด€๋œ๋‹ค.

์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ์ด ๋‘˜์„ HTTP ์ฟ ํ‚ค ๋ฐ ์œ ์‚ฌ ์ถ”์  ๊ธฐ๋Šฅ๊ณผ ํ•จ๊ป˜ ๋ชจ๋‘ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

์ž์„ธํ•œ ์‚ฌํ•ญ์€ HTTP์—์„œ ์ •์˜ํ•œ๋‹ค. [HTTP] [HTTP-CACHING]

2.4. Fetch ๊ทธ๋ฃน(Fetch groups)

๊ฐ environment settings object์—๋Š” fetch group์ด ์—ฐ๊ด€๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ด๋Š” fetch group์„ ๋‹ด๊ณ  ์žˆ๋‹ค.

fetch group์€ fetch ๊ด€๋ จ ์ •๋ณด๋ฅผ ๋ณด๊ด€ํ•œ๋‹ค.

fetch group์—๋Š” ๋‹ค์Œ์ด ์—ฐ๊ด€๋œ๋‹ค:

fetch records
๋ชฉ๋ก์œผ๋กœ, fetch records์˜ ๋ชฉ๋ก์ด๋‹ค.
deferred fetch records
๋ชฉ๋ก์œผ๋กœ, deferred fetch records์˜ ๋ชฉ๋ก์ด๋‹ค.

fetch record๋Š” ๋‹ค์Œ items๋ฅผ ๊ฐ€์ง„ struct์ด๋‹ค:

request
์š”์ฒญ์ด๋‹ค.
controller
fetch controller ๋˜๋Š” null์ด๋‹ค.

deferred fetch record๋Š” ๋‚˜์ค‘์— fetch๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” struct์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฌธ์„œ๊ฐ€ ์–ธ๋กœ๋“œ๋˜๊ฑฐ๋‚˜ fully active๊ฐ€ ์•„๋‹ˆ๊ฒŒ ๋  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. ์ด๋Š” ๋‹ค์Œ items๋ฅผ ๊ฐ€์ง„๋‹ค:

request
์š”์ฒญ์ด๋‹ค.
notify invoked
์ธ์ˆ˜๋ฅผ ๋ฐ›์ง€ ์•Š๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.
invoke state (๊ธฐ๋ณธ๊ฐ’ "pending")
"pending", "sent", ๋˜๋Š” "aborted"์ด๋‹ค.

fetch group fetchGroup์ด terminated๋˜๋ฉด:

  1. ๊ฐ fetch record record์— ๋Œ€ํ•ด, fetchGroup์˜ fetch records ์ค‘ record์˜ controller๊ฐ€ null์ด ์•„๋‹ˆ๊ณ , record์˜ request์˜ done flag์ด ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š๊ณ , keepalive๊ฐ€ false์ด๋ฉด, terminate record์˜ controller๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

  2. Process deferred fetches๋ฅผ fetchGroup์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ๋‹ค.

2.5. ๋„๋ฉ”์ธ ํ•ด์„

(This is a tracking vector.) origin ํ•ด์„(resolve an origin)์„ ํ•˜๋ ค๋ฉด, ๋„คํŠธ์›Œํฌ ํŒŒํ‹ฐ์…˜ ํ‚ค(network partition key) key์™€ origin origin์ด ์ฃผ์–ด์ง„๋‹ค:

  1. origin์˜ host๊ฐ€ IP ์ฃผ์†Œ๋ผ๋ฉด, ยซ origin์˜ host ยป๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. origin์˜ host์˜ public suffix๊ฐ€ "localhost" ๋˜๋Š” "localhost."๋ผ๋ฉด, ยซ ::1, 127.0.0.1 ยป๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. origin์„ ํ•˜๋‚˜ ์ด์ƒ์˜ IP ์ฃผ์†Œ์˜ ์ง‘ํ•ฉ(set)์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ตฌํ˜„ ์ •์˜(implementation-defined) ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

    ๋˜ํ•œ ๋‹จ์ˆœํžˆ IP ์ฃผ์†Œ๋งŒ ์–ป๋Š” ๊ฒƒ ์™ธ์—, ๋‹ค๋ฅธ ์—ฐ๊ฒฐ ์ •๋ณด๋„ ์–ป๋Š” ์ž‘์—…์ด ๊ตฌํ˜„ ์ •์˜๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, origin์˜ scheme์ด HTTP(S) scheme๋ผ๋ฉด, ๊ตฌํ˜„์ฒด๋Š” HTTPS RR์— ๋Œ€ํ•œ DNS ์งˆ์˜๋ฅผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. [SVCB]

    ์ด ์ž‘์—…์ด ์„ฑ๊ณตํ•˜๋ฉด, IP ์ฃผ์†Œ์˜ ์ง‘ํ•ฉ(set)๊ณผ ์ถ”๊ฐ€ ๊ตฌํ˜„ ์ •์˜ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  4. ์‹คํŒจ(failure)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

origin ํ•ด์„ ๊ฒฐ๊ณผ๋Š” ์บ์‹œ๋  ์ˆ˜ ์žˆ๋‹ค. ์บ์‹œํ•  ๊ฒฝ์šฐ, key๋ฅผ ์บ์‹œ ํ‚ค์˜ ์ผ๋ถ€๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

์ด ์ž‘์—…์€ ์ผ๋ฐ˜์ ์œผ๋กœ DNS๋ฅผ ํฌํ•จํ•˜๋ฏ€๋กœ, DNS ์„œ๋ฒ„์—์„œ key๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ์บ์‹œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ตฌํ˜„์ฒด์— ๋”ฐ๋ผ ๋กœ์ปฌ์—์„œ key๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. [RFC1035]

IP ์ฃผ์†Œ์˜ ๋ฐ˜ํ™˜ ์ˆœ์„œ๋Š” origin ํ•ด์„ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ˜ธ์ถœ๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

(์บ์‹œ ํ‚ค๋ฅผ ์ œ์™ธํ•œ) ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ํ˜„ํ–‰ ํ‘œ์ค€์ด ์ •์˜ํ•˜๋Š” ์‹œ์Šคํ…œ๊ณผ ์ง์ ‘์ ์œผ๋กœ ๊ด€๋ จ์ด ์—†์œผ๋ฏ€๋กœ ๊ตฌ์ฒด์ ์œผ๋กœ ๋ช…์‹œํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋‹ค๋ฅธ ๋ฌธ์„œ์—์„œ ์ด ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ์— ์˜์กดํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด, ๋ฐ˜๋“œ์‹œ ํ˜„ํ–‰ ํ‘œ์ค€ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ์ถฉ๋ถ„ํ•œ ๋…ผ์˜๊ฐ€ ์„ ํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค.

2.6. ์—ฐ๊ฒฐ

์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ์—ฐ๊ด€๋œ ์—ฐ๊ฒฐ ํ’€ ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ ํ’€ ์€ 0๊ฐœ ์ด์ƒ์˜ ์—ฐ๊ฒฐ ๋กœ ์ด๋ฃจ์–ด์ง„ ์ˆœ์„œ ์žˆ๋Š” ์ง‘ํ•ฉ ์ž…๋‹ˆ๋‹ค. ๊ฐ ์—ฐ๊ฒฐ ์€ ์—ฐ๊ด€๋œ ํ‚ค ( ๋„คํŠธ์›Œํฌ ํŒŒํ‹ฐ์…˜ ํ‚ค ), origin ( origin ), credentials (๋ถˆ๋ฆฌ์–ธ)๋กœ ์‹๋ณ„๋ฉ๋‹ˆ๋‹ค.

๊ฐ connection์€ ์—ฐ๊ด€๋œ timing info (connection timing info)๋ฅผ ๊ฐ€์ง„๋‹ค.

connection timing info๋Š” ์—ฐ๊ฒฐ ํš๋“ ๊ณผ์ •์˜ ํƒ€์ด๋ฐ ์ •๋ณด๋ฅผ ๋ณด๊ด€ํ•˜๋Š” struct์ด๋‹ค. ๋‹ค์Œ ํ•ญ๋ชฉ(items)์„ ๊ฐ€์ง„๋‹ค:

๋„๋ฉ”์ธ ์กฐํšŒ ์‹œ์ž‘ ์‹œ๊ฐ(domain lookup start time) (๊ธฐ๋ณธ๊ฐ’ 0)
๋„๋ฉ”์ธ ์กฐํšŒ ์ข…๋ฃŒ ์‹œ๊ฐ(domain lookup end time) (๊ธฐ๋ณธ๊ฐ’ 0)
์—ฐ๊ฒฐ ์‹œ์ž‘ ์‹œ๊ฐ(connection start time) (๊ธฐ๋ณธ๊ฐ’ 0)
์—ฐ๊ฒฐ ์ข…๋ฃŒ ์‹œ๊ฐ(connection end time) (๊ธฐ๋ณธ๊ฐ’ 0)
๋ณด์•ˆ ์—ฐ๊ฒฐ ์‹œ์ž‘ ์‹œ๊ฐ(secure connection start time) (๊ธฐ๋ณธ๊ฐ’ 0)
DOMHighResTimeStamp.
ALPN ํ˜‘์ƒ ํ”„๋กœํ† ์ฝœ(ALPN negotiated protocol) (๊ธฐ๋ณธ๊ฐ’: ๋นˆ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค)
๋ฐ”์ดํŠธ ์‹œํ€€์Šค.

connection timing info clamp/coarsen ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ connection timing info timingInfo, DOMHighResTimeStamp defaultStartTime, ๋ถˆ๋ฆฌ์–ธ crossOriginIsolatedCapability๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‹ค์Œ์„ ์‹คํ–‰ํ•œ๋‹ค:

  1. timingInfo ์˜ ์—ฐ๊ฒฐ ์‹œ์ž‘ ์‹œ๊ฐ ์ด defaultStartTime ๋ณด๋‹ค ์ž‘์œผ๋ฉด, ๋„๋ฉ”์ธ ์กฐํšŒ ์‹œ์ž‘ ์‹œ๊ฐ ์„ defaultStartTime ์œผ๋กœ ์„ค์ •ํ•˜๊ณ , ๋„๋ฉ”์ธ ์กฐํšŒ ์ข…๋ฃŒ ์‹œ๊ฐ ์„ defaultStartTime ์œผ๋กœ ์„ค์ •ํ•˜๊ณ , ์—ฐ๊ฒฐ ์‹œ์ž‘ ์‹œ๊ฐ ์„ defaultStartTime ์œผ๋กœ ์„ค์ •ํ•˜๊ณ , ์—ฐ๊ฒฐ ์ข…๋ฃŒ ์‹œ๊ฐ ์„ defaultStartTime ์œผ๋กœ ์„ค์ •ํ•˜๊ณ , ๋ณด์•ˆ ์—ฐ๊ฒฐ ์‹œ์ž‘ ์‹œ๊ฐ ์„ defaultStartTime ์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ALPN ํ˜‘์ƒ ํ”„๋กœํ† ์ฝœ ์„ timingInfo ์˜ ALPN ํ˜‘์ƒ ํ”„๋กœํ† ์ฝœ ๋กœ ์„ค์ •ํ•œ ์ƒˆ๋กœ์šด ์—ฐ๊ฒฐ ํƒ€์ด๋ฐ ์ •๋ณด ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. ์ƒˆ๋กœ์šด ์—ฐ๊ฒฐ ํƒ€์ด๋ฐ ์ •๋ณด ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ •๋ณด์—์„œ ๋„๋ฉ”์ธ ์กฐํšŒ ์‹œ์ž‘ ์‹œ๊ฐ ์„ timingInfo ์˜ ๋„๋ฉ”์ธ ์กฐํšŒ ์‹œ์ž‘ ์‹œ๊ฐ ๊ณผ crossOriginIsolatedCapability ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์‹œ๊ฐ„ ์ •๋ฐ€๋„๋ฅผ ๋‚ฎ์ถ˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋„๋ฉ”์ธ ์กฐํšŒ ์ข…๋ฃŒ ์‹œ๊ฐ ์„ timingInfo ์˜ ๋„๋ฉ”์ธ ์กฐํšŒ ์ข…๋ฃŒ ์‹œ๊ฐ ๊ณผ crossOriginIsolatedCapability ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์‹œ๊ฐ„ ์ •๋ฐ€๋„๋ฅผ ๋‚ฎ์ถ˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ ์‹œ์ž‘ ์‹œ๊ฐ ์„ timingInfo ์˜ ์—ฐ๊ฒฐ ์‹œ์ž‘ ์‹œ๊ฐ ๊ณผ crossOriginIsolatedCapability ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์‹œ๊ฐ„ ์ •๋ฐ€๋„๋ฅผ ๋‚ฎ์ถ˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ ์ข…๋ฃŒ ์‹œ๊ฐ ์„ timingInfo ์˜ ์—ฐ๊ฒฐ ์ข…๋ฃŒ ์‹œ๊ฐ ๊ณผ crossOriginIsolatedCapability ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์‹œ๊ฐ„ ์ •๋ฐ€๋„๋ฅผ ๋‚ฎ์ถ˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ ์—ฐ๊ฒฐ ์‹œ์ž‘ ์‹œ๊ฐ ์„ timingInfo ์˜ ์—ฐ๊ฒฐ ์ข…๋ฃŒ ์‹œ๊ฐ ๊ณผ crossOriginIsolatedCapability ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์‹œ๊ฐ„ ์ •๋ฐ€๋„๋ฅผ ๋‚ฎ์ถ˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ALPN ํ˜‘์ƒ ํ”„๋กœํ† ์ฝœ ์€ timingInfo ์˜ ALPN ํ˜‘์ƒ ํ”„๋กœํ† ์ฝœ ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.


์ƒˆ ์—ฐ๊ฒฐ ์„ค์ •(new connection setting)์€ "no", "yes", "yes-and-dedicated" ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

์—ฐ๊ฒฐ์„ ํš๋“(obtain a connection)ํ•˜๋ ค๋ฉด, ๋„คํŠธ์›Œํฌ ํŒŒํ‹ฐ์…˜ ํ‚ค(network partition key) key, URL url, ๋ถˆ๋ฆฌ์–ธ credentials, ์„ ํƒ์  ์ƒˆ ์—ฐ๊ฒฐ ์„ค์ •(new connection setting) new(๊ธฐ๋ณธ๊ฐ’ "no"), ์„ ํƒ์  ๋ถˆ๋ฆฌ์–ธ requireUnreliable(๊ธฐ๋ณธ๊ฐ’ false), ๊ทธ๋ฆฌ๊ณ  ์„ ํƒ์  WebTransport-hash ๋ชฉ๋ก webTransportHashes(๊ธฐ๋ณธ๊ฐ’ ยซ ยป)๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ๋‹ค์Œ์„ ๋”ฐ๋ฅธ๋‹ค:

  1. new๊ฐ€ "no"๋ผ๋ฉด:

    1. ๋‹จ์–ธ(assert): webTransportHashes ๊ฐ€ ๋น„์–ด ์žˆ์Œ.

    2. connections๋ฅผ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ์˜ ์—ฐ๊ฒฐ ์ง‘ํ•ฉ์œผ๋กœ ๋‘๋ฉฐ, ์ด๋Š” ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ์˜ ์—ฐ๊ฒฐ ํ’€์— ์†ํ•˜๊ณ  ๊ทธ ํ‚ค๊ฐ€ key์™€ ๊ฐ™์€ ๊ฒƒ์ด๋ฉฐ, ์ถœ์ฒ˜๊ฐ€ url์˜ ๋™์ผ ์ถœ์ฒ˜์ธ ์ถœ์ฒ˜์™€ ๊ฐ™๊ณ , ๋˜ํ•œ ์ž๊ฒฉ ์ฆ๋ช…์ด credentials์ž…๋‹ˆ๋‹ค.

    3. connections๊ฐ€ ๋น„์–ด ์žˆ์ง€ ์•Š๊ณ  requireUnreliable์ด false๋ผ๋ฉด, connections ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    4. connections ์•ˆ์— ์˜ˆ๋ฅผ ๋“ค์–ด HTTP/3 ๋“ฑ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š”(unreliable) ์ „์†ก์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋Š” ์—ฐ๊ฒฐ์ด ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ์—ฐ๊ฒฐ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. proxies๋ฅผ url์— ๋Œ€ํ•ด ๊ตฌํ˜„์ž ์ •์˜ ๋ฐฉ์‹(implementation-defined manner)์œผ๋กœ ํ”„๋ก์‹œ๋ฅผ ์ฐพ์€ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค. ํ”„๋ก์‹œ๊ฐ€ ์—†์œผ๋ฉด proxies๋Š” ยซ "DIRECT" ยป๋กœ ๋‘”๋‹ค.

    ์—ฌ๊ธฐ๊ฐ€ WPAD๋‚˜ PAC ๋“ฑ์˜ ๋น„ํ‘œ์ค€ ๊ธฐ์ˆ ์ด ๋™์ž‘ํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. "DIRECT" ๊ฐ’์€ ์ด url์— ํ”„๋ก์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•œ๋‹ค.

  3. timingInfo๋ฅผ ์ƒˆ๋กœ์šด connection timing info๋กœ ๋‘”๋‹ค.

  4. ๊ฐ proxies์˜ proxy์— ๋Œ€ํ•ด:

    1. timingInfo์˜ domain lookup start time์„ unsafe shared current time์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. hosts๋ฅผ ยซ url์˜ origin์˜ host ยป๋กœ ๋‘”๋‹ค.

    3. proxy๊ฐ€ "DIRECT"์ด๋ฉด, hosts๋ฅผ key์™€ url์˜ origin์„ ์‚ฌ์šฉํ•˜์—ฌ origin ํ•ด์„(resolve an origin) ์„ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    4. hosts๊ฐ€ ์‹คํŒจ(failure)๋ฉด continue.

    5. timingInfo์˜ domain lookup end time์„ unsafe shared current time์œผ๋กœ ๋‘”๋‹ค.

    6. connection์„ ๋‹ค์Œ ๋‹จ๊ณ„์˜ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค: ์—ฐ๊ฒฐ ์ƒ์„ฑ(create a connection)์„ key, url์˜ origin, credentials, proxy, hosts์—์„œ ๊ตฌํ˜„์ž ์ •์˜ ๋ฐฉ์‹์œผ๋กœ ํ•˜๋‚˜์˜ host, timingInfo, requireUnreliable, webTransportHashes๋กœ ํ˜ธ์ถœํ•œ๋‹ค. ์ด๋ฅผ ๊ตฌํ˜„์ž ์ •์˜ ํšŸ์ˆ˜๋งŒํผ ์„œ๋กœ ๋ณ‘๋ ฌ(parallel)๋กœ ์‹œ๋„ํ•˜๊ณ , ์ตœ์†Œ ํ•˜๋‚˜ ์ด์ƒ ๊ฐ’์ด ๋ฐ˜ํ™˜๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. ๊ตฌํ˜„์ž ์ •์˜ ๋ฐฉ์‹์œผ๋กœ ๋ฐ˜ํ™˜๊ฐ’ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋ฐ˜ํ™˜๊ฐ’ ์ค‘ ์—ฐ๊ฒฐ(connection)์ธ ๋‹ค๋ฅธ ๊ฐ’๋“ค์€ ๋‹ซํž ์ˆ˜ ์žˆ๋‹ค.

      ์‹ค์งˆ์ ์œผ๋กœ ์ด๊ฒƒ์€ ๊ตฌํ˜„์ฒด๊ฐ€ origin ํ•ด์„(resolve an origin)์˜ ๊ฒฐ๊ณผ(ํ”„๋ก์‹œ๊ฐ€ "DIRECT"์ผ ๋•Œ)๋กœ ์—ฌ๋Ÿฌ IP ์ฃผ์†Œ๋ฅผ ๋ฐ›์•„ ๋ณ‘๋ ฌ๋กœ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•˜๊ฑฐ๋‚˜, IPv6 ์ฃผ์†Œ๋ฅผ ์šฐ์„ ํ•˜๊ฑฐ๋‚˜, ์‹œ๊ฐ„ ์ดˆ๊ณผ ์‹œ ์žฌ์‹œ๋„ํ•˜๋Š” ๋“ฑ์˜ ์ •์ฑ…์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค.

    7. connection์ด ์‹คํŒจ(failure)์ด๋ฉด continue.

    8. new๊ฐ€ "yes-and-dedicated"๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด append connection์„ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ์˜ connection pool์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    9. connection์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  5. ์‹คํŒจ(failure)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์—ฐ๊ฒฐ ๊ด€๋ฆฌ์—๋Š” ๊ตฌํ˜„์ž์˜ ์žฌ๋Ÿ‰์— ๋งก๊ธฐ๋Š” ๊ฒƒ์ด ์ข‹์€ ์—ฌ๋Ÿฌ ์„ธ๋ถ€์‚ฌํ•ญ์ด ์žˆ์œผ๋ฏ€๋กœ ์˜๋„์ ์œผ๋กœ ๋‹ค์†Œ ํฌ๊ด„์ ์œผ๋กœ ์„œ์ˆ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์„ค๋ช…์€ <link rel=preconnect> ๊ธฐ๋Šฅ์„ ์„ค๋ช…ํ•˜๊ณ  ์—ฐ๊ฒฐ ์ด credentials ๋ฅผ ํ‚ค๋กœ ๊ตฌ๋ถ„๋จ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ทœ์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ปจ๋Œ€ TLS ์„ธ์…˜ ์‹๋ณ„์ž๋Š” credentials ๊ฐ€ false์ธ ์—ฐ๊ฒฐ ๊ณผ credentials ๊ฐ€ true์ธ ์—ฐ๊ฒฐ ์‚ฌ์ด์—์„œ ์žฌ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


์—ฐ๊ฒฐ ์ƒ์„ฑ์„ ์œ„ํ•ด, ๋„คํŠธ์›Œํฌ ํŒŒํ‹ฐ์…˜ ํ‚ค key, origin origin, ๋ถˆ๋ฆฌ์–ธ credentials, ๋ฌธ์ž์—ด proxy, host host, ์—ฐ๊ฒฐ ํƒ€์ด๋ฐ ์ •๋ณด timingInfo, ๋ถˆ๋ฆฌ์–ธ requireUnreliable, ๊ทธ๋ฆฌ๊ณ  WebTransport-hash ๋ชฉ๋ก webTransportHashes๊ฐ€ ์ฃผ์–ด์ง„๋‹ค:

  1. timingInfo์˜ connection start time์„ unsafe shared current time์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. connection์„ ์ƒˆ ์—ฐ๊ฒฐ(connection)๋กœ ๋‘๋˜, key๋Š” key, origin์€ origin, credentials๋Š” credentials, timing info๋Š” timingInfo๋กœ ํ•œ๋‹ค. connection timing info ๊ธฐ๋ก(record connection timing info)์„ connection์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•˜๊ณ , proxy์™€ origin์„ ๊ณ ๋ คํ•˜์—ฌ host๋กœ HTTP ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•œ๋‹ค. ์•„๋ž˜ ์ฃผ์˜์‚ฌํ•ญ ์ฐธ๊ณ . [HTTP] [HTTP1] [TLS]

    • requireUnreliable๊ฐ€ true๋ผ๋ฉด, HTTP/3 ๋“ฑ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ „์†ก์„ ์ง€์›ํ•˜๋Š” ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•œ๋‹ค. [HTTP3]

    • ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ „์†ก์„ ์ง€์›ํ•˜๋Š” ์—ฐ๊ฒฐ์„ ์„ค์ •ํ•  ๋•Œ๋Š” WebTransport์— ํ•„์š”ํ•œ ์˜ต์…˜์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•œ๋‹ค. HTTP/3์˜ ๊ฒฝ์šฐ, ์ดˆ๊ธฐ SETTINGS ํ”„๋ ˆ์ž„์— SETTINGS_ENABLE_WEBTRANSPORT์™€ H3_DATAGRAM ๊ฐ’์„ 1๋กœ ํฌํ•จํ•œ๋‹ค. [WEBTRANSPORT-HTTP3] [HTTP3-DATAGRAM]

    • credentials๊ฐ€ false๋ฉด, TLS ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ๋ฅผ ๋ณด๋‚ด์ง€ ์•Š๋Š”๋‹ค.

    • webTransportHashes๊ฐ€ ๋น„์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด, ๊ธฐ๋ณธ ์ธ์ฆ์„œ ๊ฒ€์ฆ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋Œ€์‹ , ์„œ๋ฒ„ ์ธ์ฆ์„œ๊ฐ€ ์‚ฌ์šฉ์ž ์ •์˜ ์ธ์ฆ์„œ ์š”๊ฑด์„ ๋งŒ์กฑํ•˜๊ณ , ์ธ์ฆ์„œ ํ•ด์‹œ ๊ฒ€์ฆ์ด webTransportHashes์— ๋Œ€ํ•ด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์„œ๋ฒ„ ์ธ์ฆ์„œ๊ฐ€ ์œ ํšจํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค. ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜์ง€ ์•Š์œผ๋ฉด ์‹คํŒจ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    • ์—ฐ๊ฒฐ ์„ค์ •์— ์‹คํŒจํ•˜๋ฉด(์˜ˆ: UDP, TCP, TLS ์˜ค๋ฅ˜ ๋“ฑ) ์‹คํŒจ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. timingInfo์˜ ALPN ํ˜‘์ƒ ํ”„๋กœํ† ์ฝœ(ALPN negotiated protocol)์„ connection์˜ ALPN Protocol ID๋กœ ์„ค์ •ํ•˜๋˜, ๋‹ค์Œ ์˜ˆ์™ธ๋ฅผ ์ ์šฉํ•œ๋‹ค. [RFC7301]

    • ํ”„๋ก์‹œ๊ฐ€ ์„ค์ •๋œ ๊ฒฝ์šฐ, ํ„ฐ๋„ ์—ฐ๊ฒฐ์ด ์ˆ˜๋ฆฝ๋๋‹ค๋ฉด ๊ทธ ํ„ฐ๋„๋ง๋œ ํ”„๋กœํ† ์ฝœ์˜ ALPN Protocol ID์—ฌ์•ผ ํ•˜๋ฉฐ, ์•„๋‹ ๊ฒฝ์šฐ ํ”„๋ก์‹œ์˜ ์ฒซ ํ™‰(hop)์— ๋Œ€ํ•œ ๊ฐ’์ด์–ด์•ผ ํ•œ๋‹ค.

    • ์‹คํ—˜์ ์ด๊ฑฐ๋‚˜ ๋“ฑ๋ก๋˜์ง€ ์•Š์€ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์‚ฌ์šฉ๋œ ALPN Protocol ID(์žˆ๋‹ค๋ฉด)๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ํ”„๋กœํ† ์ฝœ ํ˜‘์ƒ์— ALPN์ด ์‚ฌ์šฉ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ์„ค๋ช…์ ์ธ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด์„ ์จ๋„ ๋œ๋‹ค.

      timingInfo์˜ ALPN ํ˜‘์ƒ ํ”„๋กœํ† ์ฝœ์€ ์‹ค์ œ ํ˜‘์ƒ ๋ฐฉ์‹์— ๊ด€๊ณ„์—†์ด ์‚ฌ์šฉ ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ์„ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค. ์ฆ‰ ALPN์ด ์‹ค์ œ๋กœ ์“ฐ์ด์ง€ ์•Š๋”๋ผ๋„ ์‚ฌ์šฉ๋œ ํ”„๋กœํ† ์ฝœ์„ ์ง€์‹œํ•˜๋Š” ALPN Protocol ID๋‹ค.

    IANA๋Š” ALPN Protocol ID ๋ชฉ๋ก์„ ๊ด€๋ฆฌํ•œ๋‹ค.

  4. connection์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


connection timing info ๊ธฐ๋ก(record connection timing info) ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ connection connection์— ๋Œ€ํ•ด timingInfo๋ฅผ connection์˜ timing info๋กœ ๋‘๊ณ , ๋‹ค์Œ ์‚ฌํ•ญ์„ ๊ด€์ฐฐํ•œ๋‹ค:

connection timing info clamp/coarsen ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์žฌ์‚ฌ์šฉ๋œ ์—ฐ๊ฒฐ์˜ ์ƒ์„ธ ์ •๋ณด ๋…ธ์ถœ ๋ฐฉ์ง€ ๋ฐ ์‹œ๊ฐ„๊ฐ’ coarsen์„ ๋ณด์žฅํ•œ๋‹ค.

2.7. ๋„คํŠธ์›Œํฌ ํŒŒํ‹ฐ์…˜ ํ‚ค(Network partition keys)

๋„คํŠธ์›Œํฌ ํŒŒํ‹ฐ์…˜ ํ‚ค(network partition key)๋Š” site์™€ null ๋˜๋Š” ๊ตฌํ˜„ ์ •์˜ ๊ฐ’์„ ์š”์†Œ๋กœ ํ•˜๋Š” ํŠœํ”Œ์ด๋‹ค.

๋„คํŠธ์›Œํฌ ํŒŒํ‹ฐ์…˜ ํ‚ค ๊ฒฐ์ •(determine the network partition key) ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ environment environment๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‹ค์Œ์„ ๋”ฐ๋ฅธ๋‹ค:

  1. topLevelOrigin์„ environment์˜ top-level origin์œผ๋กœ ๋‘”๋‹ค.

  2. topLevelOrigin์ด null์ด๋ฉด, topLevelOrigin์„ environment์˜ top-level creation URL์˜ origin์œผ๋กœ ๋‘”๋‹ค.

  3. Assert: topLevelOrigin์€ origin์ด๋‹ค.

  4. topLevelSite๋ฅผ obtain a site ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ topLevelOrigin์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  5. secondKey๋ฅผ null ๋˜๋Š” ๊ตฌํ˜„ ์ •์˜ ๊ฐ’ ์ค‘ ํ•˜๋‚˜๋กœ ๋‘”๋‹ค.

    secondKey๋Š” ์˜๋„์ ์œผ๋กœ ๋‹ค์†Œ ๋ชจํ˜ธํ•˜๊ฒŒ ์ •์˜๋˜์–ด ์žˆ๋‹ค. ์„ธ๋ถ€ ๋‚ด์šฉ์€ ์•„์ง ๋ฐœ์ „ ์ค‘์ž„. issue #1035 ์ฐธ๊ณ .

  6. (topLevelSite, secondKey)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋„คํŠธ์›Œํฌ ํŒŒํ‹ฐ์…˜ ํ‚ค ๊ฒฐ์ •(determine the network partition key)์„ ํ•˜๋ ค๋ฉด, request request์— ๋Œ€ํ•ด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค:

  1. request์˜ reserved client๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, request์˜ reserved client๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„คํŠธ์›Œํฌ ํŒŒํ‹ฐ์…˜ ํ‚ค ๊ฒฐ์ • ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. request์˜ client๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, request์˜ client๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„คํŠธ์›Œํฌ ํŒŒํ‹ฐ์…˜ ํ‚ค ๊ฒฐ์ • ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

2.8. HTTP ์บ์‹œ ํŒŒํ‹ฐ์…˜(HTTP cache partitions)

HTTP ์บ์‹œ ํŒŒํ‹ฐ์…˜ ๊ฒฐ์ •(determine the HTTP cache partition)์„ ํ•˜๋ ค๋ฉด, request request์— ๋Œ€ํ•ด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค:

  1. key๋ฅผ request๋กœ ๋„คํŠธ์›Œํฌ ํŒŒํ‹ฐ์…˜ ํ‚ค ๊ฒฐ์ •(determine the network partition key)์˜ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. key๊ฐ€ null์ด๋ฉด, null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. key์™€ ์—ฐ๊ด€๋œ ๊ณ ์œ  HTTP ์บ์‹œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. [HTTP-CACHING]

2.9. ํฌํŠธ ์ฐจ๋‹จ(Port blocking)

์ƒˆ๋กœ์šด ํ”„๋กœํ† ์ฝœ์€ TLS์˜ ALPN์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœํ† ์ฝœ ํ˜‘์ƒ์„ ํ†ตํ•ด ํฌํŠธ ์ฐจ๋‹จ์˜ ํ•„์š”์„ฑ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ๋Š” HTTP ์š”์ฒญ์œผ๋กœ ํ”„๋กœํ† ์ฝœ์„ ์œ„์กฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. [RFC7301]

request request๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ๋‚˜์œ ํฌํŠธ(bad port)๋กœ ์ธํ•ด ์ฐจ๋‹จ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•˜๋ ค๋ฉด:

  1. url์„ request์˜ ํ˜„์žฌ URL๋กœ ํ•œ๋‹ค.

  2. url์˜ ์Šคํ‚ด(scheme)์ด HTTP(S) ์Šคํ‚ด์ด๊ณ , url์˜ ํฌํŠธ(port)๊ฐ€ ๋‚˜์œ ํฌํŠธ(bad port)๋ผ๋ฉด, blocked๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. allowed๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

ํฌํŠธ(port)๊ฐ€ ๋‚˜์œ ํฌํŠธ(bad port)์ด๋ฉด ์•„๋ž˜ ํ‘œ์˜ ์ฒซ ๋ฒˆ์งธ ์—ด์— ๋‚˜์—ด๋œ ๊ฐ’ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

ํฌํŠธ ์ผ๋ฐ˜ ์„œ๋น„์Šค
0 โ€”โ€‹
1 tcpmux
7 echo
9 discard
11 systat
13 daytime
15 netstat
17 qotd
19 chargen
20 ftp-data
21 ftp
22 ssh
23 telnet
25 smtp
37 time
42 name
43 nicname
53 domain
69 tftp
77 โ€”โ€‹
79 finger
87 โ€”โ€‹
95 supdup
101 hostname
102 iso-tsap
103 gppitnp
104 acr-nema
109 pop2
110 pop3
111 sunrpc
113 auth
115 sftp
117 uucp-path
119 nntp
123 ntp
135 epmap
137 netbios-ns
139 netbios-ssn
143 imap
161 snmp
179 bgp
389 ldap
427 svrloc
465 submissions
512 exec
513 login
514 shell
515 printer
526 tempo
530 courier
531 chat
532 netnews
540 uucp
548 afp
554 rtsp
556 remotefs
563 nntps
587 submission
601 syslog-conn
636 ldaps
989 ftps-data
990 ftps
993 imaps
995 pop3s
1719 h323gatestat
1720 h323hostcall
1723 pptp
2049 nfs
3659 apple-sasl
4045 npp
4190 sieve
5060 sip
5061 sips
6000 x11
6566 sane-port
6665 ircu
6666 ircu
6667 ircu
6668 ircu
6669 ircu
6679 osaut
6697 ircs-u
10080 amanda

2.10. response๋ฅผ request์— ๋Œ€ํ•ด MIME ํƒ€์ž…์œผ๋กœ ์ฐจ๋‹จํ•ด์•ผ ํ•˜๋Š”๊ฐ€?

๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค:

  1. mimeType์„ response์˜ header list์—์„œ MIME ํƒ€์ž… ์ถ”์ถœ์˜ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. mimeType์ด failure๋ผ๋ฉด allowed๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. destination์„ request์˜ destination์œผ๋กœ ๋‘”๋‹ค.

  4. destination์ด script-like์ด๊ณ , ์•„๋ž˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ํ•ด๋‹น๋˜๋ฉด blocked๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค:

    • mimeType์˜ essence๊ฐ€ "audio/", "image/", "video/"๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ
    • mimeType์˜ essence๊ฐ€ "text/csv"์ธ ๊ฒฝ์šฐ
  5. allowed๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

3. HTTP ํ™•์žฅ

3.1. ์ฟ ํ‚ค(Cookies)

`Cookie` ์š”์ฒญ ํ—ค๋”์™€ `Set-Cookie` ์‘๋‹ต ํ—ค๋”๋Š” ๋Œ€๋ถ€๋ถ„ ์ž์ฒด ๋ช…์„ธ์—์„œ ์ •์˜๋œ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์ด๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€ ์ธํ”„๋ผ๋ฅผ ์ •์˜ํ•œ๋‹ค. [COOKIES].

์š”์ฒญ์˜ `Cookie` ํ—ค๋”๋ฅผ ์ถ”๊ฐ€(append a request `Cookie` header)ํ•˜๋ ค๋ฉด, request request์— ๋Œ€ํ•ด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค:

  1. ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๊ฐ€ request์— ๋Œ€ํ•ด ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์„ค์ •๋˜์–ด ์žˆ๋‹ค๋ฉด, ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. sameSite๋ฅผ request์— ๋Œ€ํ•ด same-site ๋ชจ๋“œ ๊ฒฐ์ •(determine the same-site mode)์˜ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  3. isSecure๋ฅผ request์˜ ํ˜„์žฌ URL์˜ ์Šคํ‚ด(scheme)์ด "https"๋ผ๋ฉด true, ์•„๋‹ˆ๋ฉด false๋กœ ๋‘”๋‹ค.

  4. httpOnlyAllowed๋ฅผ true๋กœ ๋‘”๋‹ค.

    fetch ์—์„œ ํ˜ธ์ถœ๋˜๋Š” ๊ฒฝ์šฐ์ด๋ฏ€๋กœ document.cookie getter์™€ ๋‹ฌ๋ฆฌ true๊ฐ€ ๋œ๋‹ค.

  5. cookies๋ฅผ ์ฟ ํ‚ค ๊ฒ€์ƒ‰(retrieve cookies)์„ isSecure, request์˜ ํ˜„์žฌ URL์˜ host, request์˜ ํ˜„์žฌ URL์˜ path, httpOnlyAllowed, sameSite๋ฅผ ๋„˜๊ฒจ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

    ์ฟ ํ‚ค ์ €์žฅ์†Œ๋Š” ์ •๋ ฌ๋œ ์ฟ ํ‚ค ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  6. cookies๊ฐ€ ๋น„์–ด ์žˆ๋‹ค๋ฉด ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  7. value๋ฅผ ์ฟ ํ‚ค ์ง๋ ฌํ™”(serialize cookies)๋ฅผ cookies์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  8. ์ถ”๊ฐ€(Append) (`Cookie`, value)๋ฅผ request์˜ ํ—ค๋” ๋ชฉ๋ก(header list)์— ์ถ”๊ฐ€ํ•œ๋‹ค.

์‘๋‹ต์˜ `Set-Cookie` ํ—ค๋” ํŒŒ์‹ฑ ๋ฐ ์ €์žฅ์„ ํ•˜๋ ค๋ฉด, request request์™€ response response๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค:

  1. ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๊ฐ€ request์— ๋Œ€ํ•ด ์ฟ ํ‚ค ์‚ฌ์šฉ์„ ๋น„ํ™œ์„ฑํ™”ํ•œ ๊ฒฝ์šฐ, ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. allowNonHostOnlyCookieForPublicSuffix๋ฅผ false๋กœ ๋‘”๋‹ค.

  3. isSecure๋ฅผ request์˜ ํ˜„์žฌ URL์˜ ์Šคํ‚ด(scheme)์ด "https"์ด๋ฉด true, ์•„๋‹ˆ๋ฉด false๋กœ ๋‘”๋‹ค.

  4. httpOnlyAllowed๋ฅผ true๋กœ ๋‘”๋‹ค.

    fetch์—์„œ ํ˜ธ์ถœ๋˜์—ˆ์œผ๋ฏ€๋กœ(์˜ˆ: document.cookie getter๊ฐ€ ์•„๋‹˜) true๊ฐ€ ๋œ๋‹ค.

  5. sameSiteStrictOrLaxAllowed๋ฅผ ๋™์ผ ์‚ฌ์ดํŠธ ๋ชจ๋“œ ๊ฒฐ์ •(determine the same-site mode) ์˜ ๊ฒฐ๊ณผ๊ฐ€ "strict-or-less"๋ฉด true, ์•„๋‹ˆ๋ฉด false๋กœ ๋‘”๋‹ค.

  6. ๊ฐ response์˜ ํ—ค๋” ๋ชฉ๋ก(header list)์˜ header์— ๋Œ€ํ•˜์—ฌ:

    1. header์˜ ์ด๋ฆ„(name)์ด `Set-Cookie`์™€ ๋ฐ”์ดํŠธ ๋Œ€์†Œ๋ฌธ์ž ๋ฌด์‹œ(byte-case-insensitive)๋กœ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด continue ํ•œ๋‹ค.

    2. ์ฟ ํ‚ค ํŒŒ์‹ฑ ๋ฐ ์ €์žฅ(Parse and store a cookie)๋ฅผ header์˜ ๊ฐ’(value), isSecure, request์˜ ํ˜„์žฌ URL์˜ host, request์˜ ํ˜„์žฌ URL์˜ path, httpOnlyAllowed, allowNonHostOnlyCookieForPublicSuffix, sameSiteStrictOrLaxAllowed๋กœ ์‹คํ–‰ํ•œ๋‹ค.

    3. ์ฟ ํ‚ค ์ •๋ฆฌ(Garbage collect cookies)๋ฅผ request์˜ ํ˜„์žฌ URL์˜ host๋ฅผ ๋„˜๊ฒจ ์‹คํ–‰ํ•œ๋‹ค.

    ๋‹ค๋ฅธ ๊ณณ์—์„œ๋„ ์–ธ๊ธ‰๋œ ๊ฒƒ์ฒ˜๋Ÿผ `Set-Cookie` ํ—ค๋”๋Š” ๋ณ‘ํ•ฉ๋  ์ˆ˜ ์—†์–ด ๊ฐ ์ธ์Šคํ„ด์Šค๋ณ„๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•œ๋‹ค. ์ด๋Š” ๋‹ค๋ฅธ ์–ด๋–ค ํ—ค๋”์—๋„ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

์ฃผ์–ด์ง„ request request์— ๋Œ€ํ•ด same-site ๋ชจ๋“œ ๊ฒฐ์ •์„ ํ•˜๋ ค๋ฉด:

  1. ๋‹จ์–ธ(assert): request์˜ method๊ฐ€ "GET" ๋˜๋Š” "POST"์ž„์„ ๋‹จ์–ธํ•œ๋‹ค.

  2. request์˜ ์ตœ์ƒ์œ„ ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฐœ์‹ ์ž ์ถœ์ฒ˜(top-level navigation initiator origin)๊ฐ€ null์ด ์•„๋‹ˆ๊ณ  request์˜ URL์˜ origin๊ณผ same site๊ฐ€ ์•„๋‹ˆ๋ฉด "unset-or-less"๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. request์˜ method๊ฐ€ "GET"์ด๊ณ , request์˜ destination์ด "document"์ด๋ฉด "lax-or-less"๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  4. request์˜ client์˜ ๊ต์ฐจ ์‚ฌ์ดํŠธ ์ƒ์œ„(cross-site ancestor)๊ฐ€ ์žˆ์œผ๋ฉด "unset-or-less"๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  5. request์˜ redirect-taint๊ฐ€ "cross-site"์ด๋ฉด, "unset-or-less"๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  6. "strict-or-less"๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

URL url์— ๋Œ€ํ•ด ์ง๋ ฌํ™”๋œ ์ฟ ํ‚ค ๊ธฐ๋ณธ ๊ฒฝ๋กœ(serialized cookie default path)๋ฅผ ์–ป์œผ๋ ค๋ฉด:

  1. cloneURL์„ url์˜ ๋ณต์ œ๋ณธ์œผ๋กœ ๋‘”๋‹ค.

  2. cloneURL์˜ ๊ฒฝ๋กœ(path)๋ฅผ ์ฟ ํ‚ค ๊ธฐ๋ณธ ๊ฒฝ๋กœ(cookie default path)๋กœ ์„ค์ •ํ•œ๋‹ค. (๋Œ€์ƒ์€ cloneURL์˜ ๊ฒฝ๋กœ(path)์ž„)

  3. cloneURL์˜ URL ๊ฒฝ๋กœ ์ง๋ ฌํ™”(URL path serialization)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

3.2. `Origin` ํ—ค๋”

`Origin` ์š”์ฒญ header๋Š” fetch๊ฐ€ ์–ด๋””์„œ ์‹œ์ž‘๋˜์—ˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

`Origin` ํ—ค๋”๋Š” ๊ฒฝ๋กœ๋ฅผ ๋“œ๋Ÿฌ๋‚ด์ง€ ์•Š๋Š” `Referer` [sic] ํ—ค๋”์˜ ํ•œ ๋ฒ„์ „์ด๋‹ค. ์ด๋Š” HTTP fetch ์ค‘์—์„œ ์š”์ฒญ์˜ ์‘๋‹ต ์˜ค์—ผ์ด "cors"์ธ ๋ชจ๋“  ๊ฒฝ์šฐ์™€, ์š”์ฒญ์˜ ๋ฉ”์„œ๋“œ๊ฐ€ `GET`๋„ `HEAD`๋„ ์•„๋‹Œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋œ๋‹ค. ํ˜ธํ™˜์„ฑ ์ œ์•ฝ์œผ๋กœ ์ธํ•ด ๋ชจ๋“  fetch์— ํฌํ•จ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค.

๊ทธ ๊ฐ€๋Šฅํ•œ ๊ฐ’์€ ์š”์ฒญ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ์š”์ฒญ ์ถœ์ฒ˜๋ฅผ ๋ฐ”์ดํŠธ ์ง๋ ฌํ™”ํ•˜๊ธฐ์˜ ๋ชจ๋“  ๋ฐ˜ํ™˜ ๊ฐ’์ด๋‹ค. ์ด๋“ค์€ ๋‹ค์Œ ABNF๋กœ ํ‘œํ˜„๋œ๋‹ค:

serialized-ipv4   = dec-octet "." dec-octet "." dec-octet "." dec-octet
dec-octet         = DIGIT                 ; 0-9
                  / %x31-39 DIGIT         ; 10-99
                  / "1" 2DIGIT            ; 100-199
                  / "2" %x30-34 DIGIT     ; 200-249
                  / "25" %x30-35          ; 250-255

serialized-ipv6   =                            7( h16 ":" ) h16
                  /                       "::" 5( h16 ":" ) h16
                  / [               h16 ] "::" 4( h16 ":" ) h16
                  / [ *1( h16 ":" ) h16 ] "::" 3( h16 ":" ) h16
                  / [ *2( h16 ":" ) h16 ] "::" 2( h16 ":" ) h16
                  / [ *3( h16 ":" ) h16 ] "::"    h16 ":"   h16
                  / [ *4( h16 ":" ) h16 ] "::"              h16
                  / [ *5( h16 ":" ) h16 ] "::"
h16               = "0" / ( non-zero-hex 0*3hex )
non-zero-hex      = %x31-39 / %x61-66 ; '1'-'9' or lowercase 'a'-'f'
hex               = %x30-39 / %x61-66 ; '0'-'9' or lowercase 'a'-'f

lower-alpha       = %x61-7A
lower-alphanum    = lower-alpha / DIGIT
domain-label      = lower-alphanum / ( lower-alphanum *( lower-alphanum / "-" ) lower-alphanum )
serialized-domain = *( domain-label "." ) domain-label

serialized-scheme = lower-alpha *( lower-alphanum / "+" / "-" / "." )
serialized-host   = serialized-ipv4 / "[" serialized-ipv6 "]" / serialized-domain
serialized-port   = 1*5DIGIT

serialized-origin = serialized-scheme "://" serialized-host [ ":" serialized-port ]
origin-or-null    = serialized-origin / %s"null" ; case-sensitive

Origin = origin-or-null

์ด๋Š” The Web Origin Concept์˜ ์ •์˜๋ฅผ ๋Œ€์ฒดํ•œ๋‹ค. [ORIGIN]

์—ฌ๊ธฐ์—์„œ ์ •์˜ํ•œ ์ถœ์ฒ˜ ์ง๋ ฌํ™”๋Š” [RFC3986]์˜ ๋ฌธ๋ฒ•๋ณด๋‹ค ๋‘ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ๋ฐฉ์‹์—์„œ ๋” ์ œํ•œ์ ์ด๋‹ค. ์ฒซ์งธ, ์Šคํ‚ด ๋ฐ ๋„๋ฉ”์ธ ์ง๋ ฌํ™”๋Š” ๋ชจ๋‘ ์†Œ๋ฌธ์ž ASCII์ด๋ฉฐ, ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋‘˜์งธ, URL ยง 3.6 Host serializing ๋ฐ [RFC5952]์˜ ๊ถŒ๊ณ ์— ๋”ฐ๋ผ, IPv6 ์ฃผ์†Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ œํ•œ๋œ๋‹ค:


์š”์ฒญ `Origin` ํ—ค๋” ์ถ”๊ฐ€๋ฅผ ํ•˜๋ ค๋ฉด, request request์— ๋Œ€ํ•ด ์•„๋ž˜ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. Assert: request์˜ origin์ด "client"๊ฐ€ ์•„๋‹˜.

  2. serializedOrigin์„ byte-serializing a request origin (request ์‚ฌ์šฉ) ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. ๋งŒ์•ฝ request์˜ response tainting์ด "cors"์ด๊ฑฐ๋‚˜, request์˜ mode๊ฐ€ "websocket" ๋˜๋Š” "webtransport"๋ผ๋ฉด, append (`Origin`, serializedOrigin)์„ request์˜ header list์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  4. ๊ทธ ์™ธ์—, request์˜ method๊ฐ€ `GET`์ด๋‚˜ `HEAD`๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด:

    1. request์˜ mode๊ฐ€ "cors"๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, request์˜ referrer policy์— ๋”ฐ๋ผ ์•„๋ž˜๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

      "no-referrer"

      serializedOrigin์„ `null`๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      "no-referrer-when-downgrade"
      "strict-origin"
      "strict-origin-when-cross-origin"

      ๋งŒ์•ฝ request์˜ origin์ด tuple origin์ด๊ณ , ๊ทธ scheme์ด "https"์ด๋ฉฐ, request์˜ current URL์˜ scheme์ด "https"๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, serializedOrigin์„ `null`๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      "same-origin"

      request์˜ ์ถœ์ฒ˜๊ฐ€ ๋™์ผ ์ถœ์ฒ˜๊ฐ€ ์•„๋‹ˆ๋ฉฐ request์˜ ํ˜„์žฌ URL์˜ ์ถœ์ฒ˜์™€ ๊ฐ™์ง€ ์•Š์œผ๋ฉด, serializedOrigin์„ `null`๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      ๊ทธ ์™ธ
      ์•„๋ฌด ๋™์ž‘๋„ ํ•˜์ง€ ์•Š์Œ.
    2. Append (`Origin`, serializedOrigin)์„ request์˜ header list์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์š”์ฒญ์˜ ๋ฆฌํผ๋Ÿฌ ์ •์ฑ…์€ fetcher๊ฐ€ ์„œ๋ฒ„์™€ ์ž์‹ ์˜ origin์„ ๊ณต์œ ํ•˜๊ฒ ๋‹ค๊ณ  ๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒํ•˜์ง€ ์•Š์€ ๋ชจ๋“  fetch์—์„œ ๊ณ ๋ ค๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด CORS ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

3.3. CORS ํ”„๋กœํ† ์ฝœ

์‘๋‹ต์„ ๊ต์ฐจ ์ถœ์ฒ˜(cross-origin)๋กœ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ณ  HTML์˜ form ์š”์†Œ๋กœ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•œ ๋” ๋‹ค์–‘ํ•œ fetch๋ฅผ ์œ„ํ•ด, CORS ํ”„๋กœํ† ์ฝœ์ด ์กด์žฌํ•œ๋‹ค. CORS๋Š” HTTP ์œ„์— ๊ณ„์ธตํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ, ์‘๋‹ต์ด ๋‹ค๋ฅธ ์ถœ์ฒ˜(origin)์™€ ๊ณต์œ ๋  ์ˆ˜ ์žˆ์Œ์„ ์„ ์–ธํ•˜๋„๋ก ํ•œ๋‹ค.

์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ฐฉํ™”๋ฒฝ(์ธํŠธ๋ผ๋„ท) ๋’ค์˜ ์‘๋‹ต ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด opt-in์ด์–ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ ์š”์ฒญ(request)์ด ์ธ์ฆ์ •๋ณด(credentials)๋ฅผ ํฌํ•จํ•  ๋•Œ, ๋ฏผ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์ถœ๋˜์ง€ ์•Š๋„๋ก opt-in์ด์–ด์•ผ ํ•œ๋‹ค.

์ด ์ ˆ์—์„œ๋Š” ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ CORS ํ”„๋กœํ† ์ฝœ์˜ ๋‚ด์šฉ์„ ์„ค๋ช…ํ•œ๋‹ค. ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ์— ๋Œ€ํ•œ ์š”๊ตฌ์‚ฌํ•ญ์€ fetch ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ผ๋ถ€์ด๋ฉฐ, ์ƒˆ๋กœ์šด HTTP ํ—ค๋” ๋ฌธ๋ฒ•์€ ์˜ˆ์™ธ๋‹ค.

3.3.1. ์ผ๋ฐ˜

CORS ํ”„๋กœํ† ์ฝœ์€ ์‘๋‹ต์ด ๊ต์ฐจ ์ถœ์ฒ˜๋กœ ๊ณต์œ ๋  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ผ๋ จ์˜ ํ—ค๋”๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

HTML์˜ form ์š”์†Œ๋กœ ๊ฐ€๋Šฅํ•œ ๊ฒƒ๋ณด๋‹ค ๋” ๋ณต์žกํ•œ ์š”์ฒญ์— ๋Œ€ํ•ด์„œ๋Š”, CORS-preflight request๊ฐ€ ์ˆ˜ํ–‰๋˜์–ด, ์š”์ฒญ์˜ ํ˜„์žฌ URL์ด CORS ํ”„๋กœํ† ์ฝœ์„ ์ง€์›ํ•˜๋Š”์ง€ ๋ณด์žฅํ•œ๋‹ค.

3.3.2. HTTP ์š”์ฒญ

CORS ์š”์ฒญ์ด๋ž€ `Origin` ํ—ค๋”๋ฅผ ํฌํ•จํ•˜๋Š” HTTP ์š”์ฒญ์„ ๋งํ•œ๋‹ค. ์ด ํ—ค๋”๋Š” CORS ํ”„๋กœํ† ์ฝœ์— ์ฐธ์—ฌํ•˜๋Š”์ง€ ์‹ ๋ขฐ์„ฑ ์žˆ๊ฒŒ ํŒ๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ค€์ด ๋˜์ง€ ์•Š๋Š”๋‹ค. ์™œ๋ƒํ•˜๋ฉด `Origin` ํ—ค๋”๋Š” request์˜ method๊ฐ€ `GET` ๋˜๋Š” `HEAD`๊ฐ€ ์•„๋‹Œ ๋ชจ๋“  ๊ฒฝ์šฐ์—๋„ ํฌํ•จ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

CORS-์‚ฌ์ „ ์š”์ฒญ(CORS-preflight request)์ด๋ž€ CORS ์š”์ฒญ์œผ๋กœ, CORS ํ”„๋กœํ† ์ฝœ์ด ์ ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์ด ๋•Œ method๋Š” `OPTIONS`์ด๊ณ  ๋‹ค์Œ ํ—ค๋”๊ฐ€ ํฌํ•จ๋œ๋‹ค:

`Access-Control-Request-Method`

์ดํ›„์— ๋™์ผ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ํ•  CORS ์š”์ฒญ์ด ์–ด๋–ค method๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋‚˜ํƒ€๋‚ธ๋‹ค.

CORS-์‚ฌ์ „ ์š”์ฒญ์—๋Š” ๋‹ค์Œ ํ—ค๋”๋„ ํฌํ•จ๋  ์ˆ˜ ์žˆ๋‹ค:

`Access-Control-Request-Headers`

์ดํ›„์— ๋™์ผ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ํ•  CORS ์š”์ฒญ์ด ์–ด๋–ค ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋‚˜ํƒ€๋‚ธ๋‹ค.

3.3.3. HTTP ์‘๋‹ต

CORS ์š”์ฒญ์— ๋Œ€ํ•œ HTTP ์‘๋‹ต์—๋Š” ๋‹ค์Œ ํ—ค๋”๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค:

`Access-Control-Allow-Origin`

์‘๋‹ต์—์„œ `Origin` ์š”์ฒญ ํ—ค๋”์˜ ๋ฆฌํ„ฐ๋Ÿด ๊ฐ’ (์ด๋Š” `null`์ผ ์ˆ˜ ์žˆ์Œ) ๋˜๋Š” `*`๋ฅผ ๋ฐ˜ํ™˜ํ•จ์œผ๋กœ์จ, ์‘๋‹ต์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

`Access-Control-Allow-Credentials`

์š”์ฒญ์˜ ์ž๊ฒฉ ์ฆ๋ช… ๋ชจ๋“œ๊ฐ€ "include"์ผ ๋•Œ ์‘๋‹ต์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

CORS-preflight request์˜ ๊ฒฝ์šฐ, ์š”์ฒญ์˜ ์ž๊ฒฉ ์ฆ๋ช… ๋ชจ๋“œ๋Š” ํ•ญ์ƒ "same-origin"์ด๋‹ค. ์ฆ‰, ์ž๊ฒฉ ์ฆ๋ช…์„ ์ œ์™ธํ•˜์ง€๋งŒ, ์ดํ›„์˜ ์–ด๋–ค CORS ์š”์ฒญ์—์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ง€์› ์—ฌ๋ถ€๋Š” CORS-preflight request์— ๋Œ€ํ•œ HTTP ์‘๋‹ต์˜ ์ผ๋ถ€๋กœ๋„ ํ‘œ์‹œ๋˜์–ด์•ผ ํ•œ๋‹ค.

CORS-preflight request์— ๋Œ€ํ•œ HTTP ์‘๋‹ต์€ ๋‹ค์Œ ํ—ค๋”๋“ค์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค:

`Access-Control-Allow-Methods`

CORS ํ”„๋กœํ† ์ฝœ์˜ ๋ชฉ์ ์ƒ, ์‘๋‹ต์˜ URL์ด ์–ด๋–ค ๋ฉ”์„œ๋“œ๋ฅผ ์ง€์›ํ•˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

`Allow` ํ—ค๋”๋Š” CORS ํ”„๋กœํ† ์ฝœ์˜ ๋ชฉ์ ์ƒ ๊ด€๋ จ์ด ์—†๋‹ค.

`Access-Control-Allow-Headers`

CORS ํ”„๋กœํ† ์ฝœ์˜ ๋ชฉ์ ์ƒ, ์‘๋‹ต์˜ URL์ด ์–ด๋–ค ํ—ค๋”๋ฅผ ์ง€์›ํ•˜๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

`Access-Control-Max-Age`

`Access-Control-Allow-Methods` ๋ฐ `Access-Control-Allow-Headers` ํ—ค๋”๋“ค์ด ์ œ๊ณตํ•œ ์ •๋ณด๋ฅผ ์บ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ์ดˆ ์ˆ˜(๊ธฐ๋ณธ๊ฐ’์€ 5)๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

CORS ์š”์ฒญ์ด๋ฉด์„œ CORS-์‚ฌ์ „ ์š”์ฒญ์ด ์•„๋‹Œ ๊ฒฝ์šฐ, ๋‹ค์Œ ํ—ค๋”๋„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค:

`Access-Control-Expose-Headers`

์‘๋‹ต์˜ ์ผ๋ถ€๋กœ ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ๋Š” ํ—ค๋”๋ฅผ ๊ทธ ์ด๋ฆ„๋“ค์„ ๋‚˜์—ดํ•˜์—ฌ ํ‘œ์‹œํ•œ๋‹ค.


์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ณต์œ  ์˜๋„๊ฐ€ ์žˆ๋Š” CORS ์š”์ฒญ์— ๋Œ€ํ•œ ์„ฑ๊ณต์ ์ธ HTTP ์‘๋‹ต์€, ์œ„์— ๋ช…์‹œ๋œ ํ—ค๋”๋ฅผ ์š”์ฒญ์— ๋งž๋Š” ๊ฐ’์œผ๋กœ ํฌํ•จํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ์–ด๋–ค status๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

CORS-์‚ฌ์ „ ์š”์ฒญ์— ๋Œ€ํ•œ ์„ฑ๊ณต์ ์ธ HTTP ์‘๋‹ต๋„ ์œ ์‚ฌํ•˜๋‚˜, ok status (์˜ˆ: 200 ๋˜๋Š” 204)๋กœ ์ œํ•œ๋œ๋‹ค.

๊ทธ ์™ธ์˜ HTTP ์‘๋‹ต์€ ์„ฑ๊ณต์ ์ด์ง€ ์•Š์œผ๋ฉฐ, ๊ณต์œ ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ CORS-์‚ฌ์ „ ์š”์ฒญ์— ์‹คํŒจํ•œ๋‹ค. ์„œ๋ฒ„์—์„œ ์ˆ˜ํ–‰ํ•œ ์ž‘์—…์ด ํƒ€์ด๋ฐ ๋“ฑ ๋ถ€์ฑ„๋„๋กœ ๋ˆ„์ถœ๋  ์ˆ˜ ์žˆ์Œ์— ์œ ์˜ํ•ด์•ผ ํ•œ๋‹ค. ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๊ณ  ์‹ถ๋‹ค๋ฉด, 403 status์™€ ๊ด€๋ จ ํ—ค๋”์˜ ์ƒ๋žต์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์›ํ•œ๋‹ค๋ฉด "์‹คํŒจ"๋„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ๋Ÿฌ๋ฉด ์„ฑ๊ณต์ ์ธ HTTP ์‘๋‹ต์ด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— CORS ์š”์ฒญ์— ๋Œ€ํ•œ ์„ฑ๊ณต์ ์ธ HTTP ์‘๋‹ต์ด CORS ์‚ฌ์ „ ์š”์ฒญ์ด ์•„๋‹Œ ๊ฒฝ์šฐ, ์ƒํƒœ๋Š” 403์„ ํฌํ•จํ•˜์—ฌ ์–ด๋–ค ๊ฐ’์ด๋“  ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž๋Š” HTTP ์‘๋‹ต ์ฒ˜๋ฆฌ ๋ฐฉ์‹์—์„œ ๋งŽ์€ ์ž์œ ๋ฅผ ๊ฐ€์ง€๋ฉฐ, ์ด๋Ÿฌํ•œ ์ „๋žต์€ CORS-์‚ฌ์ „ ์š”์ฒญ๊ณผ ๊ทธ ์ดํ›„ CORS ์š”์ฒญ์˜ ์‘๋‹ต ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค:

3.3.4. HTTP new-header ๋ฌธ๋ฒ•

ABNF: CORS ํ”„๋กœํ† ์ฝœ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ—ค๋”์˜ ๊ฐ’์— ๋Œ€ํ•œ ๊ฒƒ:

Access-Control-Request-Method    = method
Access-Control-Request-Headers   = 1#field-name

wildcard                         = "*"
Access-Control-Allow-Origin      = origin-or-null / wildcard

Access-Control-Allow-Credentials = %s"true" ; case-sensitive
Access-Control-Expose-Headers    = #field-name
Access-Control-Max-Age           = delta-seconds
Access-Control-Allow-Methods     = #method
Access-Control-Allow-Headers     = #field-name

`Access-Control-Expose-Headers`, `Access-Control-Allow-Methods`, ๊ทธ๋ฆฌ๊ณ  `Access-Control-Allow-Headers` ์‘๋‹ต ํ—ค๋”์˜ ๊ฒฝ์šฐ, ๊ฐ’ `*`๋Š” ์ž๊ฒฉ ์ฆ๋ช…์ด ์—†๋Š” ์š”์ฒญ์— ๋Œ€ํ•ด ์™€์ผ๋“œ์นด๋“œ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค. ๊ทธ๋Ÿฌํ•œ ์š”์ฒญ์—์„œ๋Š” `*`์ธ ํ—ค๋” ์ด๋ฆ„ ๋˜๋Š” ๋ฉ”์„œ๋“œ๋งŒ์„ ์ผ์น˜์‹œํ‚ฌ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค.

3.3.5. CORS ํ”„๋กœํ† ์ฝœ๊ณผ credentials

์š”์ฒญ์˜ ์ž๊ฒฉ ์ฆ๋ช… ๋ชจ๋“œ๊ฐ€ "include"์ผ ๋•Œ, ์ด๋Š” fetch์— ์ž๊ฒฉ ์ฆ๋ช…์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ CORS ํ”„๋กœํ† ์ฝœ์˜ ์ž‘๋™์— ์˜ํ–ฅ์„ ์ค€๋‹ค.

์˜ˆ์ „์—๋Š” XMLHttpRequest๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ์˜ ์ž๊ฒฉ ์ฆ๋ช… ๋ชจ๋“œ๋ฅผ "include"๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค:

var client = new XMLHttpRequest()
client.open("GET", "./")
client.withCredentials = true
/* โ€ฆ */

์˜ค๋Š˜๋‚ ์—๋Š” fetch("./", { credentials:"include" }).then(/* โ€ฆ */)์ด๋ฉด ์ถฉ๋ถ„ํ•˜๋‹ค.

์š”์ฒญ์˜ ์ž๊ฒฉ ์ฆ๋ช… ๋ชจ๋“œ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์„œ๋ฒ„์—์„œ ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์š”์ฒญ์— ๋Œ€ํ•ด ์ž๊ฒฉ ์ฆ๋ช…์ด ์กด์žฌํ•  ๋•Œ์—๋งŒ, ๊ทธ ์ž๊ฒฉ ์ฆ๋ช…์ด ํฌํ•จ๋จ์œผ๋กœ์จ ๊ด€์ฐฐ๋  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ CORS-preflight request์—๋Š” ์ž๊ฒฉ ์ฆ๋ช…์ด ์ ˆ๋Œ€ ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜๋ผ.

๋”ฐ๋ผ์„œ ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž๋Š” ์ž๊ฒฉ ์ฆ๋ช…์œผ๋กœ "์˜ค์—ผ๋œ" ์‘๋‹ต์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ CORS-preflight request๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ์š”์ฒญ์ด ์ž๊ฒฉ ์ฆ๋ช…์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋„ ๊ฒฐ์ •ํ•ด์•ผ ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋งํ•ด, ์‘๋‹ต์„ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ๊ณผ ์ž๊ฒฉ ์ฆ๋ช…์ด ์žˆ๋Š” ์š”์ฒญ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ชจ๋‘ ์ƒ๋‹นํžˆ ์•ˆ์ „ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ํ˜ผ๋™๋œ ๋Œ€๋ฆฌ์ž ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๋ ค๋ฉด ๊ทน๋„์˜ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

์ž๊ฒฉ ์ฆ๋ช…์ด ์žˆ๋Š” ์‘๋‹ต์„ ๊ณต์œ ํ•˜๋ ค๋ฉด, `Access-Control-Allow-Origin` ๋ฐ `Access-Control-Allow-Credentials` ํ—ค๋”๊ฐ€ ์ค‘์š”ํ•˜๋‹ค. ๋‹ค์Œ ํ‘œ๋Š” https://rabbit.invalid/์— ๋Œ€ํ•œ ์š”์ฒญ์—์„œ ๋‹ค์–‘ํ•œ ํ•ฉ๋ฒ• ๋ฐ ๋ถˆ๋ฒ• ์กฐํ•ฉ์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค:

์š”์ฒญ์˜ ์ž๊ฒฉ ์ฆ๋ช… ๋ชจ๋“œ `Access-Control-Allow-Origin` `Access-Control-Allow-Credentials` ๊ณต์œ ๋จ? ๋น„๊ณ 
"omit" `*` ์ƒ๋žต๋จ โœ… โ€”โ€‹
"omit" `*` `true` โœ… ์ž๊ฒฉ ์ฆ๋ช… ๋ชจ๋“œ๊ฐ€ "include"๊ฐ€ ์•„๋‹ˆ๋ฉด, `Access-Control-Allow-Credentials`๋Š” ๋ฌด์‹œ๋œ๋‹ค.
"omit" `https://rabbit.invalid/` ์ƒ๋žต๋จ โŒ ์ง๋ ฌํ™”๋œ origin์—๋Š” ๋’ค๋”ฐ๋ฅด๋Š” ์Šฌ๋ž˜์‹œ๊ฐ€ ์—†๋‹ค.
"omit" `https://rabbit.invalid` ์ƒ๋žต๋จ โœ… โ€”โ€‹
"include" `*` `true` โŒ ์ž๊ฒฉ ์ฆ๋ช… ๋ชจ๋“œ๊ฐ€ "include"์ด๋ฉด, `Access-Control-Allow-Origin`์€ `*`์ผ ์ˆ˜ ์—†๋‹ค.
"include" `https://rabbit.invalid` `true` โœ… โ€”โ€‹
"include" `https://rabbit.invalid` `True` โŒ `true`๋Š” (๋ฐ”์ดํŠธ ๊ธฐ์ค€) ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, `Access-Control-Expose-Headers`, `Access-Control-Allow-Methods`, ๊ทธ๋ฆฌ๊ณ  `Access-Control-Allow-Headers` ์‘๋‹ต ํ—ค๋”๋Š” ์š”์ฒญ์˜ ์ž๊ฒฉ ์ฆ๋ช… ๋ชจ๋“œ๊ฐ€ "include"๊ฐ€ ์•„๋‹ ๋•Œ์—๋งŒ `*`๋ฅผ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

3.3.6. ์˜ˆ์‹œ

https://foo.invalid/์— ์žˆ๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ https://bar.invalid/์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์–ด ํ•œ๋‹ค. (credentials๋‚˜ ์‘๋‹ต ํ—ค๋” ์ ‘๊ทผ์€ ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค.)

var url = "https://bar.invalid/api?key=730d67a37d7f3d802e96396d00280768773813fbe726d116944d814422fc1a45&data=about:unicorn";
fetch(url).then(success, failure)

์ด ๊ฒฝ์šฐ CORS ํ”„๋กœํ† ์ฝœ์ด ์‚ฌ์šฉ๋˜์ง€๋งŒ, foo.invalid์˜ ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋Š” ์™„์ „ํžˆ ํˆฌ๋ช…ํ•˜๋‹ค. CORS ํ”„๋กœํ† ์ฝœ์˜ ์ผ๋ถ€๋กœ, ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ์š”์ฒญ์— `Origin` ํ—ค๋”๋ฅผ ํฌํ•จํ•œ๋‹ค:

Origin: https://foo.invalid

bar.invalid๋กœ๋ถ€ํ„ฐ ์‘๋‹ต์„ ๋ฐ›์€ ํ›„, ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” `Access-Control-Allow-Origin` ์‘๋‹ต ํ—ค๋”๋ฅผ ํ™•์ธํ•œ๋‹ค. ๊ฐ’์ด `https://foo.invalid` ๋˜๋Š” `*`๋ผ๋ฉด success ์ฝœ๋ฐฑ์„ ํ˜ธ์ถœํ•œ๋‹ค. ๊ทธ ์™ธ์ด๊ฑฐ๋‚˜ ํ•ด๋‹น ํ—ค๋”๊ฐ€ ์—†์œผ๋ฉด failure ์ฝœ๋ฐฑ์„ ํ˜ธ์ถœํ•œ๋‹ค.

foo.invalid์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋‹ค์‹œ ๋‚˜ํƒ€๋‚˜, ์ด๋ฒˆ์—” bar.invalid์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด์„œ ์‘๋‹ต ํ—ค๋”์— ์ ‘๊ทผํ•˜๊ณ ์ž ํ•œ๋‹ค.

fetch(url).then(response => {
  var hsts = response.headers.get("strict-transport-security"),
      csp = response.headers.get("content-security-policy")
  log(hsts, csp)
})

bar.invalid์€ ์•ž์„  ์˜ˆ์‹œ์—์„œ์™€ ๊ฐ™์ด ์˜ฌ๋ฐ”๋ฅธ `Access-Control-Allow-Origin` ์‘๋‹ต ํ—ค๋”๋ฅผ ์ œ๊ณตํ•œ๋‹ค. hsts์™€ csp ๊ฐ’์€ `Access-Control-Expose-Headers` ์‘๋‹ต ํ—ค๋”์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‘๋‹ต์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ—ค๋”๊ฐ€ ์žˆ๋‹ค๋ฉด

Content-Security-Policy: default-src 'self'
Strict-Transport-Security: max-age=31536000; includeSubdomains; preload
Access-Control-Expose-Headers: Content-Security-Policy

์ด ๊ฒฝ์šฐ hsts๋Š” null, csp๋Š” "default-src 'self'"๊ฐ€ ๋œ๋‹ค. ๋‘ ํ—ค๋” ๋ชจ๋‘ ์‘๋‹ต์— ํฌํ•จ๋˜์–ด ์žˆ์ง€๋งŒ, bar.invalid๊ฐ€ `Access-Control-Expose-Headers` ์‘๋‹ต ํ—ค๋”์— ์ด๋ฆ„์„ ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜์—ดํ•ด ๊ณต์œ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ฐ˜๋Œ€๋กœ, bar.invalid์ด credentials๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ์š”์ฒญ์— ๋Œ€ํ•ด ์‘๋‹ต ํ—ค๋” ์ „์ฒด๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, `Access-Control-Expose-Headers` ์‘๋‹ต ํ—ค๋” ๊ฐ’์œผ๋กœ `*`๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. credentials๊ฐ€ ํฌํ•จ๋œ ์š”์ฒญ์˜ ๊ฒฝ์šฐ์—๋Š” ํ—ค๋” ์ด๋ฆ„์„ ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜์—ดํ•ด์•ผ ํ•˜๋ฉฐ `*`๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

foo.invalid์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋‹ค์‹œ ๋Œ์•„์™€, ์ด๋ฒˆ์—๋Š” credentials๋ฅผ ํฌํ•จํ•ด bar.invalid์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ์ด ๊ฒฝ์šฐ CORS ํ”„๋กœํ† ์ฝœ์ด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํˆฌ๋ช…ํ•˜์ง€ ์•Š๋‹ค. credentials๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ช…์‹œ์ ์œผ๋กœ opt-in์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค:

fetch(url, { credentials:"include" }).then(success, failure)

์ด ๊ฒฝ์šฐ bar.invalid์˜ `Set-Cookie` ์‘๋‹ต ํ—ค๋”๋„ ์™„์ „ํžˆ ๋™์ž‘ํ•œ๋‹ค(๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฌด์‹œ๋จ).

์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ์š”์ฒญ์— ํ•„์š”ํ•œ credentials๋„ ๋ชจ๋‘ ํฌํ•จ์‹œํ‚จ๋‹ค. ๋˜ํ•œ ์‘๋‹ต์—๋Š” ๋” ์—„๊ฒฉํ•œ ์š”๊ตฌ์‚ฌํ•ญ์ด ์ ์šฉ๋œ๋‹ค. bar.invalid๋Š” ๋ฐ˜๋“œ์‹œ `https://foo.invalid` ๊ฐ’์„ ๊ฐ€์ง„ `Access-Control-Allow-Origin` ํ—ค๋”์™€, `Access-Control-Allow-Credentials` ํ—ค๋”๋„ ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค(`*`๋Š” credentials๊ฐ€ ์žˆ์„ ๋•Œ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Œ):

Access-Control-Allow-Origin: https://foo.invalid
Access-Control-Allow-Credentials: true

์‘๋‹ต์— ์ด ๋‘ ํ—ค๋”๊ฐ€ ํ•ด๋‹น ๊ฐ’์œผ๋กœ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด failure ์ฝœ๋ฐฑ์ด ํ˜ธ์ถœ๋œ๋‹ค. ๋‹จ, `Set-Cookie` ์‘๋‹ต ํ—ค๋”๋Š” ํ•ญ์ƒ ์ ์šฉ๋œ๋‹ค.

3.3.7. CORS ํ”„๋กœํ† ์ฝœ ์˜ˆ์™ธ

๋ช…์„ธ์— ๋”ฐ๋ผ CORS safelist์— ํฌํ•จ๋˜์ง€ ์•Š์€ `Content-Type` ํ—ค๋” ๊ฐ’์— ๋Œ€ํ•ด ์ œํ•œ์ ์ธ ์˜ˆ์™ธ๊ฐ€ ํ—ˆ์šฉ๋˜์–ด ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์˜ˆ์™ธ๋Š” ์›น ์ฝ˜ํ…์ธ ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์›น ์ฝ˜ํ…์ธ ๊ฐ€ ํ—ค๋”์™€ ๋ณธ๋ฌธ์„ ์ตœ์†Œํ•œ์œผ๋กœ๋งŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ์š”์ฒญ์— ํ•œํ•ด์„œ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์„œ๋ฒ„๋Š” ๊ต์ฐจ ์ถœ์ฒ˜ ์›น ์ฝ˜ํ…์ธ ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ safelist์— ์—†๋Š” `Content-Type` ํ—ค๋” ๊ฐ’์œผ๋กœ ์‚ฌ์ „ ์š”์ฒญ(preflight) ์—†์ด ์š”์ฒญ์„ ํŠธ๋ฆฌ๊ฑฐํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜ˆ์ƒํ•ด์•ผ ํ•œ๋‹ค:

๋ช…์„ธ์—์„œ๋Š” ์ƒˆ ์˜ˆ์™ธ ๋„์ž…์„ ํ”ผํ•ด์•ผ ํ•˜๋ฉฐ, ๋ฐ˜๋“œ์‹œ ์‹ ์ค‘ํžˆ ๋ณด์•ˆ ์˜ํ–ฅ์„ ๊ณ ๋ คํ•˜์—ฌ์•ผ ํ•œ๋‹ค. ์ƒˆ๋กœ์šด ์˜ˆ์™ธ๋Š” ์ด์Šˆ ๋“ฑ๋ก์„ ํ†ตํ•ด ์ œ์•ˆํ•  ์ˆ˜ ์žˆ๋‹ค.

3.4. `Content-Length` ํ—ค๋”

`Content-Length` ํ—ค๋”๋Š” ์ฃผ๋กœ HTTP์—์„œ ์ •์˜๋˜์–ด ์žˆ๋‹ค. HTTP์—์„œ ์ •์˜๋œ ์ฒ˜๋ฆฌ ๋ชจ๋ธ์ด ์›น ์ฝ˜ํ…์ธ ์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ ์ฒ˜๋ฆฌ ๋ชจ๋ธ์„ ์ •์˜ํ•œ๋‹ค. [HTTP]

๊ธธ์ด ์ถ”์ถœ(extract a length) ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ header list headers์—์„œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค:

  1. values๋ฅผ getting, decoding, and splitting `Content-Length` from headers์˜ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. values๊ฐ€ null์ด๋ฉด null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. candidateValue๋ฅผ null๋กœ ๋‘”๋‹ค.

  4. ๊ฐ values์˜ value์— ๋Œ€ํ•ด:

    1. candidateValue๊ฐ€ null์ด๋ฉด candidateValue์— value๋ฅผ ํ• ๋‹นํ•œ๋‹ค.

    2. ์•„๋‹ˆ๋ผ๋ฉด value๊ฐ€ candidateValue์™€ ๋‹ค๋ฅด๋ฉด failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  5. candidateValue๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด๊ฑฐ๋‚˜, code point ์ค‘ ASCII digit์ด ์•„๋‹Œ ๊ฒƒ์ด ์žˆ์œผ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  6. candidateValue๋ฅผ 10์ง„์ˆ˜ ์ˆซ์ž๋กœ ํ•ด์„ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

3.5. `Content-Type` ํ—ค๋”

`Content-Type` ํ—ค๋”๋Š” ์ฃผ๋กœ HTTP์—์„œ ์ •์˜๋˜์–ด ์žˆ๋‹ค. HTTP์—์„œ ์ •์˜๋œ ์ฒ˜๋ฆฌ ๋ชจ๋ธ์ด ์›น ์ฝ˜ํ…์ธ ์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ ์ฒ˜๋ฆฌ ๋ชจ๋ธ์„ ์ •์˜ํ•œ๋‹ค. [HTTP]

MIME ํƒ€์ž… ์ถ”์ถœ(extract a MIME type) ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ header list headers์—์„œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ๋ฐ˜ํ™˜ ๊ฐ’์€ failure ๋˜๋Š” MIME ํƒ€์ž…์ด๋‹ค.

  1. charset์„ null๋กœ ๋‘”๋‹ค.

  2. essence๋ฅผ null๋กœ ๋‘”๋‹ค.

  3. mimeType์„ null๋กœ ๋‘”๋‹ค.

  4. values๋ฅผ getting, decoding, and splitting `Content-Type` from headers์˜ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  5. values๊ฐ€ null์ด๋ฉด failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  6. ๊ฐ values์˜ value์— ๋Œ€ํ•ด:

    1. temporaryMimeType์„ MIME ํƒ€์ž… ํŒŒ์‹ฑ(parsing) value ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

    2. temporaryMimeType์ด failure์ด๊ฑฐ๋‚˜, ๊ทธ essence๊ฐ€ "*/*"๋ฉด continueํ•œ๋‹ค.

    3. mimeType์„ temporaryMimeType์œผ๋กœ ๋‘”๋‹ค.

    4. mimeType์˜ essence๊ฐ€ essence์™€ ๋‹ค๋ฅด๋ฉด:

      1. charset์„ null๋กœ ๋‘”๋‹ค.

      2. mimeType์˜ parameters["charset"]๊ฐ€ ์กด์žฌํ•˜๋ฉด charset์„ mimeType์˜ parameters["charset"] ๊ฐ’์œผ๋กœ ๋‘”๋‹ค.

      3. essence๋ฅผ mimeType์˜ essence๋กœ ๋‘”๋‹ค.

    5. ์•„๋‹ˆ๋ผ๋ฉด, mimeType์˜ parameters["charset"]๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ณ , charset์ด null์ด ์•„๋‹ˆ๋ฉด mimeType์˜ parameters["charset"]๋ฅผ charset์œผ๋กœ ๋‘”๋‹ค.

  7. mimeType์ด null์ด๋ฉด failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  8. mimeType์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

MIME ํƒ€์ž… ์ถ”์ถœ์ด failure๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜, MIME ํƒ€์ž…์˜ essence๊ฐ€ ํ•ด๋‹น ํฌ๋งท์— ๋Œ€ํ•ด ๋ถ€์ ์ ˆํ•  ๊ฒฝ์šฐ, ์ด๋Š” ์น˜๋ช…์  ์˜ค๋ฅ˜๋กœ ๊ฐ„์ฃผํ•œ๋‹ค. ๊ธฐ์กด ์›น ํ”Œ๋žซํผ ๊ธฐ๋Šฅ๋“ค์€ ํ•ญ์ƒ ์ด ํŒจํ„ด์„ ๋”ฐ๋ฅด์ง€ ์•Š์•„ ๋‹ค์ˆ˜์˜ ๋ณด์•ˆ ์ทจ์•ฝ์  ์›์ธ์ด ๋˜์–ด ์™”๋‹ค. ์ด์— ๋ฐ˜ํ•ด MIME ํƒ€์ž…์˜ parameters๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌด์‹œํ•ด๋„ ์•ˆ์ „ํ•˜๋‹ค.

MIME ํƒ€์ž… ์ถ”์ถœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹ค์ œ ๋™์ž‘ ์˜ˆ์‹œ:

ํ—ค๋”(๋„คํŠธ์›Œํฌ ์ƒ) ์ถœ๋ ฅ(์ง๋ ฌํ™”(serialized))
Content-Type: text/plain;charset=gbk, text/html
text/html
Content-Type: text/html;charset=gbk;a=b, text/html;x=y
text/html;x=y;charset=gbk
Content-Type: text/html;charset=gbk;a=b
Content-Type: text/html;x=y
Content-Type: text/html;charset=gbk
Content-Type: x/x
Content-Type: text/html;x=y
text/html;x=y
Content-Type: text/html
Content-Type: cannot-parse
text/html
Content-Type: text/html
Content-Type: */*
Content-Type: text/html
Content-Type:

๋ ˆ๊ฑฐ์‹œ ์ธ์ฝ”๋”ฉ ์ถ”์ถœ(legacy extract an encoding) ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ failure ๋˜๋Š” MIME ํƒ€์ž… mimeType๊ณผ encoding fallbackEncoding์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‹ค์Œ์„ ๋”ฐ๋ฅธ๋‹ค:

  1. mimeType์ด failure๋ฉด fallbackEncoding์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. mimeType["charset"]์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด fallbackEncoding์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. tentativeEncoding์„ get an encoding ์•Œ๊ณ ๋ฆฌ์ฆ˜์— mimeType["charset"]์„ ๋„˜๊ฒจ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  4. tentativeEncoding์ด failure๋ฉด fallbackEncoding์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  5. tentativeEncoding์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ mimeType์ด failure์ผ ์ˆ˜๋„ ์žˆ๊ฒŒ ํ•˜์—ฌ, MIME ํƒ€์ž… ์ถ”์ถœ๊ณผ ์‰ฝ๊ฒŒ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

๋ ˆ๊ฑฐ์‹œ๋กœ ๋ช…์‹œ๋œ ์ด์œ ๋Š” ํ˜„๋Œ€ ํฌ๋งท์€ ๋ฐ˜๋“œ์‹œ UTF-8๋งŒ ์จ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

3.6. `X-Content-Type-Options` ํ—ค๋”

`X-Content-Type-Options` ์‘๋‹ต ํ—ค๋”๋Š” ์š”์ฒญ์˜ ๋ชฉ์ ์ง€์— ๋Œ€ํ•ด ์‘๋‹ต์˜ `Content-Type` ํ—ค๋” ๊ฒ€์‚ฌ๋ฅผ ์š”๊ตฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ—ค๋” ๋ชฉ๋ก(header list) list์— ๋Œ€ํ•ด nosniff ํŒ์ •(determine nosniff)์„ ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‹คํ–‰ํ•œ๋‹ค:

  1. values๋ฅผ get, decode, split์„ list์—์„œ `X-Content-Type-Options` ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. values๊ฐ€ null์ด๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. values[0]์ด "nosniff"์™€ ASCII ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์—†์ด(ASCII case-insensitive) ์ผ์น˜ํ•˜๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  4. false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์›น ๊ฐœ๋ฐœ์ž์™€ ์ ํ•ฉ์„ฑ ๊ฒ€์‚ฌ๊ธฐ๋Š” `X-Content-Type-Options`์— ๋Œ€ํ•ด ์•„๋ž˜์˜ ๊ฐ’ ABNF๋ฅผ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค:

X-Content-Type-Options           = "nosniff" ; case-insensitive

3.6.1. nosniff๋กœ ์ธํ•ด response๊ฐ€ request์— ๋Œ€ํ•ด ์ฐจ๋‹จ๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€?

๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค:

  1. nosniff ํŒ์ •(determine nosniff)์„ response์˜ ํ—ค๋” ๋ชฉ๋ก์— ๋Œ€ํ•ด ํ˜ธ์ถœํ–ˆ์„ ๋•Œ false๋ผ๋ฉด allowed๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. mimeType์„ ํ—ค๋”์—์„œ MIME ํƒ€์ž… ์ถ”์ถœ(extract MIME type)์„ response์˜ ํ—ค๋” ๋ชฉ๋ก์— ๋Œ€ํ•ด ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  3. destination์„ request์˜ destination์œผ๋กœ ๋‘”๋‹ค.

  4. destination์ด script-like์ด๊ณ  mimeType์ด ์‹คํŒจ(failure)๊ฑฐ๋‚˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ MIME ํƒ€์ž…(JavaScript MIME type)์ด ์•„๋‹ˆ๋ฉด blocked๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  5. destination์ด "style"์ด๊ณ , mimeType์ด ์‹คํŒจ(failure)๊ฑฐ๋‚˜ ๊ทธ essence๊ฐ€ "text/css"๊ฐ€ ์•„๋‹ˆ๋ฉด blocked๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  6. allowed๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

request์˜ destination ์ค‘ script-like์ด๋‚˜ "style"๋งŒ์ด ๊ณ ๋ ค๋œ๋‹ค. ์ด๋Š” ์•…์šฉ ์‚ฌ๋ก€๊ฐ€ ์ด ๋‘˜์— ํ•ด๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋˜ํ•œ "image"์— ๋Œ€ํ•ด์„  ๋ฐฐํฌ๋œ ์ปจํ…ํŠธ์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š์•„ ์ œ์™ธ๋˜์—ˆ๋‹ค.

3.7. `Cross-Origin-Resource-Policy` ํ—ค๋”

The `Cross-Origin-Resource-Policy` ์‘๋‹ต ํ—ค๋”๋Š” ์š”์ฒญ์˜ ํ˜„์žฌ URL์˜ origin์„ ์š”์ฒญ์˜ origin๊ณผ ๋น„๊ตํ•˜์—ฌ ๊ฒ€์‚ฌํ•˜๋„๋ก ์š”๊ตฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ์š”์ฒญ์˜ mode๊ฐ€ "no-cors"์ผ ๋•Œ ์ ์šฉ๋œ๋‹ค.

๊ทธ ๊ฐ’์˜ ABNF:

Cross-Origin-Resource-Policy     = %s"same-origin" / %s"same-site" / %s"cross-origin" ; case-sensitive

origin origin, ํ™˜๊ฒฝ ์„ค์ • ๊ฐ์ฒด settingsObject, ๋ฌธ์ž์—ด destination, ์‘๋‹ต response, ๊ทธ๋ฆฌ๊ณ  ์„ ํƒ์  ๋ถˆ๋ฆฌ์–ธ forNavigation์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ์ •์ฑ… ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค:

  1. forNavigation์ด ์ฃผ์–ด์ง€์ง€ ์•Š์•˜๋‹ค๋ฉด false๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. embedderPolicy๋ฅผ settingsObject์˜ policy container์˜ embedder policy๋กœ ๋‘”๋‹ค.

  3. origin, "unsafe-none", response, ๊ทธ๋ฆฌ๊ณ  forNavigation์„ ์‚ฌ์šฉํ•œ ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ์ •์ฑ… ๋‚ด๋ถ€ ๊ฒ€์‚ฌ๊ฐ€ blocked๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด, blocked๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    ์ด ๋‹จ๊ณ„๋Š” ์•„๋ž˜์˜ Cross-Origin Embedder Policy์™€ ๊ด€๋ จ ์—†๋Š” ์œ„๋ฐ˜์„ ๋ณด๊ณ ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•˜๋‹ค.

  4. origin, embedderPolicy์˜ report-only value, response, ๊ทธ๋ฆฌ๊ณ  forNavigation์„ ์‚ฌ์šฉํ•œ ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ์ •์ฑ… ๋‚ด๋ถ€ ๊ฒ€์‚ฌ๊ฐ€ blocked๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด, response, settingsObject, destination, ๊ทธ๋ฆฌ๊ณ  true๋กœ ๊ต์ฐจ ์ถœ์ฒ˜ embedder policy CORP ์œ„๋ฐ˜ ๋ณด๊ณ ์„œ๋ฅผ ํ์— ๋„ฃ๋Š”๋‹ค.

  5. origin, embedderPolicy์˜ value, response, ๊ทธ๋ฆฌ๊ณ  forNavigation์„ ์‚ฌ์šฉํ•œ ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ์ •์ฑ… ๋‚ด๋ถ€ ๊ฒ€์‚ฌ๊ฐ€ allowed๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด, allowed๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  6. response, settingsObject, destination, ๊ทธ๋ฆฌ๊ณ  false๋กœ ๊ต์ฐจ ์ถœ์ฒ˜ embedder policy CORP ์œ„๋ฐ˜ ๋ณด๊ณ ์„œ๋ฅผ ํ์— ๋„ฃ๋Š”๋‹ค.

  7. blocked๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

HTML์˜ navigate ์•Œ๊ณ ๋ฆฌ์ฆ˜๋งŒ forNavigation์ด true๋กœ ์„ค์ •๋œ ์ƒํƒœ์—์„œ ์ด ๊ฒ€์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ด๋Š” ํ•ญ์ƒ ์ค‘์ฒฉ ๋‚ด๋น„๊ฒŒ์ด์…˜์„ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ, response๋Š” opaque ํ•„ํ„ฐ๋ง๋œ ์‘๋‹ต์˜ ๋‚ด๋ถ€ ์‘๋‹ต์ด๊ฑฐ๋‚˜, opaque ํ•„ํ„ฐ๋ง๋œ ์‘๋‹ต์˜ ๋‚ด๋ถ€ ์‘๋‹ต์ด ๋  ์‘๋‹ต์ด๋‹ค. [HTML]

origin origin, embedder policy value embedderPolicyValue, ์‘๋‹ต response, ๊ทธ๋ฆฌ๊ณ  ๋ถˆ๋ฆฌ์–ธ forNavigation์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค ์ •์ฑ… ๋‚ด๋ถ€ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค:

  1. forNavigation์ด true์ด๊ณ  embedderPolicyValue๊ฐ€ "unsafe-none"์ด๋ฉด, allowed๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. policy๋ฅผ response์˜ ํ—ค๋” ๋ชฉ๋ก์—์„œ `Cross-Origin-Resource-Policy`๋ฅผ ๊ฐ€์ ธ์˜จ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

    ์ด๋Š” `Cross-Origin-Resource-Policy: same-site, same-origin`์ด ์•„๋ž˜์—์„œ ๊ฒฐ๊ตญ allowed๊ฐ€ ๋œ๋‹ค๋Š” ๋œป์ด๋‹ค. ์ด๋Š” embedderPolicyValue๊ฐ€ "unsafe-none"์ธ ํ•œ, ์–ด๋–ค ๊ฒƒ๊ณผ๋„ ์ผ์น˜ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋‘ ๊ฐœ ์ด์ƒ์˜ `Cross-Origin-Resource-Policy` ํ—ค๋”๋„ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ๊ฐ€์ง„๋‹ค.

  3. policy๊ฐ€ `same-origin`, `same-site`, `cross-origin` ์ค‘ ์–ด๋А ๊ฒƒ๋„ ์•„๋‹ˆ๋ฉด, policy๋ฅผ null๋กœ ์„ค์ •ํ•œ๋‹ค.

  4. policy๊ฐ€ null์ด๋ฉด, embedderPolicyValue์— ๋Œ€ํ•ด switchํ•œ๋‹ค:

    "unsafe-none"

    ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

    "credentialless"

    ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ฐธ์ด๋ฉด policy๋ฅผ `same-origin`์œผ๋กœ ์„ค์ •ํ•œ๋‹ค:

    "require-corp"

    policy๋ฅผ `same-origin`์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  5. policy์— ๋Œ€ํ•ด switchํ•œ๋‹ค:

    null
    `cross-origin`

    allowed๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    `same-origin`

    origin์ด response์˜ URL์˜ origin๊ณผ same origin์ด๋ฉด, allowed๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, blocked๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    `same-site`

    ๋‹ค์Œ์ด ๋ชจ๋‘ ์ฐธ์ด๋ฉด

    • origin์ด response์˜ URL์˜ origin๊ณผ schemelessly same site์ด๋‹ค

    • origin์˜ scheme์ด "https"์ด๊ฑฐ๋‚˜ response์˜ URL์˜ scheme์ด "https"๊ฐ€ ์•„๋‹ˆ๋‹ค

    ๊ทธ๋Ÿฌ๋ฉด allowed๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, blocked๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    `Cross-Origin-Resource-Policy: same-site`๋Š” ๋ณด์•ˆ ์ „์†ก์„ ํ†ตํ•ด ์ „๋‹ฌ๋œ ์‘๋‹ต์ด ๋น„๋ณด์•ˆ ์š”์ฒญ origin๊ณผ ์ผ์น˜ํ•œ๋‹ค๊ณ  ๋ณด์ง€ ์•Š๋Š”๋‹ค. ๊ทธ ํ˜ธ์ŠคํŠธ๋“ค์ด ๋‹ค๋ฅธ ๋ฉด์—์„œ๋Š” same site๋ผ ํ•˜๋”๋ผ๋„ ๊ทธ๋ ‡๋‹ค. ๋ณด์•ˆ ์ „์†ก๋œ ์‘๋‹ต์€ ๋ณด์•ˆ ์ „์†ก๋œ initiator์™€๋งŒ ์ผ์น˜ํ•œ๋‹ค.

์‘๋‹ต response, ํ™˜๊ฒฝ ์„ค์ • ๊ฐ์ฒด settingsObject, ๋ฌธ์ž์—ด destination, ๊ทธ๋ฆฌ๊ณ  ๋ถˆ๋ฆฌ์–ธ reportOnly๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ต์ฐจ ์ถœ์ฒ˜ embedder policy CORP ์œ„๋ฐ˜ ๋ณด๊ณ ์„œ๋ฅผ ํ์— ๋„ฃ๊ธฐ๋Š” ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค:

  1. endpoint๋ฅผ reportOnly๊ฐ€ true์ด๋ฉด settingsObject์˜ policy container์˜ embedder policy์˜ report-only reporting endpoint๋กœ ๋‘๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด settingsObject์˜ policy container์˜ embedder policy์˜ reporting endpoint๋กœ ๋‘”๋‹ค.

  2. serializedURL์„ response๋กœ ๋ณด๊ณ ์šฉ ์‘๋‹ต URL ์ง๋ ฌํ™”ํ•˜๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  3. disposition์„ reportOnly๊ฐ€ true์ด๋ฉด "reporting"์œผ๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด "enforce"๋กœ ๋‘”๋‹ค.

  4. body๋ฅผ ๋‹ค์Œ ์†์„ฑ์„ ํฌํ•จํ•˜๋Š” ์ƒˆ ๊ฐ์ฒด๋กœ ๋‘”๋‹ค:

    ํ‚ค ๊ฐ’
    "type" "corp"
    "blockedURL" serializedURL
    "destination" destination
    "disposition" disposition
  5. settingsObject์˜ ์ „์—ญ ๊ฐ์ฒด์— ๋Œ€ํ•ด "coep" report type, endpoint, ๊ทธ๋ฆฌ๊ณ  body๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ์— ๋„ฃ๋Š”๋‹ค. [REPORTING]

3.8. `Sec-Purpose` ํ—ค๋”

`Sec-Purpose` HTTP ์š”์ฒญ ํ—ค๋”๋Š” ์š”์ฒญ์ด ์‚ฌ์šฉ์ž๊ฐ€ ์ฆ‰์‹œ ์‚ฌ์šฉํ•  ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒƒ ์™ธ์— ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ชฉ์ ์„ ๊ฐ€์ง์„ ๋ช…์‹œํ•œ๋‹ค.

`Sec-Purpose` ํ—ค๋” ํ•„๋“œ๋Š” ๊ตฌ์กฐํ™” ํ—ค๋”์ด๋ฉฐ, ๊ทธ ๊ฐ’์€ ํ† ํฐ(token)์ด์–ด์•ผ ํ•œ๋‹ค.

์ •์˜๋œ ์œ ์ผํ•œ ํ† ํฐ(token)์€ prefetch์ด๋‹ค. ์ด๋Š” ์š”์ฒญ์˜ ๋ชฉ์ ์ด ๊ณง ํ•„์š”ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•จ์ž„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์„œ๋ฒ„๋Š” ์ด๋ฅผ ์ด์šฉํ•ด prefetch์— ๋Œ€ํ•œ ์บ์‹ฑ ๋งŒ๋ฃŒ๋ฅผ ์กฐ์ •ํ•˜๊ฑฐ๋‚˜, prefetch๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ฑฐ๋‚˜, ํŽ˜์ด์ง€ ๋ฐฉ๋ฌธ ์ˆ˜ ์ง‘๊ณ„ ์‹œ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

4. ๊ฐ€์ ธ์˜ค๊ธฐ

์•„๋ž˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ fetching์„ ์ •์˜ํ•œ๋‹ค. ๋Œ€๋žต์ ์œผ๋กœ ๋งํ•˜๋ฉด, ์ด๋Š” ์š”์ฒญ ํ•˜๋‚˜์™€ ์ž‘์—… ์ค‘ ์—ฌ๋Ÿฌ ์ง€์ ์—์„œ ์‹คํ–‰ํ•  ํ•˜๋‚˜ ์ด์ƒ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฐ›๋Š”๋‹ค. ์•„๋ž˜์— ๋‚˜์—ด๋œ ๋งˆ์ง€๋ง‰ ๋‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋Š” ์‘๋‹ต์ด ์ „๋‹ฌ๋œ๋‹ค. ์ฒ˜์Œ ๋‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์—…๋กœ๋“œ๋ฅผ ํฌ์ฐฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์š”์ฒญ request, ์„ ํƒ์  ์•Œ๊ณ ๋ฆฌ์ฆ˜ processRequestBodyChunkLength, ์„ ํƒ์  ์•Œ๊ณ ๋ฆฌ์ฆ˜ processRequestEndOfBody, ์„ ํƒ์  ์•Œ๊ณ ๋ฆฌ์ฆ˜ processEarlyHintsResponse, ์„ ํƒ์  ์•Œ๊ณ ๋ฆฌ์ฆ˜ processResponse, ์„ ํƒ์  ์•Œ๊ณ ๋ฆฌ์ฆ˜ processResponseEndOfBody, ์„ ํƒ์  ์•Œ๊ณ ๋ฆฌ์ฆ˜ processResponseConsumeBody, ๊ทธ๋ฆฌ๊ณ  ์„ ํƒ์  ๋ถˆ๋ฆฌ์–ธ useParallelQueue (๊ธฐ๋ณธ๊ฐ’ false)๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ fetchํ•˜๋ ค๋ฉด, ์•„๋ž˜ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ, processRequestBodyChunkLength๋Š” ์ „์†ก๋œ ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜๋ฅผ ๋ฐ›๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์–ด์•ผ ํ•œ๋‹ค. ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ, processRequestEndOfBody๋Š” ์ธ์ˆ˜๋ฅผ ๋ฐ›์ง€ ์•Š๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์–ด์•ผ ํ•œ๋‹ค. ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ, processEarlyHintsResponse๋Š” ์‘๋‹ต์„ ๋ฐ›๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์–ด์•ผ ํ•œ๋‹ค. ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ, processResponse๋Š” ์‘๋‹ต์„ ๋ฐ›๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์–ด์•ผ ํ•œ๋‹ค. ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ, processResponseEndOfBody๋Š” ์‘๋‹ต์„ ๋ฐ›๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์–ด์•ผ ํ•œ๋‹ค. ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ, processResponseConsumeBody๋Š” ์‘๋‹ต ๋ฐ null, failure, ๋˜๋Š” ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๋ฅผ ๋ฐ›๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์–ด์•ผ ํ•œ๋‹ค.

์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ์ง„ํ–‰ ์ค‘์ธ fetch๋ฅผ ์ผ์‹œ ์ค‘๋‹จํ•˜๋„๋ก ์š”์ฒญ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ์ด ์ผ์‹œ ์ค‘๋‹จ ์š”์ฒญ์„ ์ˆ˜๋ฝํ•˜๊ฑฐ๋‚˜ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. ์ผ์‹œ ์ค‘๋‹จ๋œ fetch๋Š” ์žฌ๊ฐœ๋  ์ˆ˜ ์žˆ๋‹ค. ์ง„ํ–‰ ์ค‘์ธ fetch๊ฐ€ ํ•ด๋‹น ์š”์ฒญ์— ๋Œ€ํ•œ HTTP ์บ์‹œ์˜ ์‘๋‹ต์„ ๊ฐฑ์‹ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ, ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ์ผ์‹œ ์ค‘๋‹จ ์š”์ฒญ์„ ๋ฌด์‹œํ•ด์•ผ ํ•œ๋‹ค.

์š”์ฒญ์˜ cache mode๊ฐ€ "no-store"์ด๊ฑฐ๋‚˜ ์‘๋‹ต์— `Cache-Control: no-store` ํ—ค๋”๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒฝ์šฐ, ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ์š”์ฒญ์— ๋Œ€ํ•œ HTTP ์บ์‹œ์˜ ํ•ญ๋ชฉ์„ ๊ฐฑ์‹ ํ•˜์ง€ ์•Š๋Š”๋‹ค. [HTTP-CACHING]

  1. Assert: request์˜ mode๋Š” "navigate"์ด๊ฑฐ๋‚˜ processEarlyHintsResponse๊ฐ€ null์ด๋‹ค.

    early hints(์‘๋‹ต ์ค‘ status๊ฐ€ 103์ธ ๊ฒƒ)์˜ ์ฒ˜๋ฆฌ๋Š” ๋‚ด๋น„๊ฒŒ์ด์…˜์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฒ€ํ† ๋˜์—ˆ๋‹ค.

  2. taskDestination์„ null๋กœ ๋‘”๋‹ค.

  3. crossOriginIsolatedCapability๋ฅผ false๋กœ ๋‘”๋‹ค.

  4. request๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ํด๋ผ์ด์–ธํŠธ์—์„œ ์š”์ฒญ์„ ์ฑ„์šด๋‹ค.

  5. request์˜ client๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด:

    1. taskDestination์„ request์˜ client์˜ ์ „์—ญ ๊ฐ์ฒด๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. crossOriginIsolatedCapability๋ฅผ request์˜ client์˜ cross-origin isolated capability๋กœ ์„ค์ •ํ•œ๋‹ค.

  6. useParallelQueue๊ฐ€ true์ด๋ฉด, taskDestination์„ ์ƒˆ ๋ณ‘๋ ฌ ํ๋ฅผ ์‹œ์ž‘ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  7. timingInfo๋ฅผ ์ƒˆ fetch timing info๋กœ ๋‘๋ฉฐ, ๊ทธ start time ๋ฐ post-redirect start time์€ crossOriginIsolatedCapability๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ์˜ coarsened shared current time์ด๊ณ , render-blocking์€ request์˜ render-blocking์œผ๋กœ ์„ค์ •๋œ๋‹ค.

  8. fetchParams๋ฅผ ์ƒˆ fetch params๋กœ ๋‘๋ฉฐ, ๊ทธ request๋Š” request, timing info๋Š” timingInfo, process request body chunk length๋Š” processRequestBodyChunkLength, process request end-of-body๋Š” processRequestEndOfBody, process early hints response๋Š” processEarlyHintsResponse, process response๋Š” processResponse, process response consume body๋Š” processResponseConsumeBody, process response end-of-body๋Š” processResponseEndOfBody, task destination์€ taskDestination, ๊ทธ๋ฆฌ๊ณ  cross-origin isolated capability์€ crossOriginIsolatedCapability์ด๋‹ค.

  9. request์˜ body๊ฐ€ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค์ด๋ฉด, request์˜ body๋ฅผ request์˜ body๋ฅผ body๋กœ ์ทจ๊ธ‰ํ•œ ๊ฒƒ์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  10. request๋กœ WebDriver BiDi clone network request body ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

  11. ๋‹ค์Œ ์กฐ๊ฑด์ด ๋ชจ๋‘ true์ด๋ฉด:

    ๊ทธ๋Ÿฌ๋ฉด:

    1. Assert: request์˜ origin์€ request์˜ client์˜ origin๊ณผ same origin์ด๋‹ค.

    2. onPreloadedResponseAvailable์„, ์‘๋‹ต response๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋‘”๋‹ค: fetchParams์˜ preloaded response candidate๋ฅผ response๋กœ ์„ค์ •ํ•œ๋‹ค.

    3. foundPreloadedResource๋ฅผ, request์˜ client์— ๋Œ€ํ•ด, request์˜ URL, request์˜ destination, request์˜ mode, request์˜ credentials mode, request์˜ integrity metadata, ๊ทธ๋ฆฌ๊ณ  onPreloadedResponseAvailable๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ preloaded resource๋ฅผ ์†Œ๋น„ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

    4. foundPreloadedResource๊ฐ€ true์ด๊ณ  fetchParams์˜ preloaded response candidate๊ฐ€ null์ด๋ฉด, fetchParams์˜ preloaded response candidate๋ฅผ "pending"์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  12. request์˜ header list๊ฐ€ `Accept`๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฉด:

    1. value๋ฅผ `*/*`๋กœ ๋‘”๋‹ค.

    2. request์˜ initiator๊ฐ€ "prefetch"์ด๋ฉด, value๋ฅผ document `Accept` header value๋กœ ์„ค์ •ํ•œ๋‹ค.

    3. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” request์˜ destination์— ๋Œ€ํ•ด switchํ•˜์—ฌ, ์ผ์น˜ํ•˜๋Š” ์ฒซ ๋ฌธ์žฅ์ด ์žˆ๋‹ค๋ฉด value๋ฅผ ๊ทธ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค:

      "document"
      "frame"
      "iframe"
      document `Accept` header value
      "image"
      `image/png,image/svg+xml,image/*;q=0.8,*/*;q=0.5`
      "json"
      `application/json,*/*;q=0.5`
      "style"
      `text/css,*/*;q=0.1`
      "text"
      `text/plain,*/*;q=0.5`
    4. (`Accept`, value)๋ฅผ request์˜ header list์— ๋ง๋ถ™์ธ๋‹ค.

  13. request์˜ header list๊ฐ€ `Accept-Language`๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๊ณ  request์˜ client๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด:

    1. emulatedLanguage๋ฅผ request์˜ client์— ๋Œ€ํ•œ WebDriver BiDi emulated language๋กœ ๋‘”๋‹ค.

    2. emulatedLanguage๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด:

      1. encodedEmulatedLanguage๋ฅผ emulatedLanguage๋ฅผ ๋™ํ˜• ์ธ์ฝ”๋”ฉํ•œ ๊ฒƒ์œผ๋กœ ๋‘”๋‹ค.

      2. (`Accept-Language`, encodedEmulatedLanguage)๋ฅผ request์˜ header list์— ๋ง๋ถ™์ธ๋‹ค.

  14. request์˜ header list๊ฐ€ `Accept-Language`๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฉด, ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” (`Accept-Language`, ์ ์ ˆํ•œ header value)๋ฅผ request์˜ header list์— ๋ง๋ถ™์—ฌ์•ผ ํ•œ๋‹ค.

  15. request์˜ internal priority๊ฐ€ null์ด๋ฉด, request์˜ priority, initiator, destination, ๊ทธ๋ฆฌ๊ณ  render-blocking์„ implementation-defined ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ request์˜ internal priority๋ฅผ implementation-defined ๊ฐ์ฒด๋กœ ์„ค์ •ํ•œ๋‹ค.

    implementation-defined ๊ฐ์ฒด๋Š” HTTP/2์˜ ์ŠคํŠธ๋ฆผ ๊ฐ€์ค‘์น˜ ๋ฐ ์ข…์†์„ฑ, ์ ์šฉ๋˜๋Š” ์ „์†ก(HTTP/3 ํฌํ•จ)์—์„œ Extensible Prioritization Scheme for HTTP์— ์‚ฌ์šฉ๋˜๋Š” ์šฐ์„ ์ˆœ์œ„, ๊ทธ๋ฆฌ๊ณ  HTTP/1 fetch์˜ ์ „๋‹ฌ ๋ฐ ์ฒ˜๋ฆฌ๋ฅผ ์šฐ์„ ์ˆœ์œ„ํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋™๋“ฑํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค. [RFC9218]

  16. request๊ฐ€ ํ•˜์œ„ ๋ฆฌ์†Œ์Šค ์š”์ฒญ์ด๋ฉด:

    1. record๋ฅผ ์ƒˆ fetch record๋กœ ๋‘๋ฉฐ, ๊ทธ request๋Š” request์ด๊ณ  controller๋Š” fetchParams์˜ controller์ด๋‹ค.

    2. record๋ฅผ request์˜ client์˜ fetch group์˜ fetch records์— ๋ง๋ถ™์ธ๋‹ค.

  17. fetchParams๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ main fetch๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

  18. fetchParams์˜ controller๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์š”์ฒญ request๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ํด๋ผ์ด์–ธํŠธ์—์„œ ์š”์ฒญ์„ ์ฑ„์šฐ๊ธฐ๋Š”:

  1. request์˜ traversable for user prompts๊ฐ€ "client"์ด๋ฉด:

    1. request์˜ traversable for user prompts๋ฅผ "no-traversable"๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. request์˜ client๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด:

      1. global์„ request์˜ client์˜ ์ „์—ญ ๊ฐ์ฒด๋กœ ๋‘”๋‹ค.

      2. global์ด Window ๊ฐ์ฒด์ด๊ณ  global์˜ navigable์ด null์ด ์•„๋‹ˆ๋ฉด, request์˜ traversable for user prompts๋ฅผ global์˜ navigable์˜ traversable navigable๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. request์˜ origin์ด "client"์ด๋ฉด:

    1. Assert: request์˜ client๋Š” null์ด ์•„๋‹ˆ๋‹ค.

    2. request์˜ origin์„ request์˜ client์˜ origin์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  3. request์˜ policy container๊ฐ€ "client"์ด๋ฉด:

    1. request์˜ client๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, request์˜ policy container๋ฅผ request์˜ client์˜ policy container์˜ clone์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. [HTML]

    2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, request์˜ policy container๋ฅผ ์ƒˆ policy container๋กœ ์„ค์ •ํ•œ๋‹ค.

4.1. ๋ฉ”์ธ fetch

main fetch๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด, fetch params fetchParams์™€ ์„ ํƒ์  ๋ถˆ๋ฆฌ์–ธ recursive (๊ธฐ๋ณธ๊ฐ’ false)๋ฅผ ๋ฐ›์•„ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค:

  1. request๋ฅผ fetchParams์˜ request๋กœ ๋‘”๋‹ค.

  2. response๋ฅผ null๋กœ ๋‘”๋‹ค.

  3. request์˜ local-URLs-only flag๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๊ณ , request์˜ current URL์ด local์ด ์•„๋‹ˆ๋ฉด, response๋ฅผ ๋„คํŠธ์›Œํฌ ์—๋Ÿฌ๋กœ ์„ค์ •ํ•œ๋‹ค.

  4. Content Security Policy ์œ„๋ฐ˜ ์‚ฌํ•ญ์„ request์— ๋Œ€ํ•ด ๋ณด๊ณ ํ•œ๋‹ค.

  5. request๋ฅผ ํ•„์š”ํ•˜๋‹ค๋ฉด ์ž ์žฌ์ ์œผ๋กœ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” URL๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•œ๋‹ค.

  6. ํ˜ผํ•ฉ ์ฝ˜ํ…์ธ  request๋ฅผ ํ•„์š”ํ•˜๋‹ค๋ฉด ์ž ์žฌ์ ์œผ๋กœ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” URL๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•œ๋‹ค.

  7. request๊ฐ€ ์ž˜๋ชป๋œ ํฌํŠธ๋กœ ์ธํ•ด ์ฐจ๋‹จ๋˜์–ด์•ผ ํ•˜๋Š”์ง€, request fetch๊ฐ€ ํ˜ผํ•ฉ ์ฝ˜ํ…์ธ ๋กœ ์ธํ•ด ์ฐจ๋‹จ๋˜์–ด์•ผ ํ•˜๋Š”์ง€, Content Security Policy์— ์˜ํ•ด request๊ฐ€ ์ฐจ๋‹จ๋˜์–ด์•ผ ํ•˜๋Š”์ง€, ๋ฌด๊ฒฐ์„ฑ ์ •์ฑ…์— ์˜ํ•ด request๊ฐ€ ์ฐจ๋‹จ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ์ค‘ ํ•˜๋‚˜๋ผ๋„ blocked๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด, response๋ฅผ ๋„คํŠธ์›Œํฌ ์—๋Ÿฌ๋กœ ์„ค์ •ํ•œ๋‹ค.

  8. request์˜ referrer policy๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด, request์˜ referrer policy๋ฅผ request์˜ policy container์˜ referrer policy๋กœ ์„ค์ •ํ•œ๋‹ค.

  9. request์˜ referrer๊ฐ€ "no-referrer"๊ฐ€ ์•„๋‹ˆ๋ฉด, request์˜ referrer๋ฅผ request์˜ referrer ๊ฒฐ์ •์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค. [REFERRER]

    Referrer Policy์—์„œ ๋ช…์‹œํ•œ ๋Œ€๋กœ, ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ request์˜ referrer๋ฅผ "no-referrer"๋กœ ์˜ค๋ฒ„๋ผ์ด๋“œํ•˜๊ฑฐ๋‚˜ ๋œ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋งŒ ๋…ธ์ถœํ•˜๋„๋ก ์„ ํƒ๊ถŒ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  10. request์˜ current URL์˜ scheme์„ ์•„๋ž˜ ์กฐ๊ฑด์ด ๋ชจ๋‘ true์ด๋ฉด "https"๋กœ ์„ค์ •ํ•œ๋‹ค:

    • request์˜ current URL์˜ scheme์ด "http"์ž„
    • request์˜ current URL์˜ host๊ฐ€ ๋„๋ฉ”์ธ์ž„
    • request์˜ current URL์˜ host์˜ public suffix๊ฐ€ "localhost" ๋˜๋Š” "localhost."๊ฐ€ ์•„๋‹˜
    • request์˜ current URL์˜ host๋ฅผ Known HSTS Host Domain Name Matching์œผ๋กœ ๋งค์นญํ•œ ๊ฒฐ๊ณผ, includeSubDomains ์ง€์‹œ๊ฐ€ ์žˆ๋Š” ์Šˆํผ๋„๋ฉ”์ธ ๋งค์นญ ๋˜๋Š” congruent ๋งค์นญ(์ง€์‹œ ์œ ๋ฌด ์ƒ๊ด€์—†์ด)์ž„ [HSTS] ๋˜๋Š” ์š”์ฒญ์˜ DNS ์กฐํšŒ๋กœ section 9.5์—์„œ ๋ช…์‹œํ•œ HTTPS RR์ด ๋งค์นญ๋จ [HSTS] [SVCB]

    ๋ชจ๋“  DNS ๋™์ž‘์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ตฌํ˜„ ์ •์˜์ด๋ฏ€๋กœ, DNS ์กฐํšŒ์— HTTPS RR์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํŒ๋‹จํ•˜๋Š” ๋ฐฉ๋ฒ• ์—ญ์‹œ ๊ตฌํ˜„ ์ •์˜์ž…๋‹ˆ๋‹ค. DNS ๋™์ž‘์€ ์ „ํ†ต์ ์œผ๋กœ ์—ฐ๊ฒฐ ์–ป๊ธฐ ์‹œ์ ๊นŒ์ง€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ๋” ์ผ์ฐ DNS ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜, ๋กœ์ปฌ DNS ์บ์‹œ๋ฅผ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜, fetch ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋‚ด์—์„œ ๋” ๋Šฆ๊ฒŒ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ request์˜ ํ˜„์žฌ URL ์˜scheme ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•จ์„ ๋ฐœ๊ฒฌํ•ด์„œ ๋กœ์ง์„ ๋˜๋Œ๋ฆด ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  11. recursive๊ฐ€ false์ด๋ฉด, ๋‚จ์€ ๋‹จ๊ณ„๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•œ๋‹ค.

  12. response๊ฐ€ null์ด๋ฉด, ๋‹ค์Œ์—์„œ ์ฒ˜์Œ์œผ๋กœ ์ผ์น˜ํ•˜๋Š” ๊ตฌ๋ฌธ์— ํ•ด๋‹นํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ response๋กœ ์„ค์ •ํ•œ๋‹ค:

    fetchParams์˜ preloaded response candidate๊ฐ€ null์ด ์•„๋‹˜
    1. fetchParams์˜ preloaded response candidate๊ฐ€ "pending"์ด ์•„๋‹ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•œ๋‹ค.

    2. Assert: fetchParams์˜ preloaded response candidate๊ฐ€ response์ž„

    3. fetchParams์˜ preloaded response candidate๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    request์˜ current URL์˜ origin์ด request์˜ origin๊ณผ same origin์ด๊ณ , request์˜ response tainting์ด "basic"์ž„
    request์˜ current URL์˜ scheme์ด "data"์ž„
    request์˜ mode๊ฐ€ "navigate", "websocket", ๋˜๋Š” "webtransport"์ธ ๊ฒฝ์šฐ
    1. request์˜ response tainting์„ "basic"์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. "scheme-fetch"์™€ fetchParams๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ override fetch๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    HTML์€ URL์˜ ์Šคํ‚ด์ด "data"์ธ ๊ฒฝ์šฐ, ํ•ด๋‹น ๋ฌธ์„œ์™€ ์›Œ์ปค์— ๊ณ ์œ ํ•œ ๋ถˆํˆฌ๋ช… ์ถœ์ฒ˜(opaque origin)๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šค ์›Œ์ปค๋Š” URL์˜ ์Šคํ‚ด์ด HTTP(S) ์Šคํ‚ด์ธ ๊ฒฝ์šฐ์—๋งŒ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [HTML] [SW]

    request์˜ mode๊ฐ€ "same-origin"์ž„

    ๋„คํŠธ์›Œํฌ ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    request์˜ mode๊ฐ€ "no-cors"์ž„
    1. request์˜ redirect mode๊ฐ€ "follow"๊ฐ€ ์•„๋‹ˆ๋ฉด, ๋„คํŠธ์›Œํฌ ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    2. request์˜ response tainting์„ "opaque"๋กœ ์„ค์ •ํ•œ๋‹ค.

    3. "scheme-fetch"์™€ fetchParams๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ override fetch๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    request์˜ current URL์˜ scheme์ด HTTP(S) scheme์ด ์•„๋‹ˆ๋ฉด

    ๋„คํŠธ์›Œํฌ ์—๋Ÿฌ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    request์˜ use-CORS-preflight flag๊ฐ€ ์„ค์ •๋จ
    request์˜ unsafe-request flag๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๊ณ , request์˜ method๊ฐ€ CORS-safelisted method๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜, CORS-unsafe request-header names๊ฐ€ request์˜ header list์— ๋น„์–ด์žˆ์ง€ ์•Š์Œ
    1. request์˜ response tainting์„ "cors"๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. corsWithPreflightResponse๋ฅผ "http-fetch", fetchParams, ๊ทธ๋ฆฌ๊ณ  true๋ฅผ ์ฃผ์–ด override fetch๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    3. corsWithPreflightResponse๊ฐ€ ๋„คํŠธ์›Œํฌ ์—๋Ÿฌ๋ฉด, ์บ์‹œ ์—”ํŠธ๋ฆฌ ์‚ญ์ œ๋ฅผ request๋กœ ์‹คํ–‰ํ•œ๋‹ค.

    4. corsWithPreflightResponse๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ
    1. request์˜ response tainting์„ "cors"๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. "http-fetch"์™€ fetchParams๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ override fetch๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  13. recursive๊ฐ€ true๋ฉด response๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  14. response๊ฐ€ ๋„คํŠธ์›Œํฌ ์—๋Ÿฌ๊ฐ€ ์•„๋‹ˆ๊ณ  response๊ฐ€ filtered response๊ฐ€ ์•„๋‹ˆ๋ฉด:

    1. request์˜ response tainting์ด "cors"์ด๋ฉด:

      1. headerNames๋ฅผ extracting header list values๋ฅผ `Access-Control-Expose-Headers`์™€ response์˜ header list๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

      2. request์˜ credentials mode๊ฐ€ "include"๊ฐ€ ์•„๋‹ˆ๊ณ , headerNames๊ฐ€ `*`๋ฅผ ํฌํ•จํ•˜๋ฉด, response์˜ CORS-exposed header-name list๋ฅผ response์˜ header list ๋‚ด์˜ ๋ชจ๋“  ๊ณ ์œ  header name๋กœ ์„ค์ •ํ•œ๋‹ค.

      3. ๊ทธ ์™ธ์— headerNames๊ฐ€ null ๋˜๋Š” ์‹คํŒจ๊ฐ€ ์•„๋‹ˆ๋ฉด, response์˜ CORS-exposed header-name list๋ฅผ headerNames๋กœ ์„ค์ •ํ•œ๋‹ค.

        headerNames ์ค‘ ํ•˜๋‚˜๊ฐ€ ์—ฌ์ „ํžˆ `*`์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋Š” header์˜ name์ด `*`์ธ ๊ฒฝ์šฐ์—๋งŒ ์ผ์น˜ํ•œ๋‹ค.

    2. response๋ฅผ filtered response๋กœ ์„ค์ •ํ•œ๋‹ค. response๋ฅผ ๋‚ด๋ถ€ ์‘๋‹ต์œผ๋กœ ๋‘๊ณ , request์˜ response tainting์— ๋”ฐ๋ผ ์•„๋ž˜์™€ ๊ฐ™์ด ํ•œ๋‹ค:

      "basic"
      basic filtered response
      "cors"
      CORS filtered response
      "opaque"
      opaque filtered response
  15. internalResponse๋ฅผ response๊ฐ€ ๋„คํŠธ์›Œํฌ ์—๋Ÿฌ์ผ ๊ฒฝ์šฐ response๋กœ, ์•„๋‹ˆ๋ฉด response์˜ internal response๋กœ ๋‘”๋‹ค.

  16. internalResponse์˜ URL ๋ชฉ๋ก์ด ๋น„์–ด ์žˆ์œผ๋ฉด, ์ด๋ฅผ request์˜ URL ๋ชฉ๋ก์˜ clone์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    ์‘๋‹ต์˜ URL ๋ชฉ๋ก์€ ๋น„์–ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด about: URL์„ fetchํ•  ๋•Œ ๊ทธ๋ ‡๋‹ค.

  17. internalResponse์˜ redirect taint๋ฅผ request์˜ redirect-taint๋กœ ์„ค์ •ํ•œ๋‹ค.

  18. request๊ฐ€ ๋‚ด๋น„๊ฒŒ์ด์…˜ ์š”์ฒญ์ด๋ฉด, internalResponse์˜ ๋‚ด๋น„๊ฒŒ์ด์…˜ ํƒ€์ด๋ฐ ํ—ˆ์šฉ ๊ฐ’ ๋ชฉ๋ก์„ request์˜ ๋‚ด๋น„๊ฒŒ์ด์…˜ ํƒ€์ด๋ฐ ํ—ˆ์šฉ ๊ฐ’ ๋ชฉ๋ก์˜ clone์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  19. request์˜ timing allow failed flag๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด, internalResponse์˜ timing allow passed flag๋ฅผ ์„ค์ •ํ•œ๋‹ค.

  20. response๊ฐ€ network error๊ฐ€ ์•„๋‹ˆ๊ณ  ๋‹ค์Œ ์ค‘ ์–ด๋А ํ•˜๋‚˜๊ฐ€ blocked๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด

    ๊ทธ๋Ÿฌ๋ฉด response์™€ internalResponse๋ฅผ network error๋กœ ์„ค์ •ํ•œ๋‹ค.

  21. response์˜ type์ด "opaque"์ด๊ณ , internalResponse์˜ status๊ฐ€ range status์ด๋ฉฐ, internalResponse์˜ range-requested flag๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๊ณ , request์˜ header list๊ฐ€ `Range`๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฉด, response์™€ internalResponse๋ฅผ network error๋กœ ์„ค์ •ํ•œ๋‹ค.

    ์ „ํ†ต์ ์œผ๋กœ API๋Š” ๋ฒ”์œ„๊ฐ€ ์š”์ฒญ๋˜์ง€ ์•Š์•˜๋”๋ผ๋„ ranged response๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค. ์ด๋Š” ์ด์ „ ranged request์—์„œ ์˜จ partial response ๋˜๋Š” range not satisfiable response๊ฐ€ range request๋ฅผ ํ•˜์ง€ ์•Š์€ API์— ์ œ๊ณต๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

    ์ถ”๊ฐ€ ์„ธ๋ถ€ ์ •๋ณด

    ์œ„ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•œ๋‹ค:

    media ์š”์†Œ๊ฐ€ ๊ต์ฐจ ์ถœ์ฒ˜ HTML ๋ฆฌ์†Œ์Šค์˜ ๋ฒ”์œ„๋ฅผ ์š”์ฒญํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ์ด๋Š” ์œ ํšจํ•˜์ง€ ์•Š์€ media์ด์ง€๋งŒ, ์‘๋‹ต์˜ clone์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ service worker์— ๋ณด๊ด€๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๋‚˜์ค‘์— script ์š”์†Œ์˜ fetch์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. partial response๊ฐ€ ์ „์ฒด ๋ฆฌ์†Œ์Šค๋Š” ์•„๋‹ˆ๋”๋ผ๋„ ์œ ํšจํ•œ JavaScript๋ผ๋ฉด, ์ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋น„๊ณต๊ฐœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ˆ„์ถœ๋  ์ˆ˜ ์žˆ๋‹ค.

  22. response๊ฐ€ network error๊ฐ€ ์•„๋‹ˆ๊ณ  request์˜ method๊ฐ€ `HEAD` ๋˜๋Š” `CONNECT`์ด๊ฑฐ๋‚˜, internalResponse์˜ status๊ฐ€ null body status์ด๋ฉด, internalResponse์˜ body๋ฅผ null๋กœ ์„ค์ •ํ•˜๊ณ , ์ด๋ฅผ ํ–ฅํ•œ ๋ชจ๋“  enqueue ์ž‘์—…(์žˆ๋Š” ๊ฒฝ์šฐ)์„ ๋ฌด์‹œํ•œ๋‹ค.

    ์ด๋Š” HTTP๋ฅผ ์œ„๋ฐ˜ํ•˜๋Š” ์„œ๋ฒ„์— ๋Œ€ํ•œ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋ฅผ ํ‘œ์ค€ํ™”ํ•œ๋‹ค.

  23. request์˜ integrity metadata๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ฉด:

    1. processBodyError๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋‘”๋‹ค: fetchParams์™€ network error๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ fetch response handover๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

    2. response์˜ body๊ฐ€ null์ด๋ฉด, processBodyError๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ด ๋‹จ๊ณ„๋ฅผ ์ค‘๋‹จํ•œ๋‹ค.

    3. bytes๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ processBody๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„๋“ค๋กœ ๋‘”๋‹ค:

      1. bytes๊ฐ€ request์˜ integrity metadata์™€ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด, processBodyError๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ด ๋‹จ๊ณ„๋ฅผ ์ค‘๋‹จํ•œ๋‹ค. [SRI]

      2. response์˜ body๋ฅผ bytes๋ฅผ body๋กœ ์ทจ๊ธ‰ํ•œ ๊ฒƒ์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

      3. fetchParams์™€ response๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ fetch response handover๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

    4. processBody์™€ processBodyError๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ response์˜ body๋ฅผ ์™„์ „ํžˆ ์ฝ๋Š”๋‹ค.

  24. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, fetchParams ๋ฐ response๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ fetch ์‘๋‹ต ์ธ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.


fetch response handover๋Š” fetch params fetchParams์™€ response response๋ฅผ ๋ฐ›์•„ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค:

  1. timingInfo๋ฅผ fetchParams์˜ timing info๋กœ ๋‘”๋‹ค.

  2. response๊ฐ€ ๋„คํŠธ์›Œํฌ ์—๋Ÿฌ๊ฐ€ ์•„๋‹ˆ๊ณ , fetchParams์˜ request์˜ client๊ฐ€ secure context์ด๋ฉด, timingInfo์˜ server-timing headers๋ฅผ response์˜ internal response์˜ header list์—์„œ `Server-Timing`์„ get/decode/splitํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    internal response๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ `Server-Timing` ํ—ค๋” ๋ฐ์ดํ„ฐ ๋…ธ์ถœ์ด `Timing-Allow-Origin` ํ—ค๋”๋กœ ๋ณดํ˜ธ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ „ํ•˜๋‹ค.

    ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” `Server-Timing` ํ—ค๋”๋ฅผ non-secure context ์š”์ฒญ์—๋„ ๋…ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

  3. ๋งŒ์•ฝ fetchParams์˜ request์˜ destination์ด "document"๋ผ๋ฉด, fetchParams์˜ controller์˜ full timing info๋ฅผ fetchParams์˜ timing info๋กœ ์„ค์ •ํ•œ๋‹ค.

  4. processResponseEndOfBody๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋‘”๋‹ค:

    1. unsafeEndTime์„ unsafe shared current time์œผ๋กœ ๋‘”๋‹ค.

    2. fetchParams์˜ controller์˜ report timing steps๋ฅผ global object global์„ ๋ฐ›์•„ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋‘”๋‹ค:

      1. fetchParams์˜ request์˜ URL์˜ scheme์ด HTTP(S) scheme์ด ์•„๋‹ˆ๋ฉด return.

      2. timingInfo์˜ end time์„ relative high resolution time์œผ๋กœ, unsafeEndTime๊ณผ global์„ ์ธ์ž๋กœ ์„ค์ •ํ•œ๋‹ค.

      3. cacheState๋ฅผ response์˜ cache state๋กœ ๋‘”๋‹ค.

      4. bodyInfo๋ฅผ response์˜ body info๋กœ ๋‘”๋‹ค.

      5. response์˜ timing allow passed flag๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด, timingInfo๋ฅผ opaque timing info ์ƒ์„ฑ์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•˜๊ณ , cacheState๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•œ๋‹ค.

        response๊ฐ€ ๋„คํŠธ์›Œํฌ ์—๋Ÿฌ์ธ ๊ฒฝ์šฐ๋„ ํฌํ•จํ•œ๋‹ค.

      6. responseStatus๋ฅผ 0์œผ๋กœ ๋‘”๋‹ค.

      7. fetchParams์˜ request์˜ mode๊ฐ€ "navigate"๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜ response์˜ redirect taint๊ฐ€ "same-origin"์ด๋ฉด:

        1. responseStatus๋ฅผ response์˜ status๋กœ ์„ค์ •ํ•œ๋‹ค.

        2. mimeType์„ response์˜ header list์—์„œ extracting a MIME type์˜ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

        3. mimeType์ด ์‹คํŒจ๊ฐ€ ์•„๋‹ˆ๋ฉด, bodyInfo์˜ content type์„ minimizing a supported MIME type์˜ ๊ฒฐ๊ณผ๋กœ mimeType์„ ๋„˜๊ฒจ ์„ค์ •ํ•œ๋‹ค.

      8. fetchParams์˜ request์˜ initiator type์ด null์ด ์•„๋‹ˆ๋ฉด, mark resource timing์„ timingInfo, fetchParams์˜ request์˜ URL, fetchParams์˜ request์˜ initiator type, global, cacheState, bodyInfo, responseStatus๋กœ ์‹คํ–‰ํ•œ๋‹ค.

    3. processResponseEndOfBodyTask๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์„ค์ •ํ•œ๋‹ค:

      1. fetchParams์˜ request์˜ done flag๋ฅผ ์„ค์ •ํ•œ๋‹ค.

      2. fetchParams์˜ process response end-of-body๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, fetchParams์˜ process response end-of-body๋ฅผ response๋กœ ์‹คํ–‰ํ•œ๋‹ค.

      3. fetchParams์˜ request์˜ initiator type์ด null์ด ์•„๋‹ˆ๊ณ , fetchParams์˜ request์˜ client์˜ global object๊ฐ€ fetchParams์˜ task destination์ด๋ฉด, fetchParams์˜ controller์˜ report timing steps๋ฅผ fetchParams์˜ request์˜ client์˜ global object๋กœ ์‹คํ–‰ํ•œ๋‹ค.

    4. fetch task ํ์— ๋„ฃ๊ธฐ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ processResponseEndOfBodyTask๋ฅผ fetchParams์˜ task destination๊ณผ ํ•จ๊ป˜ ์‹คํ–‰ํ•œ๋‹ค.

  5. fetchParams์˜ process response๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, fetch task ํ์— ๋„ฃ๊ธฐ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ fetchParams์˜ process response๋ฅผ response๋กœ, fetchParams์˜ task destination๊ณผ ํ•จ๊ป˜ ์‹คํ–‰ํ•œ๋‹ค.

  6. internalResponse๋ฅผ response๊ฐ€ ๋„คํŠธ์›Œํฌ ์—๋Ÿฌ์ผ ๊ฒฝ์šฐ response๋กœ, ์•„๋‹ˆ๋ฉด response์˜ internal response๋กœ ๋‘”๋‹ค.

  7. response๊ฐ€ network error๋ผ๋ฉด, request๋ฅผ ๊ฐ€์ง€๊ณ  WebDriver BiDi fetch error ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด request์™€ response๋ฅผ ๊ฐ€์ง€๊ณ  WebDriver BiDi response completed ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

  8. internalResponse์˜ body๊ฐ€ null์ด๋ฉด, processResponseEndOfBody๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

  9. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ:

    1. transformStream์„ ์ƒˆ๋กœ์šด TransformStream์œผ๋กœ ๋‘”๋‹ค.

    2. identityTransformAlgorithm์„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋‘๊ณ , chunk๋ฅผ ๋ฐ›์•„ transformStream์— enqueueํ•œ๋‹ค.

    3. transformStream ์„ค์ •์„ ์‹คํ–‰ํ•˜์—ฌ, transformAlgorithm์„ identityTransformAlgorithm์œผ๋กœ, flushAlgorithm์„ processResponseEndOfBody๋กœ ์„ค์ •ํ•œ๋‹ค.

    4. internalResponse์˜ body์˜ stream์„ internalResponse์˜ body์˜ stream์„ transformStream์— ํŒŒ์ดํ”„ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    ์ด TransformStream์€ ์ŠคํŠธ๋ฆผ์ด ๋์— ๋„๋‹ฌํ•  ๋•Œ ์•Œ๋ฆผ์„ ๋ฐ›๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•˜๋ฉฐ, ๊ทธ ์™ธ์—๋Š” identity transform stream์ด๋‹ค.

  10. fetchParams์˜ process response consume body๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด:

    1. processBody๋ฅผ nullOrBytes๋ฅผ ์ธ์ž๋กœ ๋ฐ›์•„, fetchParams์˜ process response consume body๋ฅผ response์™€ nullOrBytes๋กœ ์‹คํ–‰ํ•˜๋Š” ๋‹จ๊ณ„๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. processBodyError๋ฅผ fetchParams์˜ process response consume body๋ฅผ response์™€ failure๋กœ ์‹คํ–‰ํ•˜๋Š” ๋‹จ๊ณ„๋กœ ์„ค์ •ํ•œ๋‹ค.

    3. internalResponse์˜ body๊ฐ€ null์ด๋ฉด, fetch task ํ์— ๋„ฃ๊ธฐ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ processBody๋ฅผ null๋กœ ์‹คํ–‰ํ•˜๊ณ , fetchParams์˜ task destination๊ณผ ํ•จ๊ป˜ ์‹คํ–‰ํ•œ๋‹ค.

    4. ๊ทธ ์™ธ์—๋Š”, body ์™„์ „ ์ฝ๊ธฐ๋ฅผ internalResponse์˜ body, processBody, processBodyError, fetchParams์˜ task destination๋กœ ์‹คํ–‰ํ•œ๋‹ค.

4.2. ์˜ค๋ฒ„๋ผ์ด๋“œ fetch

override fetch๋Š” "scheme-fetch" ๋˜๋Š” "http-fetch" type, fetch params fetchParams, ๊ทธ๋ฆฌ๊ณ  ์„ ํƒ์  boolean makeCORSPreflight (๊ธฐ๋ณธ๊ฐ’ false)๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›๋Š”๋‹ค:

  1. request๋ฅผ fetchParams์˜ request๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. response๋ฅผ request์— ๋Œ€ํ•ด potentially override response for a request๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  3. response๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด response๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  4. type์— ๋”ฐ๋ผ ๋‹ค์Œ ๋‹จ๊ณ„ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค:

    "scheme fetch"

    response๋ฅผ fetchParams๋ฅผ ์ž…๋ ฅ์œผ๋กœ scheme fetch๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    "HTTP fetch"

    response๋ฅผ fetchParams์™€ makeCORSPreflight๋ฅผ ์ž…๋ ฅ์œผ๋กœ HTTP fetch๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  5. response๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์„ ์ž ์žฌ์ ์œผ๋กœ ์žฌ์ •์˜ํ•˜๊ธฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์š”์ฒญ request๋ฅผ ๋ฐ›์•„, ์‘๋‹ต ๋˜๋Š” null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ ๋™์ž‘์€ implementation-defined์ด๋ฉฐ, ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๊ฐ€ ์‘๋‹ต์„ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์š”์ฒญ์— ๊ฐœ์ž…ํ•˜๊ฑฐ๋‚˜, null์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์š”์ฒญ์ด ์ง„ํ–‰๋˜๋„๋ก ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ, ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‚ฌ์†Œํ•œ ๊ตฌํ˜„์„ ๊ฐ€์ง„๋‹ค:

  1. null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ด ๊ธฐ๋ณธ ๊ตฌํ˜„์„ ๋‹ค์†Œ ๋” ๋ณต์žกํ•œ ๋™์ž‘ ์ง‘ํ•ฉ์œผ๋กœ ์žฌ์ •์˜ํ•  ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” `https://unsafe.example/`์— ๋Œ€ํ•œ ์š”์ฒญ์„ ์ผ๋ฐ˜์ ์œผ๋กœ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ์ด ์‚ฌ์šฉ์ž์˜ ์•ˆ์ „์„ ๊ฐ€์žฅ ์ž˜ ๋ณด์กดํ•œ๋‹ค๊ณ  ํŒ๋‹จํ•˜๋ฉด์„œ, ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๋ฆฌ์†Œ์Šค `https://unsafe.example/widget.js`์— ๋Œ€ํ•ด์„œ๋Š” ํŒŒ์†์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด shim์„ ํ•ฉ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ๊ตฌํ˜„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ๋‹ค:

  1. request์˜ current url์˜ host์˜ registrable domain์ด "unsafe.example"์ด๋ฉด:

    1. request์˜ current url์˜ path๊ฐ€ ยซ "widget.js" ยป์ด๋ฉด:

      1. body๋ฅผ [shim ์ฒ˜๋ฆฌ๋œ ์ฝ˜ํ…์ธ ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๋ฅผ ์—ฌ๊ธฐ์— ์‚ฝ์ž…]์œผ๋กœ ๋‘”๋‹ค.

      2. ๋‹ค์Œ ์†์„ฑ์„ ๊ฐ€์ง„ ์ƒˆ ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค:

        type
        "cors"
        status
        200
        ...
        ...
        body
        body๋ฅผ body๋กœ ์ทจ๊ธ‰ํ•œ ๊ฒƒ์„ ์–ป์€ ๊ฒฐ๊ณผ.
    2. network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

4.3. ์Šคํ‚ด fetch

์Šคํ‚ด fetch๋Š” fetch params fetchParams๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›๋Š”๋‹ค:

  1. fetchParams๊ฐ€ ์ทจ์†Œ๋จ์ด๋ฉด, fetchParams์— ๋Œ€ํ•ด ์ ์ ˆํ•œ ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. request๋ฅผ fetchParams์˜ request๋กœ ์„ค์ •ํ•œ๋‹ค.

  3. request์˜ current URL์˜ scheme์— ๋”ฐ๋ผ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค:

    "about"

    request์˜ current URL์˜ path๊ฐ€ "blank" ๋ฌธ์ž์—ด์ด๋ฉด, response๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•œ๋‹ค. status message๋Š” `OK`, header list๋Š” ยซ (`Content-Type`, `text/html;charset=utf-8`) ยป, body๋Š” ๋นˆ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๋ฅผ body๋กœ ๋ณ€ํ™˜ํ•œ ๊ฐ’์ด๋‹ค.

    URL "about:config" ๋“ฑ์€ ๋„ค๋น„๊ฒŒ์ด์…˜ ์ฒ˜๋ฆฌ ์‹œ ๋‹ค๋ฃจ๋ฉฐ, fetch ๋งฅ๋ฝ์—์„œ๋Š” ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

    "blob"
    1. blobURLEntry๋ฅผ request์˜ current URL์˜ blob URL entry๋กœ ๋‘”๋‹ค.

    2. request์˜ method๊ฐ€ `GET`์ด ์•„๋‹ˆ๊ฑฐ๋‚˜ blobURLEntry๊ฐ€ null์ด๋ฉด, network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. [FILEAPI]

      `GET` method ์ œํ•œ์€ ์ƒํ˜ธ ์šด์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ ์™ธ์—๋Š” ์œ ์šฉํ•œ ๋ชฉ์ ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.

    3. requestEnvironment๋ฅผ, request๋ฅผ ์ฃผ์–ด environment๋ฅผ ๊ฒฐ์ •ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

    4. isTopLevelSelfFetch๋ฅผ false๋กœ ๋‘”๋‹ค.

    5. request์˜ client๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด:

      1. global์„ request์˜ client์˜ global object๋กœ ๋‘”๋‹ค.

      2. ๋‹ค์Œ ๋ชจ๋“  ์กฐ๊ฑด์ด ์ฐธ์ด๋ฉด:

        • global์€ Window ๊ฐ์ฒด์ด๋‹ค;

        • global์˜ navigable์ด null์ด ์•„๋‹ˆ๋‹ค;

        • global์˜ navigable์˜ parent ๊ฐ€ null์ด๋‹ค; ๊ทธ๋ฆฌ๊ณ 

        • requestEnvironment์˜ creation URL์ด equals๋กœ request์˜ current URL๊ณผ ๊ฐ™๋‹ค,

        ๊ทธ๋Ÿฌ๋ฉด isTopLevelSelfFetch๋ฅผ true๋กœ ์„ค์ •ํ•œ๋‹ค.

    6. stringOrEnvironment๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„์˜ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค:

      1. request์˜ destination์ด "document"์ด๋ฉด, "top-level-navigation"์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      2. isTopLevelSelfFetch๊ฐ€ true์ด๋ฉด, "top-level-self-fetch"๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      3. requestEnvironment๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    7. blob์„, blobURLEntry์™€ stringOrEnvironment๋ฅผ ์ฃผ์–ด blob ๊ฐ์ฒด๋ฅผ ์–ป๋Š” ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

    8. blob์ด Blob ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ฉด, network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    9. response๋ฅผ ์ƒˆ๋กœ์šด response๋กœ ๋‘”๋‹ค.

    10. fullLength๋ฅผ blob์˜ size๋กœ ๋‘”๋‹ค.

    11. serializedFullLength๋ฅผ fullLength๋ฅผ serializedํ•˜๊ณ  isomorphic encodedํ•œ ๊ฐ’์œผ๋กœ ๋‘”๋‹ค.

    12. type์„ blob์˜ type์œผ๋กœ ๋‘”๋‹ค.

    13. request์˜ header list๊ฐ€ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด `Range`:

      1. bodyWithType๋ฅผ safely extracting blob์˜ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

      2. response์˜ status message๋ฅผ `OK`๋กœ ์„ค์ •ํ•œ๋‹ค.

      3. response์˜ body๋ฅผ bodyWithType์˜ body๋กœ ์„ค์ •ํ•œ๋‹ค.

      4. response์˜ header list๋ฅผ ยซ (`Content-Length`, serializedFullLength), (`Content-Type`, type) ยป๋กœ ์„ค์ •ํ•œ๋‹ค.

    14. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ:

      1. response์˜ range-requested flag๋ฅผ ์„ค์ •ํ•œ๋‹ค.

      2. rangeHeader๋ฅผ, request์˜ header list์—์„œ `Range`๋ฅผ gettingํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

      3. rangeValue๋ฅผ, rangeHeader์™€ true๋ฅผ ์ฃผ์–ด parsing a single range header value์˜ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

      4. rangeValue๊ฐ€ failure์ด๋ฉด, network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      5. (rangeStart, rangeEnd)๋ฅผ rangeValue๋กœ ๋‘”๋‹ค.

      6. rangeStart๊ฐ€ null์ด๋ฉด:

        1. rangeStart๋ฅผ fullLength โˆ’ rangeEnd๋กœ ์„ค์ •ํ•œ๋‹ค.

        2. rangeEnd๋ฅผ rangeStart + rangeEnd โˆ’ 1๋กœ ์„ค์ •ํ•œ๋‹ค.

      7. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ:

        1. rangeStart๊ฐ€ fullLength ์ด์ƒ์ด๋ฉด, network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

        2. rangeEnd๊ฐ€ null์ด๊ฑฐ๋‚˜ rangeEnd๊ฐ€ fullLength ์ด์ƒ์ด๋ฉด, rangeEnd๋ฅผ fullLength โˆ’ 1๋กœ ์„ค์ •ํ•œ๋‹ค.

      8. slicedBlob์„, blob, rangeStart, rangeEnd + 1, ๊ทธ๋ฆฌ๊ณ  type์„ ์ฃผ์–ด slice blob์„ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

        range ํ—ค๋”๋Š” ํฌํ•จ(inclusive)๋œ ๋ฐ”์ดํŠธ ๋ฒ”์œ„๋ฅผ ๋‚˜ํƒ€๋‚ด์ง€๋งŒ, slice blob ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ž…๋ ฅ ๋ฒ”์œ„๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. slice blob ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด rangeEnd๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ์•ผ ํ•œ๋‹ค.

      9. slicedBodyWithType๋ฅผ safely extracting slicedBlob์˜ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

      10. response์˜ body๋ฅผ slicedBodyWithType์˜ body๋กœ ์„ค์ •ํ•œ๋‹ค.

      11. serializedSlicedLength๋ฅผ slicedBlob์˜ size๋ฅผ serializedํ•˜๊ณ  isomorphic encodedํ•œ ๊ฐ’์œผ๋กœ ๋‘”๋‹ค.

      12. contentRange๋ฅผ, rangeStart, rangeEnd, fullLength๋ฅผ ์ฃผ์–ด build a content range๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

      13. response์˜ status๋ฅผ 206์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

      14. response์˜ status message๋ฅผ `Partial Content`๋กœ ์„ค์ •ํ•œ๋‹ค.

      15. response์˜ header list๋ฅผ ยซ (`Content-Length`, serializedSlicedLength), (`Content-Type`, type), (`Content-Range`, contentRange) ยป๋กœ ์„ค์ •ํ•œ๋‹ค.

    15. response๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    "data"
    1. dataURLStruct๋ฅผ, request์˜ current URL์— ๋Œ€ํ•ด data: URL ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

    2. dataURLStruct๊ฐ€ failure์ด๋ฉด, network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    3. mimeType์„ dataURLStruct์˜ MIME type์„ ์ง๋ ฌํ™”ํ•œ ๊ฐ’์œผ๋กœ ๋‘”๋‹ค.

    4. ์ƒˆ๋กœ์šด response๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ, ๊ทธ status message๋Š” `OK`์ด๊ณ , header list๋Š” ยซ (`Content-Type`, mimeType) ยป์ด๋ฉฐ, body ๋Š” dataURLStruct์˜ body๋ฅผ body๋กœ์„œ ์‚ฌ์šฉํ•œ ๊ฒƒ์ด๋‹ค.

    "file"

    ํ˜„์žฌ๋กœ์„œ๋Š” ์•„์‰ฝ์ง€๋งŒ, file: URLs ๋Š” ๋…์ž๋ฅผ ์œ„ํ•œ ์—ฐ์Šต ๋ฌธ์ œ๋กœ ๋‚จ๊ฒจ๋‘”๋‹ค.

    ํ™•์‹ ์ด ์„œ์ง€ ์•Š์œผ๋ฉด, network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    HTTP(S) ์Šคํ‚ด

    fetchParams๋ฅผ ์ฃผ์–ด HTTP fetch๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  4. network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

ํ™˜๊ฒฝ ๊ฒฐ์ •ํ•˜๊ธฐ๋Š” request request๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›๋Š”๋‹ค:

  1. request์˜ reserved client๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, request์˜ reserved client๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. request์˜ client๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, request์˜ client๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

4.4. HTTP fetch

HTTP fetch๋Š” fetch params fetchParams์™€ ์„ ํƒ์  boolean makeCORSPreflight (๊ธฐ๋ณธ๊ฐ’ false)๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„, ๋‹ค์Œ ๋‹จ๊ณ„๋“ค์„ ์‹คํ–‰ํ•œ๋‹ค:

  1. request๋ฅผ fetchParams์˜ request๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. response์™€ internalResponse๋ฅผ null๋กœ ์„ค์ •ํ•œ๋‹ค.

  3. request์˜ service-workers mode๊ฐ€ "all"์ด๋ฉด:

    1. requestForServiceWorker๋ฅผ request์˜ clone์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. requestForServiceWorker์˜ body๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด:

      1. transformStream์„ ์ƒˆ๋กœ์šด TransformStream ๊ฐ์ฒด๋กœ ์„ค์ •ํ•œ๋‹ค.

      2. transformAlgorithm์„ chunk์„ ์ž…๋ ฅ์œผ๋กœ ์•„๋ž˜ ๋‹จ๊ณ„๋กœ ์ •์˜ํ•œ๋‹ค:

        1. fetchParams๊ฐ€ ์ทจ์†Œ๋จ์ด๋ฉด, ์ด ๋‹จ๊ณ„๋ฅผ ์ค‘์ง€ํ•œ๋‹ค.

        2. chunk๊ฐ€ Uint8Array ๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๋ฉด terminate๋ฅผ fetchParams์˜ controller์— ์ ์šฉํ•œ๋‹ค.

        3. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ, enqueue๋ฅผ ์‚ฌ์šฉํ•ด chunk๋ฅผ transformStream์— ๋„ฃ๋Š”๋‹ค. ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” chunk๋ฅผ ๊ตฌํ˜„ ์ •์˜์˜ ์ ์ ˆํ•œ ํฌ๊ธฐ๋กœ ๋ถ„ํ• ํ•˜์—ฌ ๊ฐ๊ฐ enqueueํ•˜๊ฑฐ๋‚˜, chunk๋“ค์„ ๊ตฌํ˜„ ์ •์˜์˜ ์ ์ ˆํ•œ ํฌ๊ธฐ๋กœ ๊ฒฐํ•ฉํ•˜์—ฌ enqueueํ•  ์ˆ˜ ์žˆ๋‹ค.

      3. Set up์„ ์‚ฌ์šฉํ•ด transformStream์„ transformAlgorithm์ด transformAlgorithm์ด ๋˜๋„๋ก ์„ค์ •ํ•œ๋‹ค.

      4. requestForServiceWorker์˜ body์˜ stream์„ requestForServiceWorker์˜ body์˜ stream์„ pipeThrough๋กœ transformStream์— ์—ฐ๊ฒฐํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    3. serviceWorkerStartTime์„ coarsened shared current time์„ fetchParams์˜ cross-origin isolated capability๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    4. fetchResponse๋ฅผ handle fetch์— requestForServiceWorker, fetchParams์˜ controller ๋ฐ fetchParams์˜ cross-origin isolated capability์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค. [HTML] [SW]

    5. ๋งŒ์•ฝ fetchResponse๊ฐ€ response๋ผ๋ฉด:

      1. response๋ฅผ fetchResponse๋กœ ์„ค์ •ํ•œ๋‹ค.

      2. fetchParams์˜ timing info์˜ final service worker start time์„ serviceWorkerStartTime์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

      3. fetchParams์˜ timing info์˜ service worker timing info๋ฅผ response์˜ service worker timing info๋กœ ์„ค์ •ํ•œ๋‹ค.

      4. request์˜ body๊ฐ€ null์ด ์•„๋‹ˆ๋ผ๋ฉด, cancel request์˜ body๋ฅผ undefined์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•œ๋‹ค.

      5. internalResponse๋ฅผ response๋กœ, ๋งŒ์•ฝ response๊ฐ€ filtered response๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด response๋กœ; ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด response์˜ internal response๋กœ ์„ค์ •ํ•œ๋‹ค.

      6. request์™€ response๋กœ WebDriver BiDi ์‘๋‹ต ์‹œ์ž‘ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

      7. ๋‹ค์Œ ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋งŒ์กฑํ•˜๋ฉด

        • response์˜ type์ด "error"์ธ ๊ฒฝ์šฐ

        • request์˜ mode๊ฐ€ "same-origin"์ด๊ณ , response์˜ type์ด "cors"์ธ ๊ฒฝ์šฐ

        • request์˜ mode๊ฐ€ "no-cors"๊ฐ€ ์•„๋‹ˆ๊ณ , response์˜ type์ด "opaque"์ธ ๊ฒฝ์šฐ

        • request์˜ redirect mode๊ฐ€ "manual"์ด ์•„๋‹ˆ๊ณ , response์˜ type์ด "opaqueredirect"์ธ ๊ฒฝ์šฐ
        • request์˜ redirect mode๊ฐ€ "follow"๊ฐ€ ์•„๋‹ˆ๊ณ , response์˜ URL list์— ํ•ญ๋ชฉ์ด ๋‘ ๊ฐœ ์ด์ƒ ์žˆ๋Š” ๊ฒฝ์šฐ

        ์ด ๊ฒฝ์šฐ network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    6. ๊ทธ ๋ฐ–์—, fetchResponse๊ฐ€ service worker timing info๋ผ๋ฉด, fetchParams์˜ timing info์˜ service worker timing info๋ฅผ fetchResponse๋กœ ์„ค์ •ํ•œ๋‹ค.

  4. response๊ฐ€ null์ด๋ฉด:

    1. makeCORSPreflight์ด true์ด๊ณ  ๋‹ค์Œ ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์ฐธ์ด๋ฉด:

      ๊ทธ๋ ‡๋‹ค๋ฉด:

      1. preflightResponse๋ฅผ CORS-ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ fetch๋ฅผ request์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

      2. preflightResponse๊ฐ€ network error์ด๋ฉด preflightResponse๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      ์ด ๋‹จ๊ณ„๋Š” CORS-ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ ์บ์‹œ๋ฅผ ํ™•์ธํ•˜๊ณ  ์ ์ ˆํ•œ ์—”ํŠธ๋ฆฌ๊ฐ€ ์—†์œผ๋ฉด CORS-ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ fetch๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์„ฑ๊ณต ์‹œ ์บ์‹œ๋ฅผ ์ฑ„์šด๋‹ค. CORS-ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ fetch์˜ ๋ชฉ์ ์€ fetch ๋ฆฌ์†Œ์Šค๊ฐ€ CORS ํ”„๋กœํ† ์ฝœ์„ ์ธ์ง€ํ•˜๊ณ  ์žˆ์Œ์„ ๋ณด์žฅํ•˜๋Š” ๋ฐ ์žˆ๋‹ค. ์บ์‹œ๋Š” CORS-ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ fetch ํšŸ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์กด์žฌํ•œ๋‹ค.

    2. request์˜ redirect mode๊ฐ€ "follow"์ด๋ฉด, request์˜ service-workers mode๋ฅผ "none"์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

      ๋„คํŠธ์›Œํฌ์—์„œ ๋ฐœ์ƒํ•œ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋Š”(์„œ๋น„์Šค ์›Œ์ปค๋กœ๋ถ€ํ„ฐ ๋ฐœ์ƒํ•œ ๊ฒƒ์ด ์•„๋‹Œ ๊ฒฝ์šฐ) ์„œ๋น„์Šค ์›Œ์ปค์— ๋…ธ์ถœ๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

    3. response์™€ internalResponse๋ฅผ HTTP-๋„คํŠธ์›Œํฌ-๋˜๋Š”-์บ์‹œ fetch๋ฅผ fetchParams์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    4. request์˜ response tainting๊ฐ€ "cors"์ด๊ณ  CORS ์ฒดํฌ๋ฅผ request์™€ response์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์‹คํŒจ์ด๋ฉด, network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      CORS ๊ฒ€์‚ฌ๋Š” ์‘๋‹ต ์ค‘ status๊ฐ€ 304 ๋˜๋Š” 407์ธ ๊ฒƒ, ๋˜๋Š” ๊ทธ ์ ์—์„œ service worker์—์„œ ์˜จ ์‘๋‹ต์—๋Š” ์ ์šฉ๋˜์ง€ ์•Š์•„์•ผ ํ•˜๋ฏ€๋กœ, ์—ฌ๊ธฐ์„œ ์ ์šฉ๋œ๋‹ค.

    5. TAO ์ฒดํฌ๋ฅผ request์™€ response์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์‹คํŒจ์ด๋ฉด, request์˜ timing allow failed flag๋ฅผ ์„ค์ •ํ•œ๋‹ค.

  5. request์˜ response tainting ๋˜๋Š” response์˜ type์ด "opaque"์ด๊ณ , cross-origin resource policy check๋ฅผ request์˜ origin, request์˜ client, request์˜ destination, ๊ทธ๋ฆฌ๊ณ  internalResponse๋กœ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๊ฐ€ blocked๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด, network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    cross-origin resource policy check๋Š” ๋„คํŠธ์›Œํฌ์—์„œ ์˜ค๋Š” ์‘๋‹ต๊ณผ ์„œ๋น„์Šค ์›Œ์ปค์—์„œ ์˜ค๋Š” ์‘๋‹ต ๋ชจ๋‘์— ๋Œ€ํ•ด ์‹คํ–‰๋œ๋‹ค. ์ด๋Š” CORS check์™€๋Š” ๋‹ค๋ฅธ๋ฐ, request์˜ client์™€ ์„œ๋น„์Šค ์›Œ์ปค๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์ž„๋ฒ ๋” ์ •์ฑ…์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  6. internalResponse์˜ status๊ฐ€ redirect status์ด๋ฉด:

    1. request๊ฐ€ ๋‚ด๋น„๊ฒŒ์ด์…˜ ์š”์ฒญ์ด๋ฉด, request์™€ internalResponse๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ์š”์ฒญ์˜ ๋‚ด๋น„๊ฒŒ์ด์…˜ ํƒ€์ด๋ฐ ํ—ˆ์šฉ ๊ฐ’ ๋ชฉ๋ก์— ๋ง๋ถ™์ธ๋‹ค.

    2. internalResponse์˜ status๊ฐ€ 303์ด ์•„๋‹ˆ๊ณ  request์˜ body๊ฐ€ null์ด ์•„๋‹ˆ๋ฉฐ connection์ด HTTP/2๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” RST_STREAM ํ”„๋ ˆ์ž„์„ ์ „์†กํ•ด๋„ ๋œ๋‹ค(๊ถŒ์žฅ๋จ).

      303์€ ์ผ๋ถ€ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ํŠน๋ณ„ํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ ์ œ์™ธ๋œ๋‹ค.

    3. request์˜ redirect mode์— ๋”ฐ๋ผ ๋‹ค์Œ ๋‹จ๊ณ„ ์‹คํ–‰:

      "error"
      1. response๋ฅผ network error๋กœ ์„ค์ •ํ•œ๋‹ค.

      "manual"
      1. request์˜ mode๊ฐ€ "navigate"์ด๋ฉด, fetchParams์˜ controller์˜ next manual redirect steps๋ฅผ HTTP-๋ฆฌ๋‹ค์ด๋ ‰ํŠธ fetch๋ฅผ fetchParams์™€ response๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

      2. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ, response๋ฅผ opaque-redirect filtered response๋กœ ์„ค์ •ํ•˜๊ณ  internal response๋Š” internalResponse๋กœ ํ•œ๋‹ค.

      "follow"
      1. WebDriver BiDi ์‘๋‹ต ์™„๋ฃŒ ๋‹จ๊ณ„๋ฅผ request์™€ response๋กœ ์‹คํ–‰ํ•œ๋‹ค.
      2. response๋ฅผ HTTP-redirect fetch๋ฅผ fetchParams์™€ response๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  7. response๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ internalResponse์˜ body์˜ stream์€ ๋ฐ˜ํ™˜ ํ›„์—๋„ ๊ณ„์† enqueue๋œ๋‹ค.

4.5. HTTP-๋ฆฌ๋‹ค์ด๋ ‰ํŠธ fetch

HTTP-๋ฆฌ๋‹ค์ด๋ ‰ํŠธ fetch๋Š” fetch params fetchParams์™€ response response๋ฅผ ๋ฐ›์•„, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค:

  1. request๋ฅผ fetchParams์˜ request๋กœ ๋‘”๋‹ค.

  2. internalResponse๋ฅผ, response๊ฐ€ filtered response๊ฐ€ ์•„๋‹ˆ๋ฉด response๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด response์˜ internal response๋กœ ๋‘”๋‹ค.

  3. locationURL๋ฅผ, internalResponse์˜ location URL์„ request์˜ current URL์˜ fragment๋ฅผ ์ฃผ์–ด ์–ป์€ ๊ฐ’์œผ๋กœ ๋‘”๋‹ค.

  4. locationURL๊ฐ€ null์ด๋ฉด, response๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  5. locationURL๊ฐ€ failure์ด๋ฉด, network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  6. locationURL์˜ scheme์ด HTTP(S) scheme์ด ์•„๋‹ˆ๋ฉด, network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  7. request์˜ redirect count๊ฐ€ 20์ด๋ฉด, network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  8. request์˜ redirect count๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

  9. request์˜ mode๊ฐ€ "cors"์ด๊ณ , locationURL์ด credentials๋ฅผ ํฌํ•จํ•˜๋ฉฐ, request์˜ origin์ด locationURL์˜ origin๊ณผ same origin์ด ์•„๋‹ˆ๋ฉด, network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  10. request์˜ response tainting์ด "cors"์ด๊ณ  locationURL์ด credentials๋ฅผ ํฌํ•จํ•˜๋ฉด, network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    ์ด๋Š” ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋™์ผ ์ถœ์ฒ˜ URL๋กœ ๋ฆฌ๋””๋ ‰ํŠธํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ํฌ์ฐฉํ•œ๋‹ค.

  11. internalResponse์˜ status๊ฐ€ 303์ด ์•„๋‹ˆ๊ณ , request์˜ body๊ฐ€ null์ด ์•„๋‹ˆ๋ฉฐ, request์˜ body์˜ source ๊ฐ€ null์ด๋ฉด, network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  12. ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ฐธ์ด๋ฉด

    • internalResponse์˜ status๊ฐ€ 301 ๋˜๋Š” 302์ด๊ณ  request์˜ method๊ฐ€ `POST`์ธ ๊ฒฝ์šฐ

    • internalResponse์˜ status๊ฐ€ 303์ด๊ณ  request์˜ method๊ฐ€ `GET` ๋˜๋Š” `HEAD`๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ

    ๊ทธ๋ ‡๋‹ค๋ฉด:

    1. request์˜ method๋ฅผ `GET`์œผ๋กœ, request์˜ body๋ฅผ null๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. ๊ฐ๊ฐ์˜ headerName์— ๋Œ€ํ•ด, request-body-header name ๋ชฉ๋ก์—์„œ delete๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ request์˜ header list์—์„œ headerName์„ ์‚ญ์ œํ•œ๋‹ค.

  13. request์˜ current URL์˜ origin์ด locationURL์˜ origin๊ณผ same origin์ด ์•„๋‹ˆ๋ฉด, ๊ฐ๊ฐ์˜ headerName์— ๋Œ€ํ•ด, CORS non-wildcard request-header name ๋ชฉ๋ก์—์„œ delete๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ request์˜ header list์—์„œ headerName์„ ์‚ญ์ œํ•œ๋‹ค.

    ์ฆ‰, ์ดˆ๊ธฐ ์š”์ฒญ ์ดํ›„์— ๋‹ค๋ฅธ origin์ด ๋ณด์ด๋Š” ์ˆœ๊ฐ„, `Authorization` ํ—ค๋”๊ฐ€ ์ œ๊ฑฐ๋œ๋‹ค.

  14. request์˜ body๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, safely extracting์„ ์‚ฌ์šฉํ•˜์—ฌ request์˜ body์˜ source๋ฅผ ์ถ”์ถœํ•œ ๊ฒฐ๊ณผ์˜ body๋กœ request์˜ body๋ฅผ ์„ค์ •ํ•œ๋‹ค.

    request์˜ body์˜ source๊ฐ€ null์ธ์ง€ ์—ฌ๋ถ€๋Š” ์ด๋ฏธ ํ™•์ธ๋˜์—ˆ๋‹ค.

  15. timingInfo๋ฅผ fetchParams์˜ timing info๋กœ ๋‘”๋‹ค.

  16. timingInfo์˜ redirect end time๊ณผ post-redirect start time์„, coarsened shared current time์œผ๋กœ ์„ค์ •ํ•˜๋˜, ์ด๋Š” fetchParams์˜ cross-origin isolated capability๋ฅผ ์ฃผ์–ด ์–ป๋Š”๋‹ค.

  17. timingInfo์˜ redirect start time์ด 0์ด๋ฉด, timingInfo์˜ redirect start time์„ timingInfo์˜ start time์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  18. Append๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ locationURL์„ request์˜ URL list์— ์ถ”๊ฐ€ํ•œ๋‹ค.

  19. set requestโ€™s referrer policy on redirect๋ฅผ request์™€ internalResponse์— ๋Œ€ํ•ด ํ˜ธ์ถœํ•œ๋‹ค. [REFERRER]

  20. recursive๋ฅผ true๋กœ ๋‘”๋‹ค.

  21. request์˜ redirect mode๊ฐ€ "manual"์ด๋ฉด, ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค:

    1. Assert: request์˜ mode๋Š” "navigate"์ด๋‹ค.

    2. recursive๋ฅผ false๋กœ ์„ค์ •ํ•œ๋‹ค.

  22. fetchParams์™€ recursive๋ฅผ ์ฃผ์–ด main fetch๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    ์ด๋Š” request์˜ main fetch๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ response tainting์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

4.6. HTTP-๋„คํŠธ์›Œํฌ-๋˜๋Š”-์บ์‹œ fetch

๋‹ค์Œ์ด ์ฃผ์–ด์กŒ์„ ๋•Œ HTTP-network-or-cache fetch๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด, fetch params fetchParams, ์„ ํƒ์  ๋ถˆ๋ฆฌ์–ธ isAuthenticationFetch (๊ธฐ๋ณธ๊ฐ’ false), ๋ฐ ์„ ํƒ์  ๋ถˆ๋ฆฌ์–ธ isNewConnectionFetch (๊ธฐ๋ณธ๊ฐ’ false)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค:

์ผ๋ถ€ ๊ตฌํ˜„์€ HTTP Caching์— ๋”ฐ๋ผ ๋ถ€๋ถ„ ์ฝ˜ํ…์ธ  ์บ์‹ฑ์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ธŒ๋ผ์šฐ์ € ์บ์‹œ์—์„œ๋Š” ๋„๋ฆฌ ์ง€์›๋˜์ง€ ์•Š๋Š”๋‹ค. [HTTP-CACHING]

  1. request๋ฅผ fetchParams์˜ request๋กœ ํ•˜์ž.

  2. httpFetchParams๋ฅผ null๋กœ ํ•˜์ž.

  3. httpRequest๋ฅผ null๋กœ ํ•˜์ž.

  4. response๋ฅผ null๋กœ ํ•˜์ž.

  5. storedResponse๋ฅผ null๋กœ ํ•˜์ž.

  6. httpCache๋ฅผ null๋กœ ํ•˜์ž.

  7. revalidatingFlag๋ฅผ unset ์ƒํƒœ๋กœ ๋‘์ž.

  8. ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•˜๋˜, abort when fetchParams๊ฐ€ canceled์ธ ๊ฒฝ์šฐ ์ค‘๋‹จํ•œ๋‹ค:

    1. ๋งŒ์•ฝ request์˜ traversable for user prompts๊ฐ€ "no-traversable"์ด๊ณ  request์˜ redirect mode๊ฐ€ "error"์ด๋ฉด, httpFetchParams๋ฅผ fetchParams๋กœ, httpRequest๋ฅผ request๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด:

      1. httpRequest๋ฅผ request์˜ clone์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

        ๊ตฌํ˜„์ฒด๋Š” request์˜ body์˜ stream์„ teeํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค. ํŠนํžˆ request์˜ body์˜ source๊ฐ€ null์ผ ๋•Œ๋Š” ๋‹จ์ผ ๋ฐ”๋””๋งŒ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, request์˜ body์˜ source๊ฐ€ null์ด๋ฉด, ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ์™€ ์ธ์ฆ์€ ํŽ˜์น˜ ์‹คํŒจ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

      2. httpFetchParams๋ฅผ fetchParams์˜ ๋ณต์‚ฌ๋ณธ์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

      3. httpFetchParams์˜ request๋ฅผ httpRequest๋กœ ์„ค์ •ํ•œ๋‹ค.

      ์‚ฌ์šฉ์ž ํ”„๋กฌํ”„ํŠธ๋‚˜ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉด, ์‚ฌ์šฉ์ž ์‘๋‹ต์ด๋‚˜ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๋Œ€์ƒ์ด ๊ฒฐ์ •๋œ ํ›„์— ์š”์ฒญ์„ ์ƒˆ๋กœ์šด ํ—ค๋” ์ง‘ํ•ฉ์œผ๋กœ ๋‹ค์‹œ ์ „์†กํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ์‹œ์ ์— ์›๋ž˜ ์š”์ฒญ ๋ฐ”๋””๊ฐ€ ์ด๋ฏธ ๋ถ€๋ถ„์ ์œผ๋กœ ์ „์†ก๋˜์—ˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์šฐ๋ฆฌ๋Š” ์—ฌ๋ถ„์˜ ์‚ฌ๋ณธ์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•ด ๋ฏธ๋ฆฌ ์š”์ฒญ(๋ฐ”๋”” ํฌํ•จ)์„ ๋ณต์ œํ•ด์•ผ ํ•œ๋‹ค.

    3. includeCredentials๋ฅผ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ผ๋„ true์ด๋ฉด true๋กœ ํ•˜์ž:

      ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false์ด๋‹ค.

    4. ๋งŒ์•ฝ Cross-Origin-Embedder-Policy๊ฐ€ credentials ํ—ˆ์šฉ์ด request์— ๋Œ€ํ•ด false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด, includeCredentials๋ฅผ false๋กœ ์„ค์ •ํ•œ๋‹ค.

    5. contentLength๋ฅผ httpRequest์˜ body์˜ length๋กœ ํ•˜๋˜, ๋งŒ์•ฝ httpRequest์˜ body๊ฐ€ null์ด๋ฉด null๋กœ ํ•˜์ž.

    6. contentLengthHeaderValue๋ฅผ null๋กœ ํ•˜์ž.

    7. ๋งŒ์•ฝ httpRequest์˜ body๊ฐ€ null์ด๊ณ  httpRequest์˜ method๊ฐ€ `POST` ๋˜๋Š” `PUT`์ด๋ฉด, contentLengthHeaderValue๋ฅผ `0`์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    8. ๋งŒ์•ฝ contentLength๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, contentLengthHeaderValue๋ฅผ contentLength์˜ ์ง๋ ฌํ™”๋œ ๋ฐ isomorphic ์ธ์ฝ”๋”ฉ๋œ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    9. ๋งŒ์•ฝ contentLengthHeaderValue๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, append (`Content-Length`, contentLengthHeaderValue)๋ฅผ httpRequest์˜ header list์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    10. ๋งŒ์•ฝ contentLength๊ฐ€ null์ด ์•„๋‹ˆ๊ณ  httpRequest์˜ keepalive๊ฐ€ true์ด๋ฉด, ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค:

      1. inflightKeepaliveBytes๋ฅผ 0์œผ๋กœ ํ•˜์ž.

      2. group๋ฅผ httpRequest์˜ client์˜ fetch group๋กœ ํ•˜์ž.

      3. inflightRecords๋ฅผ group์— ์žˆ๋Š” fetch records ์ค‘์—์„œ request์˜ keepalive๊ฐ€ true์ด๊ณ  done flag๊ฐ€ unset์ธ ๊ฒƒ๋“ค์˜ ์ง‘ํ•ฉ์œผ๋กœ ํ•˜์ž.

      4. For each fetchRecord์— ๋Œ€ํ•ด inflightRecords์— ๋Œ€ํ•ด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค:

        1. inflightRequest๋ฅผ fetchRecord์˜ request๋กœ ํ•˜์ž.

        2. inflightKeepaliveBytes์— inflightRequest์˜ body์˜ length๋ฅผ ๋”ํ•œ๋‹ค.

      5. ๋งŒ์•ฝ contentLength์™€ inflightKeepaliveBytes์˜ ํ•ฉ์ด 64 kibibytes๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด, network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      ์œ„์˜ ์ œํ•œ์€ ํ™˜๊ฒฝ ์„ค์ • ๊ฐ์ฒด๋ณด๋‹ค ์˜ค๋ž˜ ์œ ์ง€๋  ์ˆ˜ ์žˆ๊ณ  ๋ณธ๋ฌธ์„ ํฌํ•จํ•˜๋Š” ์š”์ฒญ์˜ ํฌ๊ธฐ๊ฐ€ ์ œํ•œ๋˜๋ฉฐ ๋ฌด๊ธฐํ•œ ์œ ์ง€๋˜๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

    11. ๋งŒ์•ฝ httpRequest์˜ referrer๊ฐ€ URL์ด๋ฉด:

      1. referrerValue๋ฅผ httpRequest์˜ referrer์˜ serialized ๋ฐ isomorphic ์ธ์ฝ”๋”ฉ๋œ ๊ฐ’์œผ๋กœ ํ•˜์ž.

      2. Append (`Referer`, referrerValue)์„ httpRequest์˜ header list์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    12. ์š”์ฒญ `Origin` ํ—ค๋” ์ถ”๊ฐ€๋ฅผ httpRequest์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•œ๋‹ค.

    13. Fetch ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํ—ค๋”๋ฅผ httpRequest์— ์ถ”๊ฐ€. [FETCH-METADATA]

    14. ๋งŒ์•ฝ httpRequest์˜ initiator๊ฐ€ "prefetch"์ด๋ฉด, ๊ตฌ์กฐํ™”๋œ ํ•„๋“œ ๊ฐ’์„ ์„ค์ •ํ•˜๊ณ  (`Sec-Purpose`, ํ† ํฐ prefetch)์„ httpRequest์˜ header list์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    15. ๋งŒ์•ฝ httpRequest์˜ header list๊ฐ€ `User-Agent`๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค:

      1. userAgent๋ฅผ httpRequest์˜ client์˜ ํ™˜๊ฒฝ ๊ธฐ๋ณธ `User-Agent` ๊ฐ’๋กœ ํ•˜์ž.

      2. Append (`User-Agent`, userAgent)๋ฅผ httpRequest์˜ header list์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    16. ๋งŒ์•ฝ httpRequest์˜ cache mode๊ฐ€ "default"์ด๊ณ  httpRequest์˜ header list๊ฐ€ `If-Modified-Since`, `If-None-Match`, `If-Unmodified-Since`, `If-Match` ๋˜๋Š” `If-Range` ์ค‘ ํ•˜๋‚˜๋ฅผ ํฌํ•จํ•˜๋ฉด, httpRequest์˜ cache mode๋ฅผ "no-store"๋กœ ์„ค์ •ํ•œ๋‹ค.

    17. ๋งŒ์•ฝ httpRequest์˜ cache mode๊ฐ€ "no-cache"์ด๊ณ , httpRequest์˜ prevent no-cache cache-control header modification flag๊ฐ€ unset์ด๋ฉฐ, httpRequest์˜ header list๊ฐ€ `Cache-Control`๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฉด, append (`Cache-Control`, `max-age=0`)์„ httpRequest์˜ header list์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    18. ๋งŒ์•ฝ httpRequest์˜ cache mode๊ฐ€ "no-store" ๋˜๋Š” "reload"์ด๋ฉด, ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค:

      1. ๋งŒ์•ฝ httpRequest์˜ header list๊ฐ€ `Pragma`๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฉด, append (`Pragma`, `no-cache`)๋ฅผ httpRequest์˜ header list์— ์ถ”๊ฐ€ํ•œ๋‹ค.

      2. ๋งŒ์•ฝ httpRequest์˜ header list๊ฐ€ `Cache-Control`๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฉด, append (`Cache-Control`, `no-cache`)๋ฅผ httpRequest์˜ header list์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    19. ๋งŒ์•ฝ httpRequest์˜ header list๊ฐ€ `Range`๋ฅผ ํฌํ•จํ•˜๋ฉด, append (`Accept-Encoding`, `identity`)๋ฅผ httpRequest์˜ header list์— ์ถ”๊ฐ€ํ•œ๋‹ค.

      ์ด๋Š” ์ธ์ฝ”๋”ฉ๋œ response์˜ ์ผ๋ถ€๋กœ content codings๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‹คํŒจ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

      ๋˜ํ•œ, ๋งŽ์€ ์„œ๋ฒ„๋“ค์ด ๋น„-identity ์ธ์ฝ”๋”ฉ์ด ํ—ˆ์šฉ๋  ๋•Œ ์ž˜๋ชปํ•ด์„œ `Range` ํ—ค๋”๋ฅผ ๋ฌด์‹œํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

    20. HTTP์— ๋”ฐ๋ผ httpRequest ์˜ ํ—ค๋” ๋ฆฌ์ŠคํŠธ ๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. httpRequest ์˜ ํ—ค๋” ๋ฆฌ์ŠคํŠธ ๊ฐ€ ์ฃผ์–ด์ง„ ํ—ค๋” ์˜ ์ด๋ฆ„ ์„ ํฌํ•จํ•˜๋ฉด ํ•ด๋‹น ํ—ค๋” ๋ฅผ ์ถ”๊ฐ€ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

      ์ด ๋ถ€๋ถ„์„ ๋” ๊ทœ๋ฒ”์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค. ํ˜„์žฌ๋กœ์„œ๋Š” `Accept-Encoding`, `Connection`, `DNT`, ๋ฐ `Host` ๊ฐ™์€ ํ—ค๋”๋“ค์€ ํ•„์š”์— ๋”ฐ๋ผ ์ถ”๊ฐ€๋œ๋‹ค.

      `Accept`, `Accept-Charset`, ๋ฐ `Accept-Language`๋Š” ์ด ์‹œ์ ์— ํฌํ•จ๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

      `Accept`์™€ `Accept-Language`๋Š” ์ด๋ฏธ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค (๋‹จ, fetch()๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ›„์ž๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค), ๊ทธ๋ฆฌ๊ณ  `Accept-Charset`์€ ๋ฐ”์ดํŠธ ๋‚ญ๋น„์ด๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ HTTP header layer division๋ฅผ ๋ณด๋ผ.

    21. ๋งŒ์•ฝ includeCredentials๊ฐ€ true์ด๋ฉด, ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค:

      1. ์š”์ฒญ `Cookie` ํ—ค๋” ์ถ”๊ฐ€๋ฅผ httpRequest์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•œ๋‹ค.

      2. ๋งŒ์•ฝ httpRequest์˜ header list๊ฐ€ `Authorization`๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฉด, ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค:

        1. authorizationValue๋ฅผ null๋กœ ๋‘”๋‹ค.

        2. httpRequest์— ๋Œ€ํ•œ authentication entry๊ฐ€ ์กด์žฌํ•˜๊ณ , httpRequest์˜ use-URL-credentials flag๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š๊ฑฐ๋‚˜ httpRequest์˜ current URL์ด credentials๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, authorizationValue๋ฅผ authentication entry๋กœ ์„ค์ •ํ•œ๋‹ค.

        3. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ, httpRequest์˜ current URL์ด credentials๋ฅผ ํฌํ•จํ•˜๊ณ  isAuthenticationFetch๊ฐ€ true์ด๋ฉด, authorizationValue๋ฅผ httpRequest์˜ current URL๋กœ ์„ค์ •ํ•˜๊ณ , `Authorization` ๊ฐ’์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.

        4. authorizationValue๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, append (`Authorization`, authorizationValue)๋ฅผ httpRequest์˜ header list์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    22. ๋งŒ์•ฝ proxy-authentication entry๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ ์ ˆํžˆ ์‚ฌ์šฉํ•œ๋‹ค.

      ์ด๋Š” ์˜๋„์ ์œผ๋กœ httpRequest์˜ credentials mode์— ์˜์กดํ•˜์ง€ ์•Š๋Š”๋‹ค.

    23. request๋กœ WebDriver BiDi ์š”์ฒญ ์ „ ์ „์†ก ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

    24. httpCache๋ฅผ HTTP ์บ์‹œ ํŒŒํ‹ฐ์…˜ ๊ฒฐ์ •์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค, ์ฃผ์–ด์ง„ httpRequest๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ.

    25. ๋งŒ์•ฝ httpCache๊ฐ€ null์ด๋ฉด, httpRequest์˜ cache mode๋ฅผ "no-store"๋กœ ์„ค์ •ํ•œ๋‹ค.

    26. ๋งŒ์•ฝ httpRequest์˜ cache mode๊ฐ€ "no-store"๋„ ์•„๋‹ˆ๊ณ  "reload"๋„ ์•„๋‹ˆ๋ฉด, ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค:

      1. storedResponse๋ฅผ httpCache์—์„œ ์‘๋‹ต์„ ์„ ํƒํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค. ์ด ์„ ํƒ์€ ํ•„์š”ํ•  ๊ฒฝ์šฐ ๊ฒ€์ฆ์„ ์š”๊ตฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, HTTP Caching์˜ "Constructing Responses from Caches" ์žฅ์„ ๋”ฐ๋ฅธ๋‹ค. [HTTP-CACHING]

        HTTP์— ์˜ํ•ด `Vary` ํ—ค๋”๋ฅผ ๊ณ ๋ คํ•œ๋‹ค.

      2. ๋งŒ์•ฝ storedResponse๊ฐ€ non-null์ด๋ฉด, ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค:

        1. ๋งŒ์•ฝ cache mode๊ฐ€ "default"์ด๊ณ , storedResponse๊ฐ€ stale-while-revalidate response์ด๋ฉฐ httpRequest์˜ client๊ฐ€ non-null์ด๋ฉด:

          1. response๋ฅผ storedResponse๋กœ ์„ค์ •ํ•œ๋‹ค.

          2. response์˜ cache state๋ฅผ "local"๋กœ ์„ค์ •ํ•œ๋‹ค.

          3. revalidateRequest๋ฅผ request์˜ clone์œผ๋กœ ํ•˜์ž.

          4. revalidateRequest์˜ cache mode๋ฅผ "no-cache"๋กœ ์„ค์ •ํ•œ๋‹ค.

          5. revalidateRequest์˜ prevent no-cache cache-control header modification flag์„ ์„ค์ •ํ•œ๋‹ค.

          6. revalidateRequest์˜ service-workers mode๋ฅผ "none"๋กœ ์„ค์ •ํ•œ๋‹ค.

          7. In parallel๋กœ, ์ƒˆ๋กœ์šด fetch params์„ ์‚ฌ์šฉํ•˜์—ฌ main fetch๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ๊ทธ ์ƒˆ fetch params์˜ request๋Š” revalidateRequest์ด๋‹ค.

            ์ด fetch๋Š” ๋‹จ์ง€ httpCache์˜ ์ƒํƒœ๋ฅผ ๊ฐฑ์‹ ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋ฉฐ, ๊ทธ ์‘๋‹ต์€ ๋˜ ๋‹ค๋ฅธ ์บ์‹œ ์ ‘๊ทผ๊นŒ์ง€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค. ์˜ค๋ž˜๋œ ์‘๋‹ต์€ ํ˜„์žฌ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ์ด fetch๋Š” ํด๋ผ์ด์–ธํŠธ ๋ฌธ๋งฅ์—์„œ ๋ฐœํ–‰๋˜๋ฏ€๋กœ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ฌ๋ผ์ง€๋ฉด ์š”์ฒญ์€ ์ข…๋ฃŒ๋œ๋‹ค.

        2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด:

          1. ๋งŒ์•ฝ storedResponse๊ฐ€ stale response์ด๋ฉด, revalidatingFlag๋ฅผ ์„ค์ •ํ•œ๋‹ค.

          2. ๋งŒ์•ฝ revalidatingFlag๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๊ณ  httpRequest์˜ cache mode๊ฐ€ "force-cache"๋„ ์•„๋‹ˆ๊ณ  "only-if-cached"๋„ ์•„๋‹ˆ๋ฉด:

            1. ๋งŒ์•ฝ storedResponse์˜ header list๊ฐ€ `ETag`๋ฅผ ํฌํ•จํ•˜๋ฉด, append (`If-None-Match`, `ETag`์˜ value)๋ฅผ httpRequest์˜ header list์— ์ถ”๊ฐ€ํ•œ๋‹ค.

            2. ๋งŒ์•ฝ storedResponse์˜ header list๊ฐ€ `Last-Modified`๋ฅผ ํฌํ•จํ•˜๋ฉด, append (`If-Modified-Since`, `Last-Modified`์˜ value)๋ฅผ httpRequest์˜ header list์— ์ถ”๊ฐ€ํ•œ๋‹ค.

            ๋˜ํ•œ HTTP Caching์˜ "Sending a Validation Request" ์žฅ์„ ๋ณด๋ผ. [HTTP-CACHING]

          3. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด response๋ฅผ storedResponse๋กœ ์„ค์ •ํ•˜๊ณ , response์˜ cache state๋ฅผ "local"๋กœ ์„ค์ •ํ•œ๋‹ค.

  9. If aborted์ด๋ฉด, fetchParams์— ๋Œ€ํ•œ ์ ์ ˆํ•œ network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  10. ๋งŒ์•ฝ response๊ฐ€ null์ด ์•„๋‹ˆ๋ผ๋ฉด, request์™€ response๋กœ WebDriver BiDi ์‘๋‹ต ์‹œ์ž‘ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

  11. ๋งŒ์•ฝ response๊ฐ€ null์ด๋ฉด, ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค:

    1. ๋งŒ์•ฝ httpRequest์˜ cache mode๊ฐ€ "only-if-cached"์ด๋ฉด, network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    2. forwardResponse๋ฅผ HTTP-network fetch๋ฅผ httpFetchParams, includeCredentials, ๋ฐ isNewConnectionFetch๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ํ•˜์ž.

    3. ๋งŒ์•ฝ httpRequest์˜ method๊ฐ€ unsafe์ด๊ณ , forwardResponse์˜ status๊ฐ€ 200์—์„œ 399 ์‚ฌ์ด(ํฌํ•จ)์ด๋ฉด, ์ ์ ˆํ•œ httpCache์˜ ์ €์žฅ๋œ ์‘๋‹ต๋“ค์„ ๋ฌดํšจํ™”(invalidate)ํ•˜๊ณ , storedResponse๋ฅผ null๋กœ ์„ค์ •ํ•œ๋‹ค. ์ด๋Š” HTTP Caching์˜ "Invalidating Stored Responses" ์žฅ์„ ๋”ฐ๋ฅธ๋‹ค. [HTTP-CACHING]

    4. ๋งŒ์•ฝ revalidatingFlag๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๊ณ  forwardResponse์˜ status๊ฐ€ 304์ด๋ฉด:

      1. forwardResponse์˜ header list๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ storedResponse์˜ header list๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค. ์ด๋Š” HTTP Caching์˜ "Freshening Stored Responses upon Validation" ์žฅ์„ ๋”ฐ๋ฅธ๋‹ค. [HTTP-CACHING]

        ์ด๋Š” ์บ์‹œ์— ์ €์žฅ๋œ ์‘๋‹ต๋„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

      2. response๋ฅผ storedResponse๋กœ ์„ค์ •ํ•œ๋‹ค.

      3. response์˜ cache state๋ฅผ "validated"๋กœ ์„ค์ •ํ•œ๋‹ค.

    5. ๋งŒ์•ฝ response๊ฐ€ null์ด๋ฉด, ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค:

      1. response๋ฅผ forwardResponse๋กœ ์„ค์ •ํ•œ๋‹ค.

      2. httpRequest์™€ forwardResponse๋ฅผ httpCache์— ์ €์žฅํ•œ๋‹ค. ์ด๋Š” HTTP Caching์˜ "Storing Responses in Caches" ์žฅ์„ ๋”ฐ๋ฅธ๋‹ค. [HTTP-CACHING]

        ๋งŒ์•ฝ forwardResponse๊ฐ€ network error์ด๋ฉด, ์ด๋Š” ์‚ฌ์‹ค์ƒ ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜๋ฅผ ์บ์‹œํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ๋•Œ๋•Œ๋กœ "negative caching"์œผ๋กœ ์•Œ๋ ค์ง„ ๋™์ž‘์„ ํ•œ๋‹ค.

        ๊ด€๋ จ๋œ body info๋Š” ์‘๋‹ต๊ณผ ํ•จ๊ป˜ ์บ์‹œ์— ์ €์žฅ๋œ๋‹ค.

  12. response์˜ URL list๋ฅผ cloneํ•œ httpRequest์˜ URL list๋กœ ์„ค์ •ํ•œ๋‹ค.

  13. ๋งŒ์•ฝ httpRequest์˜ header list๊ฐ€ `Range`๋ฅผ ํฌํ•จํ•˜๋ฉด, response์˜ range-requested flag๋ฅผ ์„ค์ •ํ•œ๋‹ค.

  14. response์˜ request-includes-credentials๋ฅผ includeCredentials๋กœ ์„ค์ •ํ•œ๋‹ค.

  15. ๋งŒ์•ฝ response์˜ status๊ฐ€ 401์ด๊ณ , httpRequest์˜ response tainting์ด "cors"๊ฐ€ ์•„๋‹ˆ๋ฉฐ, includeCredentials๊ฐ€ true์ด๊ณ , request์˜ traversable for user prompts๊ฐ€ traversable navigable์ด๋ฉด:

    1. ํ…Œ์ŠคํŠธ ํ•„์š”: ์—ฌ๋Ÿฌ `WWW-Authenticate` ํ—ค๋”, ๋ˆ„๋ฝ, ํŒŒ์‹ฑ ๋ฌธ์ œ.

    2. ๋งŒ์•ฝ request์˜ body๊ฐ€ non-null์ด๋ฉด, ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค:

      1. ๋งŒ์•ฝ request์˜ body์˜ source๊ฐ€ null์ด๋ฉด, network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      2. request์˜ body๋ฅผ body๋กœ ์„ค์ •ํ•œ๋‹ค. ์ด๋•Œ ๊ทธ ๊ฐ’์€ ์•ˆ์ „ํ•˜๊ฒŒ ์ถ”์ถœํ•œ request์˜ body์˜ source์—์„œ ์–ป๋Š”๋‹ค.

    3. ๋งŒ์•ฝ request์˜ use-URL-credentials flag๊ฐ€ unset์ด๊ฑฐ๋‚˜ isAuthenticationFetch๊ฐ€ true์ด๋ฉด, ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค:

      1. ๋งŒ์•ฝ fetchParams๊ฐ€ canceled์ด๋ฉด, fetchParams์— ๋Œ€ํ•œ appropriate network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      2. username๊ณผ password๋ฅผ ์—”๋“œ ์œ ์ €์—๊ฒŒ request์˜ traversable for user prompts์—์„œ ๊ฐ๊ฐ ๋ฌผ์–ด๋ณธ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•˜์ž.

      3. Set the username๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ request์˜ current URL๊ณผ username์„ ์„ค์ •ํ•œ๋‹ค.

      4. Set the password๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ request์˜ current URL๊ณผ password๋ฅผ ์„ค์ •ํ•œ๋‹ค.

    4. response๋ฅผ HTTP-network-or-cache fetch๋ฅผ fetchParams์™€ true๋ฅผ ์ฃผ์–ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  16. ๋งŒ์•ฝ response์˜ status๊ฐ€ 407์ด๋ฉด, ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค:

    1. ๋งŒ์•ฝ request์˜ traversable for user prompts๊ฐ€ "no-traversable"์ด๋ฉด, network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    2. ํ…Œ์ŠคํŠธ ํ•„์š”: ์—ฌ๋Ÿฌ `Proxy-Authenticate` ํ—ค๋”, ๋ˆ„๋ฝ, ํŒŒ์‹ฑ ๋ฌธ์ œ.

    3. ๋งŒ์•ฝ fetchParams๊ฐ€ canceled์ด๋ฉด, fetchParams์— ๋Œ€ํ•œ appropriate network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    4. request์˜ traversable for user prompts์—์„œ ์ ์ ˆํžˆ ์—”๋“œ ์œ ์ €๋ฅผ ํ”„๋กฌํ”„ํŠธํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ proxy-authentication entry๋กœ ์ €์žฅํ•œ๋‹ค. [HTTP]

      ํ”„๋ก์‹œ ์ธ์ฆ์— ๊ด€ํ•œ ๋‚˜๋จธ์ง€ ์„ธ๋ถ€์‚ฌํ•ญ์€ HTTP์—์„œ ์ •์˜๋œ๋‹ค.

    5. response๋ฅผ HTTP-network-or-cache fetch๋ฅผ fetchParams๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  17. ๋‹ค์Œ์ด ๋ชจ๋‘ ์ฐธ์ด๋ฉด

    • response์˜ status๊ฐ€ 421์ธ ๊ฒฝ์šฐ

    • isNewConnectionFetch๊ฐ€ false์ธ ๊ฒฝ์šฐ

    • request์˜ body๊ฐ€ null์ด๊ฑฐ๋‚˜, ๋˜๋Š” request์˜ body๊ฐ€ non-null์ด๊ณ  request ์˜ body ์˜source๊ฐ€ non-null์ธ ๊ฒฝ์šฐ

    ๊ทธ๋Ÿฌ๋ฉด:

    1. ๋งŒ์•ฝ fetchParams๊ฐ€ canceled์ด๋ฉด, fetchParams์— ๋Œ€ํ•œ appropriate network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    2. response๋ฅผ HTTP-network-or-cache fetch๋ฅผ fetchParams, isAuthenticationFetch, ๋ฐ true๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  18. ๋งŒ์•ฝ isAuthenticationFetch๊ฐ€ true์ด๋ฉด, request์™€ ์ฃผ์–ด์ง„ realm์— ๋Œ€ํ•œ authentication entry๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

  19. response๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ response์˜ body์˜ stream์€ ๋ฐ˜ํ™˜ ํ›„์—๋„ ๊ณ„์†ํ•ด์„œ ํ์— ๋“ค์–ด์˜จ๋‹ค.

4.7. HTTP-๋„คํŠธ์›Œํฌ fetch

HTTP-๋„คํŠธ์›Œํฌ fetch๋Š” fetch params fetchParams, ์„ ํƒ์  boolean includeCredentials (๊ธฐ๋ณธ๊ฐ’ false), ์„ ํƒ์  boolean forceNewConnection (๊ธฐ๋ณธ๊ฐ’ false)๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค:

  1. request๋ฅผ fetchParams์˜ request๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. ๋งŒ์•ฝ request์˜ client๊ฐ€ ์˜คํ”„๋ผ์ธ ์ƒํƒœ๋ผ๋ฉด, ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. response๋ฅผ null๋กœ ์„ค์ •ํ•œ๋‹ค.

  4. timingInfo๋ฅผ fetchParams์˜ timing info๋กœ ์„ค์ •ํ•œ๋‹ค.

  5. networkPartitionKey๋ฅผ ๋„คํŠธ์›Œํฌ ํŒŒํ‹ฐ์…˜ ํ‚ค ๊ฒฐ์ •ํ•˜๊ธฐ๋ฅผ request์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  6. newConnection์„ forceNewConnection์ด true์ด๋ฉด "yes", ์•„๋‹ˆ๋ฉด "no"๋กœ ์„ค์ •ํ•œ๋‹ค.

  7. request์˜ mode์— ๋”ฐ๋ผ ๋ถ„๊ธฐํ•œ๋‹ค:

    "websocket"

    connection์„ WebSocket ์—ฐ๊ฒฐ ํš๋“์„ request์˜ current URL์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    "webtransport"

    connection์„ WebTransport ์—ฐ๊ฒฐ์„ ํš๋“ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•˜๋ฉฐ, ์ด๋•Œ networkPartitionKey์™€ request๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

    ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ

    connection์„ ์—ฐ๊ฒฐ ํš๋“์„ networkPartitionKey, request์˜ current URL, includeCredentials, newConnection์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  8. ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•˜๋˜, abort when fetchParams๊ฐ€ ์ทจ์†Œ๋จ์ด๋ฉด ์ค‘๋‹จํ•œ๋‹ค:

    1. connection์ด ์‹คํŒจ์ด๋ฉด network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    2. timingInfo์˜ ์ตœ์ข… ์—ฐ๊ฒฐ ํƒ€์ด๋ฐ ์ •๋ณด๋ฅผ ์—ฐ๊ฒฐ ํƒ€์ด๋ฐ ์ •๋ณด ํด๋žจํ”„ ๋ฐ ์กฐ์ •ํ•˜๊ธฐ๋ฅผ connection์˜ ํƒ€์ด๋ฐ ์ •๋ณด, timingInfo์˜ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ํ›„ ์‹œ์ž‘ ์‹œ๊ฐ„, fetchParams์˜ cross-origin ๊ฒฉ๋ฆฌ ๊ธฐ๋Šฅ์œผ๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    3. connection์ด HTTP/1.x ์—ฐ๊ฒฐ์ด๊ณ  request์˜ body๊ฐ€ null์ด ์•„๋‹ˆ๋ฉฐ request์˜ body์˜ source๊ฐ€ null์ด๋ฉด network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    4. timingInfo์˜ ์ตœ์ข… ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์‹œ์ž‘ ์‹œ๊ฐ„์„ ๊ณต์œ  ํ˜„์žฌ ์‹œ๊ฐ„(์กฐ์ •๋จ)์„ fetchParams์˜ cross-origin ๊ฒฉ๋ฆฌ ๊ธฐ๋Šฅ์œผ๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    5. response๋ฅผ connection์—์„œ request๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ HTTP ์š”์ฒญ์„ ๋งŒ๋“ค์–ด ์–ป์€ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•˜๋˜, ๋‹ค์Œ ์ฃผ์˜์‚ฌํ•ญ์„ ๋”ฐ๋ฅธ๋‹ค:

      • HTTP์˜ ๊ด€๋ จ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋”ฐ๋ฅธ๋‹ค. [HTTP] [HTTP-CACHING]

      • request์˜ body๊ฐ€ null์ด ์•„๋‹ˆ๊ณ  request์˜ body์˜ source๊ฐ€ null์ด๋ฉด, ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ์ตœ๋Œ€ 64ํ‚ค๋น„๋ฐ”์ดํŠธ์˜ ๋ฒ„ํผ๋ฅผ ๊ฐ€์ง€๊ณ  request์˜ body์˜ ์ผ๋ถ€๋ฅผ ๊ทธ ๋ฒ„ํผ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ๊ทธ ๋ฒ„ํผ ํฌ๊ธฐ๋ฅผ ์ดˆ๊ณผํ•ด์„œ request์˜ body๋ฅผ ์ฝ์–ด์•ผ ํ•˜๊ณ , ์š”์ฒญ์„ ์žฌ์ „์†กํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ๋Œ€์‹  network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

        ์˜ˆ๋ฅผ ๋“ค๋ฉด ์—ฐ๊ฒฐ์ด ํƒ€์ž„์•„์›ƒ๋œ ๊ฒฝ์šฐ ์žฌ์ „์†ก์ด ํ•„์š”ํ•˜๋‹ค.

        request์˜ body์˜ source๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, request์˜ body๋ฅผ ์žฌ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฒ„ํผ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค.

        request์˜ body์˜ source๊ฐ€ null์ธ ๊ฒฝ์šฐ, body๊ฐ€ ReadableStream ๊ฐ์ฒด์—์„œ ์ƒ์„ฑ๋œ ๊ฒƒ์ด๋ฏ€๋กœ, body๋ฅผ ์žฌ์ƒ์„ฑํ•  ์ˆ˜ ์—†์–ด ๋ฒ„ํผ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

      • ๋‹ค์Œ์ด ์ฐธ์ผ ๋™์•ˆ:

        1. timingInfo์˜ final network-response start time์„ fetchParams์˜ cross-origin isolated capability๋กœ coarsened shared current time์„ ๊ตฌํ•ด ์„ค์ •ํ•œ๋‹ค. ์ด ๋™์ž‘์€ user agent์˜ HTTP ํŒŒ์„œ๊ฐ€ ์‘๋‹ต์˜ ์ฒซ ๋ฐ”์ดํŠธ(์˜ˆ: HTTP/2๋Š” frame header ๋ฐ”์ดํŠธ, HTTP/1.x๋Š” status line)๋ฅผ ์ˆ˜์‹ ํ•˜์ž๋งˆ์ž ์ฆ‰์‹œ ์ด๋ค„์ง„๋‹ค.

        2. ๋ชจ๋“  HTTP ์‘๋‹ต ํ—ค๋”๊ฐ€ ์ „์†ก๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•œ๋‹ค.

        3. request์™€ response๋กœ WebDriver BiDi ์‘๋‹ต ์‹œ์ž‘ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

        4. status์— HTTP ์‘๋‹ต์˜ status code๋ฅผ ์ €์žฅํ•œ๋‹ค.

        5. status๊ฐ€ 100 ์ด์ƒ 199 ์ดํ•˜๋ผ๋ฉด:

          1. ๋งŒ์•ฝ timingInfo์˜ first interim network-response start time์ด 0์ด๋ผ๋ฉด, timingInfo์˜ first interim network-response start time์„ timingInfo์˜ final network-response start time์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

          2. ๋งŒ์•ฝ request์˜ mode๊ฐ€ "websocket"์ด๊ณ , status๊ฐ€ 101์ด๋ผ๋ฉด, breakํ•œ๋‹ค.

          3. ๋งŒ์•ฝ status๊ฐ€ 103์ด๊ณ , fetchParams์˜ process early hints response๊ฐ€ null์ด ์•„๋‹ˆ๋ผ๋ฉด, fetchParams์˜ process early hints response๋ฅผ fetch task๋กœ ํ์ž‰ํ•œ๋‹ค(๋‹จ, response ์‚ฌ์šฉ).

          4. ๊ณ„์†.

          ์ด ํƒ€์ž…์˜ HTTP ์‘๋‹ต๋“ค์€ ๊ฒฐ๊ตญ "์ตœ์ข…" HTTP ์‘๋‹ต์ด ๋”ฐ๋ฅด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

        6. break.

      Fetch์™€ HTTP์˜ ์ •ํ™•ํ•œ ๊ณ„์ธตํ™”๋Š” ์•„์ง ์ •๋ฆฌ๋  ํ•„์š”๊ฐ€ ์žˆ์œผ๋ฉฐ, ์—ฌ๊ธฐ์„œ response๋Š” response์™€ HTTP ์‘๋‹ต์„ ๋ชจ๋‘ ์˜๋ฏธํ•œ๋‹ค.

      HTTP ์š”์ฒญ์œผ๋กœ ์ธํ•ด TLS ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ ๋‹ค์ด์–ผ๋กœ๊ทธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด:

      1. request์˜ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์œ„ํ•œ ํƒ์ƒ‰ ๊ฐ€๋Šฅ๊ฐ€ ํƒ์ƒ‰ ๊ฐ€๋Šฅ ๊ฐ์ฒด๋ผ๋ฉด, ๊ทธ ๋Œ€ํ™” ์ƒ์ž๋ฅผ request์˜ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์œ„ํ•œ ํƒ์ƒ‰ ๊ฐ€๋Šฅ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

      2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      request์˜ body body๋ฅผ ์ „์†กํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค:

      1. body๊ฐ€ null์ด๊ณ  fetchParams์˜ process request end-of-body๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, fetch task ํ์ž‰์„ fetchParams์˜ process request end-of-body์™€ fetchParams์˜ task destination์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค.

      2. ๊ทธ๋ ‡์ง€ ์•Š๊ณ  body๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด:

        1. processBodyChunk๋ฅผ bytes๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ •์˜ํ•œ๋‹ค:

          1. fetchParams๊ฐ€ ์ทจ์†Œ๋จ์ด๋ฉด ์ด ๋‹จ๊ณ„๋ฅผ ์ค‘๋‹จํ•œ๋‹ค.

          2. ๋ณ‘๋ ฌ๋กœ bytes๋ฅผ ์ „์†กํ•œ๋‹ค.

          3. fetchParams์˜ process request body chunk length๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, fetchParams์˜ process request body chunk length๋ฅผ bytes์˜ ๊ธธ์ด๋กœ ์‹คํ–‰ํ•œ๋‹ค.

        2. processEndOfBody๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ •์˜ํ•œ๋‹ค:

          1. fetchParams๊ฐ€ ์ทจ์†Œ๋จ์ด๋ฉด ์ด ๋‹จ๊ณ„๋ฅผ ์ค‘๋‹จํ•œ๋‹ค.

          2. fetchParams์˜ process request end-of-body๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, fetchParams์˜ process request end-of-body๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

        3. processBodyError๋ฅผ e๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ •์˜ํ•œ๋‹ค:

          1. fetchParams๊ฐ€ ์ทจ์†Œ๋จ์ด๋ฉด ์ด ๋‹จ๊ณ„๋ฅผ ์ค‘๋‹จํ•œ๋‹ค.

          2. e๊ฐ€ "AbortError" DOMException์ด๋ฉด ์ปจํŠธ๋กค๋Ÿฌ ์ค‘๋‹จ์„ fetchParams์˜ controller์— ์‹คํ–‰ํ•œ๋‹ค.

          3. ๊ทธ ์™ธ์—๋Š” ์ปจํŠธ๋กค๋Ÿฌ ์ข…๋ฃŒ๋ฅผ fetchParams์˜ controller์— ์‹คํ–‰ํ•œ๋‹ค.

        4. body ์ ์ง„์  ์ฝ๊ธฐ๋ฅผ request์˜ body, processBodyChunk, processEndOfBody, processBodyError, fetchParams์˜ task destination์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค.

  9. ์ค‘๋‹จ๋œ ๊ฒฝ์šฐ:

    1. connection์ด HTTP/2๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด RST_STREAM ํ”„๋ ˆ์ž„์„ ์ „์†กํ•œ๋‹ค.

    2. fetchParams์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  10. buffer๋ฅผ ๋นˆ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๋กœ ์„ค์ •ํ•œ๋‹ค.

    ์ด๋Š” ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ์˜ ๋„คํŠธ์›Œํฌ ๊ณ„์ธต ๋‚ด๋ถ€ ๋ฒ„ํผ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

  11. stream์„ ์ƒˆ๋กœ์šด ReadableStream์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  12. pullAlgorithm์„ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์ •์˜ํ•œ๋‹ค:

    1. promise๋ฅผ ์ƒˆ๋กœ์šด promise๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•œ๋‹ค:

      1. buffer์˜ ํฌ๊ธฐ๊ฐ€ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๊ฐ€ ์„ ํƒํ•œ ํ•˜ํ•œ๋ณด๋‹ค ์ž‘๊ณ  ์ง„ํ–‰ ์ค‘์ธ fetch๊ฐ€ ์ค‘๋‹จ๋จ์ด๋ผ๋ฉด, fetch ์žฌ๊ฐœ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

      2. buffer๊ฐ€ ๋น„์–ด ์žˆ์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•œ๋‹ค.

      3. fetch task ํ์ž‰์„ ์‹คํ–‰ํ•˜์—ฌ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ fetchParams์˜ task destination์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค.

        1. bytes์—์„œ pull์„ buffer์—์„œ stream์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค.

        2. stream์ด errored ์ƒํƒœ์ด๋ฉด ์ปจํŠธ๋กค๋Ÿฌ ์ข…๋ฃŒ๋ฅผ fetchParams์˜ controller์— ์‹คํ–‰ํ•œ๋‹ค.

        3. resolve promise๋ฅผ undefined๋กœ ์‹คํ–‰ํ•œ๋‹ค.

    3. promise๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  13. cancelAlgorithm์„ reason์„ ์ž…๋ ฅ๋ฐ›์•„ ์ปจํŠธ๋กค๋Ÿฌ ์ค‘๋‹จ์„ fetchParams์˜ controller์— reason๊ณผ ํ•จ๊ป˜ ์‹คํ–‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  14. byte ์ฝ๊ธฐ ์ง€์›์œผ๋กœ stream ์„ค์ •์„ stream์— ๋Œ€ํ•ด ์‹คํ–‰ํ•˜๋˜, pullAlgorithm์„ pullAlgorithm์œผ๋กœ, cancelAlgorithm์„ cancelAlgorithm์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  15. response์˜ body๋ฅผ body๋กœ ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ , stream์„ stream์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  16. request์™€ response๋กœ WebDriver BiDi ๋„คํŠธ์›Œํฌ ์‘๋‹ต ๋ณธ๋ฌธ ๋ณต์ œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

  17. (This is a tracking vector.) includeCredentials๊ฐ€ true์ด๋ฉด, ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ์‘๋‹ต Set-Cookie ํ—ค๋” ํŒŒ์‹ฑ ๋ฐ ์ €์žฅ์„ request์™€ response๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

  18. ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•œ๋‹ค:

    1. ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ abort when fetchParams๊ฐ€ ์ทจ์†Œ๋จ์ด๋ฉด ์ค‘๋‹จํ•œ๋‹ค:

      1. ๋‹ค์Œ์ด ์ฐธ์ผ ๋™์•ˆ:

        1. response์˜ ๋ฉ”์‹œ์ง€ body์—์„œ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฐ”์ดํŠธ๊ฐ€ ์ „์†ก๋˜์—ˆ๋‹ค๋ฉด:

          1. bytes๋ฅผ ์ „์†ก๋œ ๋ฐ”์ดํŠธ๋กœ ์„ค์ •ํ•œ๋‹ค.

          2. codings๋ฅผ ํ—ค๋” ๋ฆฌ์ŠคํŠธ ๊ฐ’ ์ถ”์ถœ์„ `Content-Encoding`๊ณผ response์˜ header list์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

          3. filteredCoding์„ "@unknown"์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

          4. codings๊ฐ€ null ๋˜๋Š” ์‹คํŒจ์ด๋ฉด filteredCoding์„ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•œ๋‹ค.

          5. ๊ทธ ์™ธ์— codings์˜ size๊ฐ€ 1๋ณด๋‹ค ํฌ๋ฉด filteredCoding์„ "multiple"๋กœ ์„ค์ •ํ•œ๋‹ค.

          6. ๊ทธ ์™ธ์— codings[0]์ด ๋นˆ ๋ฌธ์ž์—ด์ด๊ฑฐ๋‚˜, ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๊ฐ€ ์ง€์›ํ•˜๊ณ , ๋ฐ”์ดํŠธ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์—†์ด HTTP Content Coding Registry์— ํฌํ•จ๋œ ์—”ํŠธ๋ฆฌ์™€ ์ผ์น˜ํ•˜๋ฉด, filteredCoding์„ ๋ฐ”์ดํŠธ ์†Œ๋ฌธ์žํ™” codings[0]์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. [IANA-HTTP-PARAMS]

          7. response์˜ body info์˜ content encoding์„ filteredCoding์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

          8. response์˜ body info์˜ encoded size๋ฅผ bytes์˜ ๊ธธ์ด๋งŒํผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

          9. bytes๋ฅผ ์ฝ˜ํ…์ธ  ์ฝ”๋”ฉ ์ฒ˜๋ฆฌ๋ฅผ codings๊ณผ bytes๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

            ์ด๋กœ ์ธํ•ด `Content-Length` ํ—ค๋”์˜ ์‹ ๋ขฐ์„ฑ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค.

          10. response์˜ body info์˜ decoded size๋ฅผ bytes์˜ ๊ธธ์ด๋งŒํผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

          11. bytes๊ฐ€ ์‹คํŒจ์ด๋ฉด ์ปจํŠธ๋กค๋Ÿฌ ์ข…๋ฃŒ๋ฅผ fetchParams์˜ controller์— ์‹คํ–‰ํ•œ๋‹ค.

          12. bytes๋ฅผ buffer์— ์ถ”๊ฐ€ํ•œ๋‹ค.

          13. buffer์˜ ํฌ๊ธฐ๊ฐ€ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๊ฐ€ ์„ ํƒํ•œ ์ƒํ•œ๋ณด๋‹ค ํฌ๋ฉด, ์ง„ํ–‰ ์ค‘์ธ fetch๋ฅผ ์ค‘๋‹จํ•˜๋„๋ก ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ์— ์š”์ฒญํ•œ๋‹ค.

        2. ๊ทธ ์™ธ์— response์˜ ๋ฉ”์‹œ์ง€ body ๋ฐ”์ดํŠธ ์ „์†ก์ด ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋˜๊ณ  stream์ด readable์ด๋ฉด, stream ๋‹ซ๊ธฐ๋ฅผ stream์— ์‹คํ–‰ํ•˜๊ณ  ๋ณ‘๋ ฌ ์‹คํ–‰ ๋‹จ๊ณ„๋ฅผ ์ค‘๋‹จํ•œ๋‹ค.

    2. ์ค‘๋‹จ๋œ ๊ฒฝ์šฐ:

      1. fetchParams๊ฐ€ aborted์ด๋ฉด:

        1. response์˜ aborted flag๋ฅผ ์„ค์ •ํ•œ๋‹ค.

        2. stream์ด readable์ด๋ฉด, stream error๋ฅผ stream์— ์‹คํ–‰ํ•˜๊ณ , ์ค‘๋‹จ ์ด์œ  ์—ญ์ง๋ ฌํ™”๋ฅผ fetchParams์˜ controller์˜ serialized abort reason๊ณผ ๊ตฌํ˜„ ์ •์˜ realm์œผ๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์‹คํ–‰ํ•œ๋‹ค.

      2. ๊ทธ ์™ธ์— stream์ด readable์ด๋ฉด, stream error๋ฅผ stream์— TypeError๋กœ ์‹คํ–‰ํ•œ๋‹ค.

      3. connection์ด HTTP/2๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด RST_STREAM ํ”„๋ ˆ์ž„์„ ์ „์†กํ•œ๋‹ค.

      4. ๊ทธ ์™ธ์—๋Š”, ๋‹ค์Œ fetch์— ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ์—†๋‹ค๋ฉด ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๊ฐ€ connection์„ ๋‹ซ์•„์•ผ ํ•œ๋‹ค.

        ์˜ˆ๋ฅผ ๋“ค์–ด, ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์—ฐ๊ฒฐ์—์„œ ๋ช‡ ๋ฐ”์ดํŠธ๋งŒ ๋‚จ์•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ๋‹ซ์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋” ์ข‹์„ ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์—ฐ๊ฒฐ์„ ๋‹ซ๊ณ  ๋‹ค์Œ fetch์—์„œ ํ•ธ๋“œ์…ฐ์ดํฌ๋ฅผ ๋‹ค์‹œ ํ•˜๋Š” ๊ฒƒ์ด ์˜คํžˆ๋ ค ๋” ๋‚˜์  ์ˆ˜ ์žˆ๋‹ค.

    ์ด ๋‹จ๊ณ„๋Š” ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰๋˜๋ฉฐ, ์ด ์‹œ์ ์—์„œ๋Š” response์˜ body๊ฐ€ ๊ด€๋ จ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค(response๊ฐ€ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ์ผ ์ˆ˜ ์žˆ์Œ).

  19. response๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ response์˜ body์˜ stream์€ ๋ฐ˜ํ™˜ ํ›„์—๋„ ๊ณ„์† enqueue๋œ๋‹ค.

4.8. CORS-ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ fetch

์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ CORS ํ”„๋กœํ† ์ฝœ์„ ์ดํ•ดํ•˜๋Š”์ง€ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๊ฐ€ ํ™•์ธํ•˜๋Š” ๊ตฌํ˜„์ด๋‹ค. ์ด๋ฅธ๋ฐ” CORS-ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ ์š”์ฒญ์ด๋‹ค. ์„ฑ๊ณตํ•˜๋ฉด CORS-ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ ์บ์‹œ๋ฅผ ์ฑ„์›Œ ์ด๋Ÿฐ fetch์˜ ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•œ๋‹ค.

์š”์ฒญ request๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ CORS-preflight fetchํ•˜๋ ค๋ฉด, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค:

  1. preflight๋ฅผ ์ƒˆ ์š”์ฒญ์œผ๋กœ ๋‘๋ฉฐ, ๊ทธ method๋Š” `OPTIONS`, URL list๋Š” request์˜ URL list์˜ clone, initiator๋Š” request์˜ initiator, destination์€ request์˜ destination, origin์€ request์˜ origin, referrer๋Š” request์˜ referrer, referrer policy๋Š” request์˜ referrer policy, mode๋Š” "cors", response tainting์€ "cors", ๊ทธ๋ฆฌ๊ณ  WebDriver id๋Š” request์˜ WebDriver id์ธ ๊ฒƒ์ด๋‹ค.

    preflight์˜ service-workers mode๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ HTTP fetch๊ฐ€ ์•„๋‹ˆ๋ผ HTTP-network-or-cache fetch๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  2. (`Accept`, `*/*`)๋ฅผ preflight์˜ header list์— ๋ง๋ถ™์ธ๋‹ค.

  3. (`Access-Control-Request-Method`, request์˜ method)๋ฅผ preflight์˜ header list์— ๋ง๋ถ™์ธ๋‹ค.

  4. headers๋ฅผ request์˜ header list์™€ ํ•จ๊ป˜ํ•œ CORS-unsafe request-header names๋กœ ๋‘”๋‹ค.

  5. headers๊ฐ€ ๋น„์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด:

    1. value๋ฅผ headers์˜ ํ•ญ๋ชฉ๋“ค์„ ์„œ๋กœ `,`๋กœ ๊ตฌ๋ถ„ํ•œ ๊ฒƒ์œผ๋กœ ๋‘”๋‹ค.

    2. (`Access-Control-Request-Headers`, value)๋ฅผ preflight์˜ header list์— ๋ง๋ถ™์ธ๋‹ค.

    ์ด๋Š” ์˜๋„์ ์œผ๋กœ combine์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ข‹๋“  ๋‚˜์˜๋“  0x2C ๋’ค์— 0x20์ด ์˜ค๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  6. response๋ฅผ, ๊ทธ request๊ฐ€ preflight์ธ ์ƒˆ fetch params๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ HTTP-network-or-cache fetch๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  7. request์™€ response์— ๋Œ€ํ•œ CORS check๊ฐ€ success๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  response์˜ status๊ฐ€ ok status์ด๋ฉด:

    CORS check๋Š” preflight๊ฐ€ ์•„๋‹ˆ๋ผ request์— ๋Œ€ํ•ด ์ˆ˜ํ–‰๋œ๋‹ค. ์ด๋Š” ์˜ฌ๋ฐ”๋ฅธ credentials mode๊ฐ€ ์‚ฌ์šฉ๋˜๋„๋ก ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค.

    1. methods๋ฅผ `Access-Control-Allow-Methods`์™€ response์˜ header list๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ header list values๋ฅผ ์ถ”์ถœํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

    2. headerNames๋ฅผ `Access-Control-Allow-Headers`์™€ response์˜ header list๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ header list values๋ฅผ ์ถ”์ถœํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

    3. methods ๋˜๋Š” headerNames ์ค‘ ํ•˜๋‚˜๊ฐ€ failure์ด๋ฉด, network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    4. methods๊ฐ€ null์ด๊ณ  request์˜ use-CORS-preflight flag๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด, methods๋ฅผ request์˜ method๋ฅผ ํฌํ•จํ•˜๋Š” ์ƒˆ ๋ชฉ๋ก์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

      ์ด๋Š” request์˜ use-CORS-preflight flag๊ฐ€ ์„ค์ •๋˜์–ด ๋ฐœ์ƒํ•œ CORS-preflight fetch๊ฐ€ ์บ์‹œ๋˜๋„๋ก ๋ณด์žฅํ•œ๋‹ค.

    5. request์˜ method๊ฐ€ methods ์•ˆ์— ์—†๊ณ , request์˜ method๊ฐ€ CORS-safelisted method๊ฐ€ ์•„๋‹ˆ๋ฉฐ, request์˜ credentials mode๊ฐ€ "include"์ด๊ฑฐ๋‚˜ methods๊ฐ€ `*`๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฉด, network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    6. request์˜ header list์˜ names ์ค‘ ํ•˜๋‚˜๊ฐ€ CORS non-wildcard request-header name์ด๊ณ , headerNames ์•ˆ์˜ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ byte-case-insensitive ์ผ์น˜๊ฐ€ ์•„๋‹ˆ๋ฉด, network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    7. request์˜ header list์™€ ํ•จ๊ป˜ํ•œ CORS-unsafe request-header names์˜ ๊ฐ unsafeName์— ๋Œ€ํ•ด For each ์ˆ˜ํ–‰ํ•˜๋˜, unsafeName์ด headerNames ์•ˆ์˜ ํ•ญ๋ชฉ์— ๋Œ€ํ•œ byte-case-insensitive ์ผ์น˜๊ฐ€ ์•„๋‹ˆ๊ณ  request์˜ credentials mode๊ฐ€ "include"์ด๊ฑฐ๋‚˜ headerNames๊ฐ€ `*`๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฉด, network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    8. max-age๋ฅผ `Access-Control-Max-Age`์™€ response์˜ header list๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ header list values๋ฅผ ์ถ”์ถœํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

    9. max-age๊ฐ€ failure ๋˜๋Š” null์ด๋ฉด, max-age๋ฅผ 5๋กœ ์„ค์ •ํ•œ๋‹ค.

    10. max-age๊ฐ€ max-age์— ๋Œ€ํ•ด ๋ถ€๊ณผ๋œ ํ•œ๋„๋ณด๋‹ค ํฌ๋ฉด, max-age๋ฅผ ๊ทธ ๋ถ€๊ณผ๋œ ํ•œ๋„๋กœ ์„ค์ •ํ•œ๋‹ค.

    11. ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๊ฐ€ cache๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉด, response๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    12. methods ์•ˆ์˜ ๊ฐ method ์ค‘, request๋ฅผ ์‚ฌ์šฉํ•œ method cache entry match๊ฐ€ ์žˆ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด, ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์˜ max-age๋ฅผ max-age๋กœ ์„ค์ •ํ•œ๋‹ค.

    13. methods ์•ˆ์˜ ๊ฐ method ์ค‘, request๋ฅผ ์‚ฌ์šฉํ•œ method cache entry match๊ฐ€ ์—†๋Š” ๊ฒƒ์— ๋Œ€ํ•ด, request, max-age, method, ๊ทธ๋ฆฌ๊ณ  null๋กœ ์ƒˆ cache entry๋ฅผ ๋งŒ๋“ ๋‹ค.

    14. headerNames ์•ˆ์˜ ๊ฐ headerName ์ค‘, request๋ฅผ ์‚ฌ์šฉํ•œ header-name cache entry match๊ฐ€ ์žˆ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด, ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์˜ max-age๋ฅผ max-age๋กœ ์„ค์ •ํ•œ๋‹ค.

    15. headerNames ์•ˆ์˜ ๊ฐ headerName ์ค‘, request๋ฅผ ์‚ฌ์šฉํ•œ header-name cache entry match๊ฐ€ ์—†๋Š” ๊ฒƒ์— ๋Œ€ํ•ด, request, max-age, null, ๊ทธ๋ฆฌ๊ณ  headerName์œผ๋กœ ์ƒˆ cache entry๋ฅผ ๋งŒ๋“ ๋‹ค.

    16. response๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  8. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, network error๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

4.9. CORS-ํ”„๋ฆฌํ”Œ๋ผ์ดํŠธ ์บ์‹œ

์œ ์ € ์—์ด์ „ํŠธ๋Š” CORS-preflight ์บ์‹œ๋ฅผ ๊ฐ€์ง„๋‹ค. CORS-preflight ์บ์‹œ๋Š” ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ์˜ ์บ์‹œ ์—”ํŠธ๋ฆฌ๋“ค๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

์บ์‹œ ์—”ํŠธ๋ฆฌ๋Š” ๋‹ค์Œ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค:

์บ์‹œ ์—”ํŠธ๋ฆฌ๋Š” ์ €์žฅ๋œ ์ดํ›„, max-age ํ•„๋“œ์˜ ์ดˆ๋งŒํผ ์ง€๋‚˜๋ฉด ์‚ญ์ œ๋˜์–ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ ์บ์‹œ ์—”ํŠธ๋ฆฌ๋Š” ๊ทธ ์ „์—๋„ ์‚ญ์ œ๋  ์ˆ˜ ์žˆ๋‹ค.

์ƒˆ ์บ์‹œ ์—”ํŠธ๋ฆฌ ์ƒ์„ฑ์„ ํ•˜๋ ค๋ฉด, request, max-age, method, headerName์ด ์ฃผ์–ด์งˆ ๋•Œ, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค:

  1. entry๋ฅผ ์บ์‹œ ์—”ํŠธ๋ฆฌ๋กœ ์ƒ์„ฑํ•˜๊ณ , ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ดˆ๊ธฐํ™”ํ•œ๋‹ค:

    ํ‚ค

    request๋กœ ๋„คํŠธ์›Œํฌ ํŒŒํ‹ฐ์…˜ ํ‚ค ๊ฒฐ์ •์˜ ๊ฒฐ๊ณผ

    ๋ฐ”์ดํŠธ ์ง๋ ฌํ™” origin

    request origin์„ ๋ฐ”์ดํŠธ ์ง๋ ฌํ™”์˜ ๊ฒฐ๊ณผ

    URL

    request์˜ current URL

    max-age

    max-age

    credentials

    request์˜ credentials mode๊ฐ€ "include"์ด๋ฉด true, ์•„๋‹ˆ๋ฉด false

    ๋ฉ”์„œ๋“œ

    method

    ํ—ค๋” ์ด๋ฆ„

    headerName

  2. entry๋ฅผ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ์˜ CORS-preflight ์บ์‹œ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

์บ์‹œ ํ•ญ๋ชฉ์„ ์ง€์šฐ๋ ค๋ฉด, request๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ์˜ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค ๋ชจ๋“  ์บ์‹œ ํ•ญ๋ชฉ์„ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ์˜ CORS-preflight ์บ์‹œ์—์„œ ๊ทธ ํ‚ค๊ฐ€ ๊ฐ™์€ ๊ฒฐ๊ณผ์™€ ๋„คํŠธ์›Œํฌ ํŒŒํ‹ฐ์…˜ ํ‚ค๋ฅผ ๊ฒฐ์ •ํ•œ request๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ์˜ ๊ฒฐ๊ณผ์ด๊ณ , ๋ฐ”์ดํŠธ ์ง๋ ฌํ™”๋œ ์ถœ์ฒ˜๊ฐ€ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ์ด๋ฉฐ ์š”์ฒญ ์ถœ์ฒ˜๋ฅผ ๋ฐ”์ดํŠธ ์ง๋ ฌํ™”ํ•œ ๊ฒฐ๊ณผ์ด๊ณ  request๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ๋˜ํ•œ URL์ด ๊ฐ™์Šต๋‹ˆ๋‹ค request์˜ ํ˜„์žฌ URL๊ณผ.

์บ์‹œ ํ•ญ๋ชฉ entry๊ฐ€ request์™€ ์บ์‹œ ํ•ญ๋ชฉ ์ผ์น˜๋ฅผ ์ด๋ฃจ๋Š” ๊ฒƒ์€ entry์˜ ํ‚ค๊ฐ€ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ์™€ ๊ฐ™๊ณ  ๋„คํŠธ์›Œํฌ ํŒŒํ‹ฐ์…˜ ํ‚ค๋ฅผ ๊ฒฐ์ •ํ•œ ๊ฒฐ๊ณผ(request๊ฐ€ ์ฃผ์–ด์ง), entry์˜ ๋ฐ”์ดํŠธ ์ง๋ ฌํ™”๋œ ์ถœ์ฒ˜๊ฐ€ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ์ด๋ฉฐ request๋ฅผ ์‚ฌ์šฉํ•ด ์š”์ฒญ ์ถœ์ฒ˜๋ฅผ ๋ฐ”์ดํŠธ ์ง๋ ฌํ™”ํ•œ ๊ฒฐ๊ณผ์ด๊ณ , entry์˜ URL์ด request์˜ ํ˜„์žฌ URL๊ณผ ๊ฐ™์œผ๋ฉฐ, ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์„ฑ๋ฆฝํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

์ฐธ์œผ๋กœ ํ•œ๋‹ค.

method์™€ request๋ฅผ ์“ธ ๋•Œ, ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ์˜ CORS-preflight ์บ์‹œ ๋‚ด์— method์™€ ์บ์‹œ ์—”ํŠธ๋ฆฌ ์ผ์น˜๋ฅผ ๋งŒ์กฑํ•˜๊ณ , ๊ทธ ๋ฉ”์„œ๋“œ๊ฐ€ method ๋˜๋Š” `*`์ธ ์บ์‹œ ์—”ํŠธ๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฉด, ๋ฉ”์„œ๋“œ ์บ์‹œ ์—”ํŠธ๋ฆฌ ์ผ์น˜๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•œ๋‹ค.

headerName๊ณผ request๋ฅผ ์“ธ ๋•Œ, ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ์˜ CORS-preflight ์บ์‹œ ๋‚ด์—, ์บ์‹œ ์—”ํŠธ๋ฆฌ ์ผ์น˜์™€ request๋ฅผ ๋งŒ์กฑํ•˜๊ณ , ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋งŒ์กฑํ•˜๋Š” ์บ์‹œ ์—”ํŠธ๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฉด, ํ—ค๋” ์ด๋ฆ„ ์บ์‹œ ์—”ํŠธ๋ฆฌ ์ผ์น˜๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•œ๋‹ค:

์ฐธ์œผ๋กœ ํ•œ๋‹ค.

4.10. CORS ์ฒดํฌ

CORS ์ฒดํฌ๋Š” request์™€ response์— ๋Œ€ํ•ด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค:

  1. origin์„ ๊ฐ€์ ธ์˜ค๊ธฐ๋กœ `Access-Control-Allow-Origin`์„ response์˜ header list์—์„œ ๊ฐ€์ ธ์˜จ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. origin์ด null์ด๋ฉด ์‹คํŒจ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    null์€ `null`์™€ ๋‹ค๋ฅด๋‹ค.

  3. request์˜ credentials mode๊ฐ€ "include"๊ฐ€ ์•„๋‹ˆ๊ณ  origin์ด `*`์ด๋ฉด ์„ฑ๊ณต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  4. ์š”์ฒญ origin ๋ฐ”์ดํŠธ ์ง๋ ฌํ™”๋ฅผ request๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๊ฐ€ origin๊ณผ ๋‹ค๋ฅด๋ฉด ์‹คํŒจ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  5. request์˜ credentials mode๊ฐ€ "include"๊ฐ€ ์•„๋‹ˆ๋ฉด ์„ฑ๊ณต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  6. credentials๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ๋กœ `Access-Control-Allow-Credentials`๋ฅผ response์˜ header list์—์„œ ๊ฐ€์ ธ์˜จ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  7. credentials๊ฐ€ `true`์ด๋ฉด ์„ฑ๊ณต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  8. ์‹คํŒจ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

4.11. TAO ์ฒดํฌ

TAO check๋ฅผ request์™€ response์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค:

  1. Assert: request์˜ origin์€ "client"๊ฐ€ ์•„๋‹ˆ๋‹ค.

  2. request์˜ timing allow failed flag๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด, ์‹คํŒจ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. values๋ฅผ, `Timing-Allow-Origin` ํ—ค๋”๋ฅผ ๊ฐ€์ ธ์™€ ๋””์ฝ”๋”ฉ ๋ฐ ๋ถ„ํ• ํ•œ response์˜ header list์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋กœ ํ•œ๋‹ค.

  4. values๊ฐ€ "*"๋ฅผ ํฌํ•จํ•˜๋ฉด, ์„ฑ๊ณต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  5. values๊ฐ€, request origin์„ ์ง๋ ฌํ™”ํ•œ ๊ฐ’์„ request๋กœ ์–ป์–ด ํฌํ•จํ•˜๋ฉด, ์„ฑ๊ณต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  6. request์˜ mode๊ฐ€ "navigate"์ด๊ณ  request์˜ current URL์˜ origin์ด request์˜ origin๊ณผ ๋™์ผ ์ถœ์ฒ˜๊ฐ€ ์•„๋‹ˆ๋ฉด, ์‹คํŒจ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    ์ด ๋‹จ๊ณ„๋Š” nested navigable์˜ ๋„ค๋น„๊ฒŒ์ด์…˜์„ ์œ„ํ•ด ํ•„์š”ํ•˜๋‹ค. ์ด ๊ฒฝ์šฐ request์˜ origin์€ ์ปจํ…Œ์ด๋„ˆ ๋ฌธ์„œ์˜ origin์ด ๋˜๊ณ , TAO check๋Š” ์‹คํŒจ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋„ค๋น„๊ฒŒ์ด์…˜ ํƒ€์ด๋ฐ์€ TAO check ๊ฒฐ๊ณผ๋ฅผ ๊ฒ€์ฆํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, nested document์—์„œ๋Š” ์ „์ฒด ํƒ€์ด๋ฐ ์ •๋ณด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ปจํ…Œ์ด๋„ˆ ๋ฌธ์„œ์—์„œ๋Š” ๋ณผ ์ˆ˜ ์—†๋‹ค.

  7. request์˜ response tainting์ด "basic"์ด๋ฉด ์„ฑ๊ณต์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  8. ์‹คํŒจ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์š”์ฒญ request์™€ ์‘๋‹ต response๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์š”์ฒญ์˜ ๋‚ด๋น„๊ฒŒ์ด์…˜ ํƒ€์ด๋ฐ ํ—ˆ์šฉ ๊ฐ’ ๋ชฉ๋ก์— ๋ง๋ถ™์ด๊ธฐ๋Š”:

  1. Assert: request๋Š” ๋‚ด๋น„๊ฒŒ์ด์…˜ ์š”์ฒญ์ด๋‹ค.

  2. taoValues๋ฅผ response์˜ header list์—์„œ `Timing-Allow-Origin`์„ ๊ฐ€์ ธ์˜ค๊ณ , ๋””์ฝ”๋”ฉํ•˜๊ณ , ๋ถ„ํ• ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  3. taoValues๊ฐ€ null์ด๋ฉด, taoValues๋ฅผ ยซ ยป๋กœ ์„ค์ •ํ•œ๋‹ค.

  4. taoValues๋ฅผ request์˜ ๋‚ด๋น„๊ฒŒ์ด์…˜ ํƒ€์ด๋ฐ ํ—ˆ์šฉ ๊ฐ’ ๋ชฉ๋ก์— ๋ง๋ถ™์ธ๋‹ค.

์‘๋‹ต response์™€ origin destinationOrigin์— ๋Œ€ํ•ด ๋‚ด๋น„๊ฒŒ์ด์…˜ TAO ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด:

  1. response์˜ ๋‚ด๋น„๊ฒŒ์ด์…˜ ํƒ€์ด๋ฐ ํ—ˆ์šฉ ๊ฐ’ ๋ชฉ๋ก์˜ ๊ฐ taoValues์— ๋Œ€ํ•ด For each๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค:

    1. taoValues๊ฐ€ "*"๋ฅผ ํฌํ•จํ•˜๋ฉด, continueํ•œ๋‹ค.

    2. taoValues๊ฐ€ destinationOrigin์„ ์ง๋ ฌํ™”ํ•œ ๊ฐ’์„ ํฌํ•จํ•˜๋ฉด, continueํ•œ๋‹ค.

    3. failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. success๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

4.12. ์ง€์—ฐ fetch

์ง€์—ฐ ํŽ˜์นญ(deferred fetching)์€ ํ˜ธ์ถœ์ž๊ฐ€ fetch๊ฐ€ ๊ฐ€๋Šฅํ•œ ํ•œ ๋งˆ์ง€๋ง‰ ์ˆœ๊ฐ„์— ํ˜ธ์ถœ๋˜๋„๋ก ์š”์ฒญํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ์ฆ‰, fetch group์ด ์ข…๋ฃŒ๋˜๊ฑฐ๋‚˜, ํƒ€์ž„์•„์›ƒ์ด ์ง€๋‚œ ๋’ค์— ํ˜ธ์ถœ๋œ๋‹ค.

์ง€์—ฐ fetch ์ž‘์—… ์†Œ์Šค(deferred fetch task source)๋Š”, ์ง€์—ฐ fetch์˜ ๊ฒฐ๊ณผ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ž‘์—… ์†Œ์Šค(task source)์ด๋‹ค. ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ์ด ์ž‘์—… ์†Œ์Šค์— ์†ํ•œ ์ž‘์—…์„ ๋‹ค๋ฅธ ์ž‘์—… ์†Œ์Šค๋ณด๋‹ค, ํŠนํžˆ DOM ์กฐ์ž‘ ์ž‘์—… ์†Œ์Šค์™€ ๊ฐ™์ด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ์ž‘์—… ์†Œ์Šค๋ณด๋‹ค ์šฐ์„  ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค. ์ด๊ฒƒ์€ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ fetch ๊ฒฐ๊ณผ์— ์˜์กดํ•˜๊ธฐ ์ „์— ์ตœ์‹  fetchLater() ํ˜ธ์ถœ์˜ ์ƒํƒœ๊ฐ€ ๋ฐ˜์˜๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

์š”์ฒญ request, null ๋˜๋Š” DOMHighResTimeStamp activateAfter, ๊ทธ๋ฆฌ๊ณ  ์ธ์ˆ˜๋ฅผ ๋ฐ›์ง€ ์•Š๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ onActivatedWithoutTermination์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, deferred fetch๋ฅผ ํ์— ๋„ฃ๊ธฐ๋Š”:

  1. request๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ํด๋ผ์ด์–ธํŠธ์—์„œ ์š”์ฒญ์„ ์ฑ„์šด๋‹ค.

  2. request์˜ service-workers mode๋ฅผ "none"์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  3. request์˜ keepalive๋ฅผ true๋กœ ์„ค์ •ํ•œ๋‹ค.

  4. deferredRecord๋ฅผ ์ƒˆ deferred fetch record๋กœ ๋‘๋ฉฐ, ๊ทธ request๋Š” request์ด๊ณ , ๊ทธ notify invoked๋Š” onActivatedWithoutTermination์ด๋‹ค.

  5. deferredRecord๋ฅผ request์˜ client์˜ fetch group์˜ deferred fetch records์— ๋ง๋ถ™์ธ๋‹ค.

  6. activateAfter๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•œ๋‹ค:

    1. ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ๋‹ค์Œ ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ถฉ์กฑ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค:

      • ์ ์–ด๋„ activateAfter ๋ฐ€๋ฆฌ์ดˆ๊ฐ€ ์ง€๋‚ฌ๋‹ค.

      • ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๊ฐ€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ๊ธฐํšŒ๋ฅผ ๊ณง ์žƒ๊ฒŒ ๋œ๋‹ค๊ณ  ๋ฏฟ์„ ์ด์œ ๊ฐ€ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์ด๋™ํ•˜๊ฑฐ๋‚˜, request์˜ client์˜ ์ „์—ญ ๊ฐ์ฒด๊ฐ€ Window ๊ฐ์ฒด์ด๊ณ  ๊ทธ ์—ฐ๊ด€ ๋ฌธ์„œ๊ฐ€ ์˜ค๋žœ ์‹œ๊ฐ„ ๋™์•ˆ "hidden" visibility state๋ฅผ ๊ฐ€์ง„ ๊ฒฝ์šฐ์ด๋‹ค.

    2. deferredRecord๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  7. deferredRecord๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์š”์ฒญ request์˜ total request length๋ฅผ ๊ณ„์‚ฐํ•˜๋ ค๋ฉด:

  1. totalRequestLength๋ฅผ request์˜ URL์„ exclude fragment๋ฅผ true๋กœ ์„ค์ •ํ•˜์—ฌ ์ง๋ ฌํ™”ํ•œ ๊ฒƒ์˜ ๊ธธ์ด๋กœ ๋‘”๋‹ค.

  2. totalRequestLength๋ฅผ request์˜ referrer๋ฅผ ์ง๋ ฌํ™”ํ•œ ๊ฒƒ์˜ ๊ธธ์ด๋งŒํผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

  3. request์˜ header list์˜ ๊ฐ (name, value)์— ๋Œ€ํ•ด For each๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ, totalRequestLength๋ฅผ name์˜ ๊ธธ์ด + value์˜ ๊ธธ์ด๋งŒํผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

  4. totalRequestLength๋ฅผ request์˜ body์˜ length๋งŒํผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

  5. totalRequestLength๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

fetch group fetchGroup๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ deferred fetch๋“ค์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋Š”:

  1. fetchGroup์˜ deferred fetch records์˜ ๊ฐ deferred fetch record deferredRecord์— ๋Œ€ํ•ด For each๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ, deferredRecord๋ฅผ deferred fetch ์ฒ˜๋ฆฌํ•˜๊ธฐํ•œ๋‹ค.

deferredRecord๋ฅผ deferred fetch ์ฒ˜๋ฆฌํ•˜๊ธฐ๋Š”:

  1. deferredRecord์˜ invoke state๊ฐ€ "pending"์ด ์•„๋‹ˆ๋ฉด ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. deferredRecord์˜ invoke state๋ฅผ "sent"๋กœ ์„ค์ •ํ•œ๋‹ค.

  3. deferredRecord์˜ request๋ฅผ Fetchํ•œ๋‹ค.

  4. deferredRecord์˜ request์˜ client์˜ ์ „์—ญ ๊ฐ์ฒด์—์„œ deferredRecord์˜ notify invoked๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ์ „์—ญ task๋ฅผ ํ์— ๋„ฃ๋Š”๋‹ค. ์ด๋Š” deferred fetch task source์—์„œ ์ˆ˜ํ–‰ํ•œ๋‹ค.

4.12.1. ์ง€์—ฐ fetch ํ• ๋‹น๋Ÿ‰

์ด ์ ˆ์€ ๋น„๊ทœ๋ฒ”์ ์ด๋‹ค.

์ง€์—ฐ fetch ํ• ๋‹น๋Ÿ‰์€ ์ตœ์ƒ์œ„ traversable(์ฆ‰ "ํƒญ") ๋‹จ์œ„๋กœ ํ• ๋‹น๋˜๋ฉฐ, ์ด 640ํ‚ค๋น„๋ฐ”์ดํŠธ์ด๋‹ค. ์ตœ์ƒ์œ„ ๋ฌธ์„œ์™€ ๋™์ผ ์ถœ์ฒ˜์˜ ์ง์ ‘ ์ค‘์ฒฉ ๋ฌธ์„œ๋“ค์ด ์ด ํ• ๋‹น๋Ÿ‰์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์—ฐ fetch๋ฅผ ํ์ž‰ํ•˜๊ฑฐ๋‚˜, ์ผ๋ถ€๋ฅผ ๊ต์ฐจ ์ถœ์ฒ˜ ์ค‘์ฒฉ ๋ฌธ์„œ๋กœ ์œ„์ž„ํ•  ์ˆ˜ ์žˆ๋‹ค(permissions policy ์‚ฌ์šฉ).

๊ธฐ๋ณธ์ ์œผ๋กœ 640ํ‚ค๋น„๋ฐ”์ดํŠธ ์ค‘ 128ํ‚ค๋น„๋ฐ”์ดํŠธ๊ฐ€ ๊ต์ฐจ ์ถœ์ฒ˜ ์ค‘์ฒฉ ๋ฌธ์„œ๋กœ ํ• ๋‹น๋Ÿ‰ ์œ„์ž„์— ์“ฐ์ด๋ฉฐ, ๊ฐ ์ค‘์ฒฉ ๋ฌธ์„œ๋Š” 8ํ‚ค๋น„๋ฐ”์ดํŠธ๋ฅผ ์˜ˆ์•ฝํ•œ๋‹ค.

์ตœ์ƒ์œ„ ๋ฌธ์„œ ๋ฐ ๊ทธ ์ค‘์ฒฉ ๋ฌธ์„œ๋Š” permissions policy๋ฅผ ํ†ตํ•ด ๊ต์ฐจ ์ถœ์ฒ˜ ์ž์‹ ๋ฌธ์„œ์— ์–ผ๋งˆ๋‚˜ ํ• ๋‹น๋Ÿ‰์„ ์œ„์ž„ํ• ์ง€ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ "deferred-fetch-minimal" ์ •์ฑ…์€ ๋ชจ๋“  origin์— ๋Œ€ํ•ด ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๊ณ , "deferred-fetch" ์ •์ฑ…์€ ์ตœ์ƒ์œ„ ๋ฌธ์„œ์˜ origin์— ๋Œ€ํ•ด์„œ๋งŒ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋‹ค. ํŠน์ • origin ๋˜๋Š” ์ค‘์ฒฉ ๋ฌธ์„œ์— ๋Œ€ํ•ด "deferred-fetch" ์ •์ฑ…์„ relaxํ•˜๋ฉด ํ•ด๋‹น ์ค‘์ฒฉ ๋ฌธ์„œ์— 64ํ‚ค๋น„๋ฐ”์ดํŠธ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ "deferred-fetch-minimal" ์ •์ฑ…์„ origin ๋˜๋Š” ์ค‘์ฒฉ ๋ฌธ์„œ์— ์ œํ•œํ•˜๋ฉด, ํ•ด๋‹น ๋ฌธ์„œ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ›์„ 8ํ‚ค๋น„๋ฐ”์ดํŠธ ์˜ˆ์•ฝ์ด ๋ฐฉ์ง€๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ตœ์ƒ์œ„ ๋ฌธ์„œ ์ž์ฒด์— ๋Œ€ํ•ด "deferred-fetch-minimal" ์ •์ฑ…์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด, ์œ„์ž„๋œ 128ํ‚ค๋น„๋ฐ”์ดํŠธ ์ „์ฒด ํ• ๋‹น๋Ÿ‰์ด 640ํ‚ค๋น„๋ฐ”์ดํŠธ ๋ฉ”์ธ ํ’€๋กœ ๋‹ค์‹œ ํ•ฉ์ณ์ง„๋‹ค.

์–ด๋–ค ๋ฌธ์„œ์— ๋Œ€ํ•ด ํ• ๋‹น๋œ ์ „์ฒด ํ• ๋‹น๋Ÿ‰ ์ค‘, ๋™์ผ ๋ฆฌํฌํŒ… origin(์ฆ‰ request์˜ URL์˜ origin)์— ๋Œ€ํ•ด ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ 64ํ‚ค๋น„๋ฐ”์ดํŠธ๊นŒ์ง€์ด๋‹ค. ์ด๋Š” ํŠน์ • ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ๋ณด๋‚ผ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์ด ํ• ๋‹น๋Ÿ‰๋งŒ ์„ ์ ํ•˜๋Š” ์ƒํ™ฉ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

์•„๋ž˜์˜ fetchLater() ํ˜ธ์ถœ์€ ์š”์ฒญ ์ž์ฒด๊ฐ€ ํ•œ ๋ณด๊ณ  ์˜ค๋ฆฌ์ง„์— ํ• ๋‹น๋œ 64ํ‚ค๋น„๋ฐ”์ดํŠธ ํ• ๋‹น๋Ÿ‰์„ ์ดˆ๊ณผํ•˜๋ฏ€๋กœ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์˜ ํฌ๊ธฐ์—๋Š” URL๊ณผ body, header list, referrer๊ฐ€ ๋ชจ๋‘ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

fetchLater(a_72_kb_url);
fetchLater("https://origin.example.com", {headers: headers_exceeding_64kb});
fetchLater(a_32_kb_url, {headers: headers_exceeding_32kb});
fetchLater("https://origin.example.com", {method: "POST", body: body_exceeding_64_kb});
fetchLater(a_62_kb_url /* with a 3kb referrer */);

๋‹ค์Œ ์‹œํ€€์Šค์—์„œ ์ฒ˜์Œ ๋‘ ์š”์ฒญ์€ ์„ฑ๊ณตํ•˜์ง€๋งŒ, ์„ธ ๋ฒˆ์งธ๋Š” ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ ๋‘ ๋ฒˆ์€ ์ „์ฒด 640ํ‚ค๋น„๋ฐ”์ดํŠธ ํ• ๋‹น๋Ÿ‰์„ ์ดˆ๊ณผํ•˜์ง€ ์•Š์ง€๋งŒ, ์„ธ ๋ฒˆ์งธ ์š”์ฒญ์€ https://a.example.com์— ๋Œ€ํ•œ ๋ณด๊ณ  ์˜ค๋ฆฌ์ง„ ํ• ๋‹น๋Ÿ‰์„ ์ดˆ๊ณผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

fetchLater("https://a.example.com", {method: "POST", body: a_64kb_body});
fetchLater("https://b.example.com", {method: "POST", body: a_64kb_body});
fetchLater("https://a.example.com");

๋™์ผ ์ถœ์ฒ˜ ์ค‘์ฒฉ ๋ฌธ์„œ๋Š” ๋ถ€๋ชจ์˜ ํ• ๋‹น๋Ÿ‰์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ต์ฐจ ์ถœ์ฒ˜ ๋˜๋Š” ๊ต์ฐจ agent iframe์€ ๊ธฐ๋ณธ์ ์œผ๋กœ 8kb๋งŒ ํ• ๋‹น๋ฐ›์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•„๋ž˜ ์˜ˆ์—์„œ ์ฒ˜์Œ ์„ธ ๋ฒˆ ํ˜ธ์ถœ์€ ์„ฑ๊ณตํ•˜๊ณ , ๋งˆ์ง€๋ง‰์€ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

// In main page
fetchLater("https://a.example.com", {method: "POST", body: a_64kb_body});

// In same-origin nested document
fetchLater("https://b.example.com", {method: "POST", body: a_64kb_body});

// In cross-origin nested document at https://fratop.example.com
fetchLater("https://a.example.com", {body: a_5kb_body});
fetchLater("https://a.example.com", {body: a_12kb_body});

์ด์ „ ์˜ˆ์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๋ ค๋ฉด, ์ตœ์ƒ์œ„ ๋ฌธ์„œ๊ฐ€ https://fratop.example.com์— ์ผ๋ถ€ ํ• ๋‹น๋Ÿ‰์„ ์œ„์ž„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ํ—ค๋”๋ฅผ ์ œ๊ณตํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค:

Permissions-Policy: deferred-fetch=(self "https://fratop.example.com")

๊ฐ ์ค‘์ฒฉ ๋ฌธ์„œ๋Š” ์ž์ฒด ํ• ๋‹น๋Ÿ‰์„ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ ์˜ˆ๋Š” ๊ฐ ํ”„๋ ˆ์ž„์ด 8ํ‚ค๋น„๋ฐ”์ดํŠธ๋ฅผ ์˜ˆ์•ฝํ•˜๋ฏ€๋กœ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค:

// In cross-origin nested document at https://fratop.example.com/frame-1
fetchLater("https://a.example.com", {body: a_6kb_body});

// In cross-origin nested document at https://fratop.example.com/frame-2
fetchLater("https://a.example.com", {body: a_6kb_body});

์•„๋ž˜ ํŠธ๋ฆฌ๋Š” ํŠธ๋ฆฌ ๋‚ด ๋‹ค๋ฅธ ์ค‘์ฒฉ ๋ฌธ์„œ์— ํ• ๋‹น๋Ÿ‰์ด ์–ด๋–ป๊ฒŒ ๋ถ„๋ฐฐ๋˜๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค:

์œ„ ์˜ˆ์—์„œ, ์ตœ์ƒ์œ„ traversable๊ณผ ๋™์ผ ์ถœ์ฒ˜ ์ž์†๋“ค์€ 384ํ‚ค๋น„๋ฐ”์ดํŠธ ํ• ๋‹น๋Ÿ‰์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ฐ’ ๊ณ„์‚ฐ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

์ด ๋ช…์„ธ๋Š” "deferred-fetch" ๋ฌธ์ž์—ด๋กœ ์‹๋ณ„๋˜๋Š” ์ •์ฑ… ์ œ์–ด ๊ธฐ๋Šฅ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ธฐ๋ณธ ํ—ˆ์šฉ ๋ฆฌ์ŠคํŠธ๋Š” "self"์ž…๋‹ˆ๋‹ค.

์ด ๋ช…์„ธ๋Š” "deferred-fetch-minimal" ๋ฌธ์ž์—ด๋กœ ์‹๋ณ„๋˜๋Š” ์ •์ฑ… ์ œ์–ด ๊ธฐ๋Šฅ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๊ธฐ๋ณธ ํ—ˆ์šฉ ๋ฆฌ์ŠคํŠธ๋Š” "*"์ž…๋‹ˆ๋‹ค.

deferred-fetch-minimal์— ์˜ˆ์•ฝ๋œ ํ• ๋‹น๋Ÿ‰์€ 128ํ‚ค๋น„๋ฐ”์ดํŠธ์ž…๋‹ˆ๋‹ค.

๊ฐ navigable container๋Š” ์˜ˆ์•ฝ๋œ ์ง€์—ฐ fetch ํ• ๋‹น๋Ÿ‰์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฐ’์€ ์ตœ์†Œ ํ• ๋‹น๋Ÿ‰(8ํ‚ค๋น„๋ฐ”์ดํŠธ)๊ณผ ์ผ๋ฐ˜ ํ• ๋‹น๋Ÿ‰(0 ๋˜๋Š” 64ํ‚ค๋น„๋ฐ”์ดํŠธ)์ž…๋‹ˆ๋‹ค. ๋ณ„๋‹ค๋ฅธ ์–ธ๊ธ‰์ด ์—†์œผ๋ฉด 0์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ ๊ฐ€๋Šฅ ์ง€์—ฐ fetch ํ• ๋‹น๋Ÿ‰์„ ์–ป์œผ๋ ค๋ฉด, document document์™€ origin-๋˜๋Š”-null origin์„ ๋ฐ›์•„:

  1. controlDocument๋ฅผ document์˜ ์ง€์—ฐ fetch ์ œ์–ด ๋ฌธ์„œ๋กœ ๋‘”๋‹ค.

  2. navigable์„ controlDocument์˜ node navigable๋กœ ๋‘”๋‹ค.

  3. isTopLevel์„ controlDocument์˜ node navigable์ด ์ตœ์ƒ์œ„ traversable์ด๋ฉด true, ์•„๋‹ˆ๋ฉด false๋กœ ๋‘”๋‹ค.

  4. deferredFetchAllowed๋ฅผ controlDocument๊ฐ€ ์‚ฌ์šฉ ํ—ˆ๊ฐ€๋จ์ด๊ณ , ์ •์ฑ… ์ œ์–ด ๊ธฐ๋Šฅ "deferred-fetch"๋„ ํ—ˆ๊ฐ€๋จ์ด๋ฉด true, ์•„๋‹ˆ๋ฉด false.

  5. deferredFetchMinimalAllowed๋ฅผ controlDocument๊ฐ€ ์‚ฌ์šฉ ํ—ˆ๊ฐ€๋จ์ด๊ณ , ์ •์ฑ… ์ œ์–ด ๊ธฐ๋Šฅ "deferred-fetch-minimal"๋„ ํ—ˆ๊ฐ€๋จ์ด๋ฉด true, ์•„๋‹ˆ๋ฉด false.

  6. quota๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฒฐ์ •๋œ ์ฒซ ๋ฒˆ์งธ ์ผ์น˜ ์กฐ๊ฑด์˜ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค:

    isTopLevel์ด true์ด๊ณ  deferredFetchAllowed๊ฐ€ false์ž„
    0
    isTopLevel์ด true์ด๊ณ  deferredFetchMinimalAllowed๊ฐ€ false์ž„

    640ํ‚ค๋น„๋ฐ”์ดํŠธ

    640kb๋ฉด ๋ˆ„๊ตฌ์—๊ฒŒ๋‚˜ ์ถฉ๋ถ„ํ•œ ์šฉ๋Ÿ‰์ž…๋‹ˆ๋‹ค.

    isTopLevel์ด true์ž„

    512ํ‚ค๋น„๋ฐ”์ดํŠธ

    ๊ธฐ๋ณธ๊ฐ’ 640ํ‚ค๋น„๋ฐ”์ดํŠธ์—์„œ deferred-fetch-minimal์— ์˜ˆ์•ฝ๋œ ํ• ๋‹น๋Ÿ‰ ๋งŒํผ ์ฐจ๊ฐ๋จ

    deferredFetchAllowed๊ฐ€ true์ด๊ณ , navigable์˜ navigable container์˜ ์˜ˆ์•ฝ๋œ ์ง€์—ฐ fetch ํ• ๋‹น๋Ÿ‰์ด ์ผ๋ฐ˜ ํ• ๋‹น๋Ÿ‰์ด๋ฉด
    ์ผ๋ฐ˜ ํ• ๋‹น๋Ÿ‰
    deferredFetchMinimalAllowed๊ฐ€ true์ด๊ณ , navigable์˜ navigable container์˜ ์˜ˆ์•ฝ๋œ ์ง€์—ฐ fetch ํ• ๋‹น๋Ÿ‰์ด ์ตœ์†Œ ํ• ๋‹น๋Ÿ‰์ด๋ฉด
    ์ตœ์†Œ ํ• ๋‹น๋Ÿ‰
    ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ
    0
  7. quotaForRequestOrigin์„ 64ํ‚ค๋น„๋ฐ”์ดํŠธ๋กœ ๋‘”๋‹ค.

  8. controlDocument์˜ node navigable์˜ inclusive descendant navigables ์ค‘, ๊ทธ active document์˜ deferred-fetch control document๊ฐ€ controlDocument์ธ ๊ฐ navigable์— ๋Œ€ํ•ด For each๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค:

    1. navigable์˜ active document์˜ shadow-including inclusive descendants ์ค‘ navigable container์ธ ๊ฐ container์— ๋Œ€ํ•ด For each๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ, quota๋ฅผ container์˜ reserved deferred-fetch quota๋งŒํผ ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

    2. navigable์˜ active document์˜ relevant settings object์˜ fetch group์˜ deferred fetch records์˜ ๊ฐ deferred fetch record deferredRecord์— ๋Œ€ํ•ด For each๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค:

      1. deferredRecord์˜ invoke state๊ฐ€ "pending"์ด ์•„๋‹ˆ๋ฉด, continueํ•œ๋‹ค.

      2. requestLength๋ฅผ deferredRecord์˜ request์˜ total request length๋กœ ๋‘”๋‹ค.

      3. quota๋ฅผ requestLength๋งŒํผ ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

      4. deferredRecord์˜ request์˜ URL์˜ origin์ด origin๊ณผ same origin์ด๋ฉด, quotaForRequestOrigin๋ฅผ requestLength๋งŒํผ ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

  9. quota๊ฐ€ 0 ์ดํ•˜์ด๋ฉด 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  10. quota๊ฐ€ quotaForRequestOrigin๋ณด๋‹ค ์ž‘์œผ๋ฉด quota๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  11. quotaForRequestOrigin์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ง€์—ฐ fetch ํ• ๋‹น๋Ÿ‰ ์˜ˆ์•ฝ์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด, navigable container container์™€ origin originToNavigateTo๋ฅผ ๋ฐ›์•„:

์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํƒ์ƒ‰ ์‹œ, ํƒ์ƒ‰์˜ ์†Œ์Šค ๋ฌธ์„œ๊ฐ€ navigable์˜ ๋ถ€๋ชจ ๋ฌธ์„œ์ผ ๋•Œ ํ˜ธ์ถœ๋œ๋‹ค. ๊ถŒํ•œ ์ •์ฑ…์— ๋”ฐ๋ผ ์ปจํ…Œ์ด๋„ˆ ๋ฐ ๊ทธ navigable์— ๋Œ€ํ•ด 64kb ๋˜๋Š” 8kb์˜ ํ• ๋‹น๋Ÿ‰์„ ์ž ์žฌ์ ์œผ๋กœ ์˜ˆ์•ฝํ•œ๋‹ค. ์‹ค์ œ๋กœ ์˜ˆ์•ฝ๋œ ํ• ๋‹น๋Ÿ‰์ด ์‚ฌ์šฉ๋๋Š”์ง€๋Š” ์ปจํ…Œ์ด๋„ˆ ๋ฌธ์„œ์—์„œ ๊ด€์ฐฐํ•  ์ˆ˜ ์—†๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ปจํ…Œ์ด๋„ˆ์˜ ๋ฌธ์„œ๊ฐ€ ํƒ์ƒ‰๋œ ์ปจํ…Œ์ด๋„ˆ์— ํ• ๋‹น๋Ÿ‰์„ ์œ„์ž„ํ•  ์ˆ˜ ์žˆ๊ณ , ์˜ˆ์•ฝ๋œ ํ• ๋‹น๋Ÿ‰์€ ๊ทธ ๊ฒฝ์šฐ์—๋งŒ ์ ์šฉ๋˜๋ฉฐ, ๊ณต์œ ๋  ๊ฒฝ์šฐ ๋ฌด์‹œ๋จ์„ ๊ฐ€์ •ํ•œ๋‹ค. ํ• ๋‹น๋Ÿ‰์ด ์˜ˆ์•ฝ๋˜์—ˆ๊ณ  ๋ฌธ์„œ๊ฐ€ ๊ฒฐ๊ตญ ๋ถ€๋ชจ์™€ ๋™์ผ ์ถœ์ฒ˜๊ฐ€ ๋˜๋ฉด, ํ• ๋‹น๋Ÿ‰์€ ํ•ด์ œ๋œ๋‹ค.

  1. container์˜ ์˜ˆ์•ฝ๋œ ์ง€์—ฐ fetch ํ• ๋‹น๋Ÿ‰์„ 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. controlDocument๋ฅผ container์˜ node document์˜ ์ง€์—ฐ fetch ์ œ์–ด ๋ฌธ์„œ๋กœ ๋‘”๋‹ค.

  3. "deferred-fetch"์— ๋Œ€ํ•œ ์ƒ์†๋œ ์ •์ฑ…์ด container์™€ originToNavigateTo์— ๋Œ€ํ•ด "Enabled"์ด๊ณ , ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์ง€์—ฐ fetch ํ• ๋‹น๋Ÿ‰์ด controlDocument์— ๋Œ€ํ•ด ์ผ๋ฐ˜ ํ• ๋‹น๋Ÿ‰ ์ด์ƒ์ด๋ฉด, container์˜ ์˜ˆ์•ฝ๋œ ์ง€์—ฐ fetch ํ• ๋‹น๋Ÿ‰์„ ์ผ๋ฐ˜ ํ• ๋‹น๋Ÿ‰์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  4. ์•„๋ž˜ ์กฐ๊ฑด์ด ๋ชจ๋‘ true์ด๋ฉด:

    ์ด ๊ฒฝ์šฐ container์˜ ์˜ˆ์•ฝ๋œ ์ง€์—ฐ fetch ํ• ๋‹น๋Ÿ‰์„ ์ตœ์†Œ ํ• ๋‹น๋Ÿ‰์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

์ง€์—ฐ fetch ํ• ๋‹น๋Ÿ‰ ํ•ด์ œ ๊ฐ€๋Šฅ์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด, document document๋ฅผ ๋ฐ›์•„, document์˜ node navigable์˜ container document๊ฐ€ null์ด ์•„๋‹ˆ๊ณ , ๊ทธ origin์ด document์™€ ๋™์ผ ์ถœ์ฒ˜์ด๋ฉด, document์˜ node navigable์˜ navigable container์˜ ์˜ˆ์•ฝ๋œ ์ง€์—ฐ fetch ํ• ๋‹น๋Ÿ‰์„ 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฌธ์„œ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ํ˜ธ์ถœ๋œ๋‹ค. ๋™์ผ ์ถœ์ฒ˜ ์ค‘์ฒฉ ๋ฌธ์„œ๋Š” ์–ด์ฐจํ”ผ ๋ถ€๋ชจ์˜ ํ• ๋‹น๋Ÿ‰์„ ๊ณต์œ ํ•˜๋ฏ€๋กœ ํ• ๋‹น๋Ÿ‰์„ ์˜ˆ์•ฝํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค. ์ด๋Š” ๋ฌธ์„œ ์ƒ์„ฑ ์‹œ์—๋งŒ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ, origin์€ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๊ฐ€ ์ฒ˜๋ฆฌ๋œ ํ›„์—๋งŒ ์•Œ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ง€์—ฐ fetch ์ œ์–ด ๋ฌธ์„œ๋ฅผ ์–ป์œผ๋ ค๋ฉด, document document๋ฅผ ๋ฐ›์•„:

  1. document์˜ node navigable์˜ container document๊ฐ€ null์ด๊ฑฐ๋‚˜, ๋ฌธ์„œ์˜ origin์ด document์™€ ๋™์ผ ์ถœ์ฒ˜๊ฐ€ ์•„๋‹ˆ๋ฉด, document๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ ์™ธ์—๋Š”, ์ง€์—ฐ fetch ์ œ์–ด ๋ฌธ์„œ๋ฅผ document์˜ node navigable์˜ container document๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

5. Fetch API

fetch() ๋ฉ”์„œ๋“œ๋Š” ๋ฆฌ์†Œ์Šค ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์œ„ํ•œ ๋น„๊ต์  ์ €์ˆ˜์ค€์˜ API์ž…๋‹ˆ๋‹ค. XMLHttpRequest๋ณด๋‹ค ์•ฝ๊ฐ„ ๋” ๋„“์€ ์˜์—ญ์„ ๋‹ค๋ฃจ์ง€๋งŒ, ํ˜„์žฌ๋Š” ์š”์ฒญ ์ง„ํ–‰ ์ƒํ™ฉ(์‘๋‹ต ์ง„ํ–‰ ์ƒํ™ฉ ์•„๋‹˜)์— ์žˆ์–ด ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

fetch() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ๊ทธ ๋‚ด์šฉ์„ Blob์œผ๋กœ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค:

fetch("/music/pk/altes-kamuffel.flac")
  .then(res => res.blob()).then(playBlob)

ํŠน์ • ์‘๋‹ต ํ—ค๋”๋งŒ ๋กœ๊ทธ๋กœ ๋‚จ๊ธฐ๊ณ  ์‹ถ๋‹ค๋ฉด:

fetch("/", {method:"HEAD"})
  .then(res => log(res.headers.get("strict-transport-security")))

๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค์˜ ํŠน์ • ์‘๋‹ต ํ—ค๋”๋ฅผ ํ™•์ธํ•œ ๋’ค ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด:

fetch("https://pk.example/berlin-calling.json", {mode:"cors"})
  .then(res => {
    if(res.headers.get("content-type") &&
       res.headers.get("content-type").toLowerCase().indexOf("application/json") >= 0) {
      return res.json()
    } else {
      throw new TypeError()
    }
  }).then(processJSON)

URL ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ณ  ์‹ถ๋‹ค๋ฉด:

var url = new URL("https://geo.example.org/api"),
    params = {lat:35.696233, long:139.570431}
Object.keys(params).forEach(key => url.searchParams.append(key, params[key]))
fetch(url).then(/* โ€ฆ */)

๋ฐ”๋”” ๋ฐ์ดํ„ฐ๋ฅผ ์ ์ง„์ ์œผ๋กœ ๋ฐ›๊ณ  ์‹ถ๋‹ค๋ฉด:

function consume(reader) {
  var total = 0
  return pump()
  function pump() {
    return reader.read().then(({done, value}) => {
      if (done) {
        return
      }
      total += value.byteLength
      log(`received ${value.byteLength} bytes (${total} bytes in total)`)
      return pump()
    })
  }
}

fetch("/music/pk/altes-kamuffel.flac")
  .then(res => consume(res.body.getReader()))
  .then(() => log("์ „์ฒด ๋ฐ”๋””๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋ณด์กดํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋‘ ์†Œ๋น„ํ•จ!"))
  .catch(e => log("๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•จ: " + e))

5.1. Headers ํด๋ž˜์Šค

typedef (sequence<sequence<ByteString>> or record<ByteString, ByteString>) HeadersInit;

[Exposed=(Window,Worker)]
interface Headers {
  constructor(optional HeadersInit init);

  undefined append(ByteString name, ByteString value);
  undefined delete(ByteString name);
  ByteString? get(ByteString name);
  sequence<ByteString> getSetCookie();
  boolean has(ByteString name);
  undefined set(ByteString name, ByteString value);
  iterable<ByteString, ByteString>;
};

Headers ๊ฐ์ฒด๋Š” ์—ฐ๊ด€๋œ ํ—ค๋” ๋ฆฌ์ŠคํŠธ (์ฆ‰, header list)๋ฅผ ๊ฐ€์ง„๋‹ค. ์ด ๋ฆฌ์ŠคํŠธ๋Š” ์ฒ˜์Œ์— ๋น„์–ด ์žˆ๋‹ค. ์ด ๊ฐ’์€ ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ header list๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜๋„ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Request ๊ฐ์ฒด๊ฐ€ ๋ณด์—ฌ์ฃผ๋“ฏ์ด request์˜ ํ—ค๋” ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

Headers ๊ฐ์ฒด๋Š” guard๋„ ๊ฐ€์ง€๋ฉฐ, ์ด๋Š” ํ—ค๋” guard์ž…๋‹ˆ๋‹ค. ํ—ค๋” guard๋Š” "immutable", "request", "request-no-cors", "response", "none" ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.


headers = new Headers([init])

์ƒˆ Headers ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. init์„ ์‚ฌ์šฉํ•ด ๋‚ด๋ถ€ ํ—ค๋” ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฑ„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ ์ฐธ๊ณ .

const meta = { "Content-Type": "text/xml", "Breaking-Bad": "<3" };
new Headers(meta);

// ์œ„ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค
const meta2 = [
  [ "Content-Type", "text/xml" ],
  [ "Breaking-Bad", "<3" ]
];
new Headers(meta2);
headers . append(name, value)

headers์— ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

headers . delete(name)

headers์—์„œ ํ—ค๋”๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

headers . get(name)

name์ธ ๋ชจ๋“  ํ—ค๋” ๊ฐ’๋“ค์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ๊ฐ’๋“ค์€ ์ฝค๋งˆ์™€ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.

headers . getSetCookie()

์ด๋ฆ„์ด `Set-Cookie`์ธ ๋ชจ๋“  ํ—ค๋” ๊ฐ’์„ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

headers . has(name)

name์ธ ํ—ค๋”๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

headers . set(name, value)

์ด๋ฆ„์ด name์ธ ์ฒซ ๋ฒˆ์งธ ํ—ค๋” ๊ฐ’์„ value๋กœ ๋Œ€์ฒดํ•˜๊ณ , ๋™์ผํ•œ ์ด๋ฆ„์˜ ๋‚จ์€ ํ—ค๋”๋Š” ๋ชจ๋‘ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

for(const [name, value] of headers)

headers๋ฅผ ๋ฐ˜๋ณต(iterate)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ header (name, value)์— ๋Œ€ํ•ด Headers ๊ฐ์ฒด headers๋กœ ์‹คํ–‰ํ•˜๋ ค๋ฉด:

  1. name์ด ํ—ค๋” ์ด๋ฆ„์ด ์•„๋‹ˆ๊ฑฐ๋‚˜ value๊ฐ€ ํ—ค๋” ๊ฐ’์ด ์•„๋‹ˆ๋ฉด, TypeError๋ฅผ ๋˜์ง„๋‹ค.

  2. headers์˜ guard๊ฐ€ "immutable"์ด๋ฉด TypeError๋ฅผ ๋˜์ง„๋‹ค.

  3. headers์˜ guard๊ฐ€ "request"์ด๊ณ , (name, value)๊ฐ€ ๊ธˆ์ง€๋œ ์š”์ฒญ ํ—ค๋”๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  4. headers์˜ guard๊ฐ€ "response"์ด๊ณ , name์ด ๊ธˆ์ง€๋œ ์‘๋‹ต ํ—ค๋” ์ด๋ฆ„์ด๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  5. true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

"request-no-cors"์˜ ๋‹จ๊ณ„๋Š” ๊ณต์œ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. delete()์—์„œ ํ•ญ์ƒ ์„ฑ๊ณตํ•˜๋Š” ๊ฐ€์งœ ๊ฐ’(CORS ์•ˆ์ „ ๋ชฉ๋ก ์š”์ฒญ ํ—ค๋”์— ๋Œ€ํ•ด)์ด ์žˆ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ถ”๊ฐ€๋ฅผ header (name, value)์— ๋Œ€ํ•ด Headers ๊ฐ์ฒด headers์— ์‹คํ–‰ํ•˜๋ ค๋ฉด:

  1. value ์ •๊ทœํ™”๋ฅผ value์— ์‹คํ–‰ํ•œ๋‹ค.

  2. ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ (name, value)๋ฅผ headers์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๊ฐ€ false๋ฉด returnํ•œ๋‹ค.

  3. headers์˜ guard๊ฐ€ "request-no-cors"์ด๋ฉด:

    1. temporaryValue๋ฅผ get name์„ headers์˜ ํ—ค๋” ๋ฆฌ์ŠคํŠธ๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

    2. temporaryValue๊ฐ€ null์ด๋ฉด temporaryValue๋ฅผ value๋กœ ์„ค์ •ํ•œ๋‹ค.

    3. ๊ทธ ์™ธ์—๋Š” temporaryValue์— 0x2C 0x20์„ ์ด์–ด ๋ถ™์ด๊ณ , value๋ฅผ ์ด์–ด ๋ถ™์ธ๋‹ค.

    4. (name, temporaryValue)๊ฐ€ no-CORS ์•ˆ์ „ ๋ชฉ๋ก ์š”์ฒญ ํ—ค๋”๊ฐ€ ์•„๋‹ˆ๋ฉด return ํ•œ๋‹ค.

  4. append (name, value)๋ฅผ headers์˜ ํ—ค๋” ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

  5. headers์˜ guard๊ฐ€ "request-no-cors"์ด๋ฉด ๊ถŒํ•œ ์—†๋Š” no-CORS ์š”์ฒญ ํ—ค๋” ์ œ๊ฑฐ๋ฅผ headers์— ์‹คํ–‰ํ•œ๋‹ค.

์ฑ„์šฐ๊ธฐ๋ฅผ Headers ๊ฐ์ฒด headers์™€ ๊ฐ์ฒด object๋กœ ์‹คํ–‰ํ•˜๋ ค๋ฉด:

  1. object๊ฐ€ sequence์ด๋ฉด, ๊ฐ header์— ๋Œ€ํ•ด object์—์„œ:

    1. header์˜ ํฌ๊ธฐ๊ฐ€ 2๊ฐ€ ์•„๋‹ˆ๋ฉด, TypeError๋ฅผ ๋˜์ง„๋‹ค.

    2. append (header[0], header[1])๋ฅผ headers์— ์‹คํ–‰ํ•œ๋‹ค.

  2. ๊ทธ ์™ธ์— object๊ฐ€ record์ด๋ฉด, ๊ฐ key โ†’ value์— ๋Œ€ํ•ด object์—์„œ, append (key, value)๋ฅผ headers์— ์‹คํ–‰ํ•œ๋‹ค.

๊ถŒํ•œ ์—†๋Š” no-CORS ์š”์ฒญ ํ—ค๋” ์ œ๊ฑฐ๋ฅผ Headers ๊ฐ์ฒด (headers)์— ์‹คํ–‰ํ•˜๋ ค๋ฉด:

  1. ๊ฐ headerName์— ๋Œ€ํ•ด ๊ถŒํ•œ ์žˆ๋Š” no-CORS ์š”์ฒญ ํ—ค๋” ์ด๋ฆ„๋“ค์—์„œ:

    1. Delete headerName์„ headers์˜ ํ—ค๋” ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ญ์ œํ•œ๋‹ค.

์ด ๋‹จ๊ณ„๋Š” ๊ถŒํ•œ ์—†๋Š” ์ฝ”๋“œ๊ฐ€ ํ—ค๋”๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ํ˜ธ์ถœ๋œ๋‹ค.

new Headers(init) ์ƒ์„ฑ์ž ๋‹จ๊ณ„:

  1. this์˜ guard๋ฅผ "none"์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. init์ด ์ฃผ์–ด์ง€๋ฉด, ์ฑ„์šฐ๊ธฐ๋ฅผ this์™€ init์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค.

append(name, value) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ์ถ”๊ฐ€ (name, value)๋ฅผ this์— ์‹คํ–‰ํ•œ๋‹ค.

delete(name) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„:

  1. ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ (name, ``)๋ฅผ this์— ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๊ฐ€ false๋ฉด returnํ•œ๋‹ค.

    ์ž„์˜์˜ ํ—ค๋” ๊ฐ’์„ ์ „๋‹ฌํ•ด๋„ ๋ถ€์ž‘์šฉ์ด ์—†์–ด์•ผ ํ•œ๋‹ค.

  2. this์˜ guard๊ฐ€ "request-no-cors"์ด๊ณ , name์ด no-CORS ์•ˆ์ „ ๋ชฉ๋ก ์š”์ฒญ ํ—ค๋” ์ด๋ฆ„์ด ์•„๋‹ˆ๊ณ , name์ด ๊ถŒํ•œ ์žˆ๋Š” no-CORS ์š”์ฒญ ํ—ค๋” ์ด๋ฆ„์ด ์•„๋‹ˆ๋ฉด returnํ•œ๋‹ค.

  3. this์˜ ํ—ค๋” ๋ฆฌ์ŠคํŠธ์— name์ด ์—†์œผ๋ฉด returnํ•œ๋‹ค.

  4. Delete name์„ this์˜ ํ—ค๋” ๋ฆฌ์ŠคํŠธ์—์„œ ์‚ญ์ œํ•œ๋‹ค.

  5. this์˜ guard๊ฐ€ "request-no-cors"์ด๋ฉด ๊ถŒํ•œ ์—†๋Š” no-CORS ์š”์ฒญ ํ—ค๋” ์ œ๊ฑฐ๋ฅผ this์— ์‹คํ–‰ํ•œ๋‹ค.

get(name) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„:

  1. name์ด ํ—ค๋” ์ด๋ฆ„์ด ์•„๋‹ˆ๋ฉด TypeError๋ฅผ ๋˜์ง„๋‹ค.

  2. get name์„ this์˜ ํ—ค๋” ๋ฆฌ์ŠคํŠธ๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

getSetCookie() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„:

  1. this์˜ ํ—ค๋” ๋ฆฌ์ŠคํŠธ์— `Set-Cookie`๊ฐ€ ์—†์œผ๋ฉด ยซ ยป๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. ๊ฐ’๋“ค์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ํ—ค๋” ์ค‘ this์˜ ํ—ค๋” ๋ฆฌ์ŠคํŠธ์—์„œ ์ด๋ฆ„์ด `Set-Cookie`์™€ ๋ฐ”์ดํŠธ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์—†์ด ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ํ—ค๋”์˜ ๊ฐ’์„ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

has(name) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„:

  1. name์ด ํ—ค๋” ์ด๋ฆ„์ด ์•„๋‹ˆ๋ฉด TypeError๋ฅผ ๋˜์ง„๋‹ค.

  2. this์˜ ํ—ค๋” ๋ฆฌ์ŠคํŠธ์— name์ด ์žˆ์œผ๋ฉด true, ์•„๋‹ˆ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

set(name, value) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„:

  1. value ์ •๊ทœํ™”๋ฅผ value์— ์‹คํ–‰ํ•œ๋‹ค.

  2. ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ (name, value)๋ฅผ this์— ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๊ฐ€ false๋ฉด returnํ•œ๋‹ค.

  3. this์˜ guard๊ฐ€ "request-no-cors"์ด๊ณ , (name, value)๊ฐ€ no-CORS ์•ˆ์ „ ๋ชฉ๋ก ์š”์ฒญ ํ—ค๋”๊ฐ€ ์•„๋‹ˆ๋ฉด returnํ•œ๋‹ค.

  4. set (name, value)๋ฅผ this์˜ ํ—ค๋” ๋ฆฌ์ŠคํŠธ์— ์‹คํ–‰ํ•œ๋‹ค.

  5. this์˜ guard๊ฐ€ "request-no-cors"์ด๋ฉด ๊ถŒํ•œ ์—†๋Š” no-CORS ์š”์ฒญ ํ—ค๋” ์ œ๊ฑฐ๋ฅผ this์— ์‹คํ–‰ํ•œ๋‹ค.

๋ฐ˜๋ณตํ•  ๊ฐ’ ์Œ์€ ์ •๋ ฌ ๋ฐ ๊ฒฐํ•ฉ์„ this์˜ ํ—ค๋” ๋ฆฌ์ŠคํŠธ์— ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ์ด๋‹ค.

5.2. BodyInit ์œ ๋‹ˆ์–ธ

typedef (Blob or BufferSource or FormData or URLSearchParams or USVString) XMLHttpRequestBodyInit;

typedef (ReadableStream or XMLHttpRequestBodyInit) BodyInit;

์•ˆ์ „ ์ถ”์ถœ์„ ํƒ€์ž…์ด ์ง€์ •๋œ body๋ฅผ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค ๋˜๋Š” BodyInit ๊ฐ์ฒด object์—์„œ ์ถ”์ถœํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค:

  1. object๊ฐ€ ReadableStream ๊ฐ์ฒด๋ผ๋ฉด:

    1. Assert: object๋Š” ํ”๋“ค๋ฆผ(disturbed)๋„ ์•„๋‹ˆ๊ณ  locked๋„ ์•„๋‹ˆ๋‹ค.

  2. ์ถ”์ถœ์„ object์— ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์•ˆ์ „ ์ถ”์ถœ ๋™์ž‘์€ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€์ง€ ์•Š๋Š” ์ถ”์ถœ์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์ด๋‹ค.

์ถ”์ถœ์„ ํƒ€์ž…์ด ์ง€์ •๋œ body๋กœ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค ๋˜๋Š” BodyInit ๊ฐ์ฒด object์—์„œ, ์„ ํƒ์  ๋ถˆ๋ฆฌ์–ธ keepalive(๊ธฐ๋ณธ๊ฐ’ false)๋กœ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค:

  1. stream์„ null๋กœ ๋‘”๋‹ค.

  2. object๊ฐ€ ReadableStream ๊ฐ์ฒด๋ผ๋ฉด stream์„ object๋กœ ์„ค์ •ํ•œ๋‹ค.

  3. ๊ทธ ์™ธ์— object๊ฐ€ Blob ๊ฐ์ฒด๋ผ๋ฉด, stream์„ object์˜ get stream ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  4. ๊ทธ ์™ธ์—๋Š” stream์„ ์ƒˆ ReadableStream ๊ฐ์ฒด๋กœ ๋‘๊ณ , ๋ฐ”์ดํŠธ ์ฝ๊ธฐ ์ง€์›์œผ๋กœ set up์„ stream์— ์‹คํ–‰ํ•œ๋‹ค.

  5. Assert: stream์€ ReadableStream ๊ฐ์ฒด๋‹ค.

  6. action์„ null๋กœ ๋‘”๋‹ค.

  7. source๋ฅผ null๋กœ ๋‘”๋‹ค.

  8. length๋ฅผ null๋กœ ๋‘”๋‹ค.

  9. type์„ null๋กœ ๋‘”๋‹ค.

  10. object ํƒ€์ž…์— ๋”ฐ๋ผ ๋‹ค์Œ์„ ์‹คํ–‰ํ•œ๋‹ค:

    Blob

    source๋ฅผ object๋กœ ์„ค์ •ํ•œ๋‹ค.

    length๋ฅผ object์˜ size๋กœ ์„ค์ •ํ•œ๋‹ค.

    object์˜ type ์†์„ฑ์ด ๋นˆ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๊ฐ€ ์•„๋‹ˆ๋ฉด, type์„ ํ•ด๋‹น ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    ๋ฐ”์ดํŠธ ์‹œํ€€์Šค

    source๋ฅผ object๋กœ ์„ค์ •ํ•œ๋‹ค.

    BufferSource

    source๋ฅผ object๊ฐ€ ๊ฐ€์ง„ ๋ฐ”์ดํŠธ์˜ ๋ณต์‚ฌ๋ณธ์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    FormData

    action์„ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ์„ค์ •: multipart/form-data ์ธ์ฝ”๋”ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ object์˜ entry list์™€ UTF-8๋กœ ์‹คํ–‰.

    source๋ฅผ object๋กœ ์„ค์ •ํ•œ๋‹ค.

    length๋ฅผ ๋ถˆ๋ช…ํ™•, ๊ฐœ์„ ์€ html/6424 ์ฐธ๊ณ ๋กœ ์„ค์ •ํ•œ๋‹ค.

    type์„ `multipart/form-data; boundary=` + multipart/form-data ๊ฒฝ๊ณ„ ๋ฌธ์ž์—ด ( multipart/form-data ์ธ์ฝ”๋”ฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์œผ๋กœ ์ƒ์„ฑ๋จ)๋กœ ์„ค์ •ํ•œ๋‹ค.

    URLSearchParams

    source๋ฅผ application/x-www-form-urlencoded serializer๋ฅผ object์˜ list์— ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    type์„ `application/x-www-form-urlencoded;charset=UTF-8`์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    ์Šค์นผ๋ผ ๊ฐ’ ๋ฌธ์ž์—ด

    source๋ฅผ UTF-8 ์ธ์ฝ”๋”ฉ์„ object์— ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    type์„ `text/plain;charset=UTF-8`๋กœ ์„ค์ •ํ•œ๋‹ค.

    ReadableStream

    keepalive๊ฐ€ true๋ฉด TypeError๋ฅผ ๋˜์ง„๋‹ค.

    object๊ฐ€ ํ”๋“ค๋ฆผ(disturbed)์ด๋‚˜ locked์ด๋ฉด TypeError๋ฅผ ๋˜์ง„๋‹ค.

  11. source๊ฐ€ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๋ผ๋ฉด, action์„ source๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‹จ๊ณ„๋กœ ์„ค์ •ํ•˜๊ณ , length๋ฅผ source์˜ ๊ธธ์ด๋กœ ๋‘”๋‹ค.

  12. action์ด null์ด ์•„๋‹ˆ๋ฉด, ์•„๋ž˜ ๋‹จ๊ณ„๋ฅผ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•œ๋‹ค:

    1. action์„ ์‹คํ–‰ํ•œ๋‹ค.

      ๋ฐ”์ดํŠธ๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ณ  stream์ด errored๊ฐ€ ์•„๋‹ˆ๋ฉด, enqueue๋ฅผ, Uint8Array ์ƒ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐ”์ดํŠธ๋ฅผ stream์— ์ถ”๊ฐ€ํ•œ๋‹ค.

      action ์‹คํ–‰์ด ๋๋‚˜๋ฉด, close๋ฅผ stream์— ์‹คํ–‰ํ•œ๋‹ค.

  13. body๋ฅผ body์˜ ์ƒˆ ์ธ์Šคํ„ด์Šค๋กœ ๋‘๊ณ , stream์€ stream, source๋Š” source, length๋Š” length๋กœ ์„ค์ •ํ•œ๋‹ค.

  14. (body, type)์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

5.3. Body ๋ฏน์Šค์ธ

interface mixin Body {
  readonly attribute ReadableStream? body;
  readonly attribute boolean bodyUsed;
  [NewObject] Promise<ArrayBuffer> arrayBuffer();
  [NewObject] Promise<Blob> blob();
  [NewObject] Promise<Uint8Array> bytes();
  [NewObject] Promise<FormData> formData();
  [NewObject] Promise<any> json();
  [NewObject] Promise<USVString> text();
  [NewObject] ReadableStream textStream();
};

๋„คํŠธ์›Œํฌ ๊ณ„์ธต์— ์˜์กดํ•˜๋ฉด ์•ˆ ๋˜๋Š” ํฌ๋งท(์˜ˆ: HTML)์€ ์—ฌ๊ธฐ์„œ ๋…ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  HTML ํŒŒ์„œ API๊ฐ€ ์ŠคํŠธ๋ฆผ์„ ๋ฐ›๋„๋ก ์„ค๊ณ„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Body ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ์„ ํฌํ•จํ•œ ๊ฐ์ฒด๋Š” body (null ๋˜๋Š” body)๋ฅผ ๊ฐ€์ง„๋‹ค.

Body ์ธํ„ฐํŽ˜์ด์Šค ๋ฏน์Šค์ธ์„ ํฌํ•จํ•œ ๊ฐ์ฒด๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋กœ ๊ฐ„์ฃผ๋˜๋Š”๋ฐ, body๊ฐ€ null์ด ์•„๋‹ˆ๊ณ , body์˜ stream์ด disturbed ๋˜๋Š” locked์ธ ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค.


requestOrResponse . body

requestOrResponse์˜ body๋ฅผ ReadableStream์œผ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

requestOrResponse . bodyUsed

requestOrResponse์˜ body๊ฐ€ ์ฝํ˜”๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

requestOrResponse . arrayBuffer()

requestOrResponse์˜ body๋ฅผ ArrayBuffer๋กœ ํฌํ•จํ•˜์—ฌ ์ดํ–‰๋˜๋Š” promise๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

requestOrResponse . blob()

requestOrResponse์˜ body๋ฅผ Blob์œผ๋กœ ํฌํ•จํ•˜์—ฌ ์ดํ–‰๋˜๋Š” promise๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

requestOrResponse . bytes()

requestOrResponse์˜ body๋ฅผ Uint8Array๋กœ ํฌํ•จํ•˜์—ฌ ์ดํ–‰๋˜๋Š” promise๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

requestOrResponse . formData()

requestOrResponse์˜ body๋ฅผ FormData๋กœ ํฌํ•จํ•˜์—ฌ ์ดํ–‰๋˜๋Š” promise๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

requestOrResponse . json()

requestOrResponse์˜ body๋ฅผ JSON์œผ๋กœ ํŒŒ์‹ฑํ•˜์—ฌ ์ดํ–‰๋˜๋Š” promise๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

requestOrResponse . text()

requestOrResponse์˜ body๋ฅผ ๋ฌธ์ž์—ด๋กœ ํฌํ•จํ•˜์—ฌ ์ดํ–‰๋˜๋Š” promise๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

requestOrResponse . textStream()

ReadableStream ๊ฐ์ฒด๋ฅผ requestOrResponse์˜ body๋ฅผ ๋ฌธ์ž์—ด ์ฒญํฌ๋กœ ๊ฐ€์ง€๋„๋ก ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.


MIME ํƒ€์ž… ์–ป๊ธฐ๋Š” Request ๋˜๋Š” Response ๊ฐ์ฒด requestOrResponse๋ฅผ ๋ฐ›์•„ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค:

  1. headers๋ฅผ null๋กœ ๋‘”๋‹ค.

  2. requestOrResponse๊ฐ€ Request์ด๋ฉด, headers๋ฅผ requestOrResponse์˜ request์˜ ํ—ค๋” ๋ฆฌ์ŠคํŠธ๋กœ ์„ค์ •ํ•œ๋‹ค.

  3. ๊ทธ ์™ธ์—๋Š” headers๋ฅผ requestOrResponse์˜ response์˜ ํ—ค๋” ๋ฆฌ์ŠคํŠธ๋กœ ์„ค์ •ํ•œ๋‹ค.

  4. mimeType์„ MIME ํƒ€์ž… ์ถ”์ถœ์„ headers๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘๋Š”๋‹ค.

  5. mimeType์ด ์‹คํŒจ์ด๋ฉด null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  6. mimeType์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

body getter ๋‹จ๊ณ„๋Š” this์˜ body๊ฐ€ null์ด๋ฉด null์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์•„๋‹ˆ๋ฉด this์˜ body์˜ stream์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

bodyUsed getter ๋‹จ๊ณ„๋Š” this์˜ body๊ฐ€ null์ด ์•„๋‹ˆ๊ณ , this์˜ body์˜ stream์ด disturbed๋ฉด true๋ฅผ, ์•„๋‹ˆ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

body ์†Œ๋น„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ Body ๋ฏน์Šค์ธ์„ ํฌํ•จํ•œ ๊ฐ์ฒด object์™€, ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๋ฅผ ๋ฐ›์•„ JS ๊ฐ’์ด๋‚˜ ์˜ˆ์™ธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ convertBytesToJSValue๋ฅผ ๋ฐ›์•„ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค:

  1. object๊ฐ€ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋ฉด, TypeError๋กœ reject๋œ promise๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. promise๋ฅผ ์ƒˆ promise๋กœ ๋‘”๋‹ค.

  3. errorSteps๋ฅผ error๋ฅผ ๋ฐ›์•„ promise๋ฅผ rejectํ•˜๋Š” ๋‹จ๊ณ„๋กœ ๋‘”๋‹ค.
  4. successSteps๋ฅผ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค data๋ฅผ ๋ฐ›์•„, promise๋ฅผ resolveํ•˜๋Š” ๋‹จ๊ณ„๋กœ ๋‘”๋‹ค. convertBytesToJSValue๋ฅผ data์— ์‹คํ–‰ํ•ด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด errorSteps๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  5. object์˜ body๊ฐ€ null์ด๋ฉด, successSteps๋ฅผ ๋นˆ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๋กœ ์‹คํ–‰ํ•œ๋‹ค.

  6. ๊ทธ ์™ธ์—๋Š” ์™„์ „ํžˆ ์ฝ๊ธฐ๋ฅผ object์˜ body, successSteps, errorSteps, object์˜ ๊ด€๋ จ ๊ธ€๋กœ๋ฒŒ ๊ฐ์ฒด๋กœ ์‹คํ–‰ํ•œ๋‹ค.

  7. promise๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

arrayBuffer() ๋ฉ”์„œ๋“œ์˜ ๋‹จ๊ณ„๋Š”, consume body๋ฅผ this์™€ ์•„๋ž˜ ๋‹จ๊ณ„๋ฅผ ์ธ์ž๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์•„๋ž˜ ๋‹จ๊ณ„๋Š” byte sequence bytes๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ: ์ƒ์„ฑ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ArrayBuffer ์˜ bytes๋กœ this์˜ relevant realm์—์„œ ์ƒ์„ฑํ•œ๋‹ค.

์œ„ ๋ฉ”์„œ๋“œ๋Š” RangeError๋กœ reject๋  ์ˆ˜ ์žˆ๋‹ค.

blob() ๋ฉ”์„œ๋“œ์˜ ๋‹จ๊ณ„๋Š” consume body๋ฅผ this์™€ ์•„๋ž˜ ๋‹จ๊ณ„๋ฅผ ์ธ์ž๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์•„๋ž˜ ๋‹จ๊ณ„๋Š” byte sequence bytes๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ: Blob ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ๋‚ด์šฉ์€ bytes์ด๊ณ , type attribute๋Š” get the MIME type์˜ this ๊ฒฐ๊ณผ์ด๋‹ค.

bytes() ๋ฉ”์„œ๋“œ์˜ ๋‹จ๊ณ„๋Š”, consume body๋ฅผ this์™€ ์•„๋ž˜ ๋‹จ๊ณ„๋ฅผ ์ธ์ž๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์•„๋ž˜ ๋‹จ๊ณ„๋Š” byte sequence bytes๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ: ์ƒ์„ฑ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. Uint8Array ์˜ bytes๋กœ this์˜ relevant realm์—์„œ ์ƒ์„ฑํ•œ๋‹ค.

์œ„ ๋ฉ”์„œ๋“œ๋Š” RangeError๋กœ reject๋  ์ˆ˜ ์žˆ๋‹ค.

formData() ๋ฉ”์„œ๋“œ์˜ ๋‹จ๊ณ„๋Š”, consume body๋ฅผ this์™€ ์•„๋ž˜ ๋‹จ๊ณ„๋ฅผ ์ธ์ž๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์•„๋ž˜ ๋‹จ๊ณ„๋Š” byte sequence bytes๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ:

  1. mimeType์„ get the MIME type์˜ this ๊ฒฐ๊ณผ๋กœ ํ•œ๋‹ค.

  2. mimeType์ด null์ด ์•„๋‹ˆ๋ฉด mimeType์˜ essence์— ๋”ฐ๋ผ ๋ถ„๊ธฐํ•œ๋‹ค:

    "multipart/form-data"
    1. bytes๋ฅผ ํŒŒ์‹ฑํ•œ๋‹ค. mimeType์˜ `boundary` ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ณ , Returning Values from Forms: multipart/form-data์— ์ •์˜๋œ ๊ทœ์น™์„ ๋”ฐ๋ฅธ๋‹ค. [RFC7578]

      `Content-Disposition` ํ—ค๋”์— `filename` ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ๋Š” ๊ฐ ํŒŒํŠธ๋Š”, ๊ฐ’์ด ํ•ด๋‹น ํŒŒํŠธ์˜ ๋‚ด์šฉ์„ ๋‹ด์€ File ๊ฐ์ฒด์ธ ์—”ํŠธ๋ฆฌ ๋กœ ํŒŒ์‹ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. File ๊ฐ์ฒด์˜ name ์†์„ฑ์€ ํ•ด๋‹น ํŒŒํŠธ์˜ `filename` ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. File ๊ฐ์ฒด์˜ type ์†์„ฑ์€ ํ•ด๋‹น ํŒŒํŠธ์— `Content-Type` ํ—ค๋”๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ ๊ฐ’์ด๊ณ , ์—†์œผ๋ฉด `text/plain`์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค([RFC7578] 4.4์ ˆ์— ์ •์˜๋œ ๊ธฐ๋ณธ๊ฐ’).

      `Content-Disposition` ํ—ค๋”์— `filename` ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†๋Š” ๊ฐ ํŒŒํŠธ๋Š”, ๊ฐ’์ด entry์ธ BOM ์—†๋Š” UTF-8 ๋””์ฝ”๋“œ ๋‚ด์šฉ์„ ๊ฐ€์ง„๋‹ค. ์ด ๊ณผ์ •์€ `Content-Type` ํ—ค๋” ๋ฐ `charset` ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์กด์žฌ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ์ˆ˜ํ–‰๋œ๋‹ค.

      `Content-Disposition` ํ—ค๋”์˜ `name` ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์ด `_charset_`์ธ ํŒŒํŠธ๋„ ๋‹ค๋ฅธ ํŒŒํŠธ์™€ ๋™์ผํ•˜๊ฒŒ ํŒŒ์‹ฑ๋œ๋‹ค. ์ธ์ฝ”๋”ฉ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

    2. ํŒŒ์‹ฑ์— ์‹คํŒจํ•˜๋ฉด, TypeError๋ฅผ TypeError๋กœ throw ํ•œ๋‹ค.

    3. ํŒŒ์‹ฑ ๊ฒฐ๊ณผ๋กœ ์–ป์€ ๊ฐ entry๋ฅผ entry list์— appendํ•˜๋Š”, ์ƒˆ FormData ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    ์œ„๋Š” `multipart/form-data` ์ฒ˜๋ฆฌ์— ํ•„์š”ํ•œ ๋Œ€๋žต์  ์„ค๋ช…์ด๋ฉฐ, ๋” ์ƒ์„ธํ•œ ํŒŒ์‹ฑ ๋ช…์„ธ๋Š” ์ž‘์„ฑ๋˜์–ด์•ผ ํ•œ๋‹ค. ์ž์›๋ด‰์‚ฌ ํ™˜์˜.

    "application/x-www-form-urlencoded"
    1. entries๋ฅผ parsing bytes์˜ ๊ฒฐ๊ณผ๋กœ ํ•œ๋‹ค.

    2. entry list๊ฐ€ entries์ธ, ์ƒˆ FormData ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. TypeError๋ฅผ TypeError๋กœ throwํ•œ๋‹ค.

json() ๋ฉ”์„œ๋“œ์˜ ๋‹จ๊ณ„๋Š”, consume body๋ฅผ this์™€ ๋ฐ”์ดํŠธ๋กœ๋ถ€ํ„ฐ JSON ํŒŒ์‹ฑ์„ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์œ„ ๋ฉ”์„œ๋“œ๋Š” SyntaxError๋กœ reject๋  ์ˆ˜ ์žˆ๋‹ค.

text() ๋ฉ”์„œ๋“œ์˜ ๋‹จ๊ณ„๋Š”, consume body๋ฅผ this์™€ UTF-8 ๋””์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

textStream() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. this๊ฐ€ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ์ด๋ฉด, TypeError๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

  2. this์˜ body๊ฐ€ null์ด๋ฉด:

    1. emptyStream์„ this์˜ ๊ด€๋ จ ์˜์—ญ์— ์žˆ๋Š” ์ƒˆ ReadableStream์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. emptyStream์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. emptyStream์„ ๋‹ซ์Šต๋‹ˆ๋‹ค.

    4. emptyStream์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. stream์„ this์˜ body์˜ stream์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  4. decoder๋ฅผ this์˜ ๊ด€๋ จ ์˜์—ญ์— ์žˆ๋Š” ์ƒˆ TextDecoderStream ๊ฐ์ฒด๋กœ ๋‘ก๋‹ˆ๋‹ค.

  5. decoder๋ฅผ UTF-8๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    ์ด๋Š” `Content-Type` ํ—ค๋”์˜ ์กด์žฌ ์—ฌ๋ถ€๋‚˜ ๊ฐ’์— ๊ด€๊ณ„์—†์ด, ๊ทธ๋ฆฌ๊ณ  `charset` ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์กด์žฌ ์—ฌ๋ถ€๋‚˜ ๊ฐ’์— ๊ด€๊ณ„์—†์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

  6. stream์„ decoder๋ฅผ ํ†ตํ•ด ํŒŒ์ดํ”„ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

5.4. Request ํด๋ž˜์Šค

typedef (Request or USVString) RequestInfo;

[Exposed=(Window,Worker)]
interface Request {
  constructor(RequestInfo input, optional RequestInit init = {});

  readonly attribute ByteString method;
  readonly attribute USVString url;
  [SameObject] readonly attribute Headers headers;

  readonly attribute RequestDestination destination;
  readonly attribute USVString referrer;
  readonly attribute ReferrerPolicy referrerPolicy;
  readonly attribute RequestMode mode;
  readonly attribute RequestCredentials credentials;
  readonly attribute RequestCache cache;
  readonly attribute RequestRedirect redirect;
  readonly attribute DOMString integrity;
  readonly attribute boolean keepalive;
  readonly attribute boolean isReloadNavigation;
  readonly attribute boolean isHistoryNavigation;
  readonly attribute AbortSignal signal;
  readonly attribute RequestDuplex duplex;

  [NewObject] Request clone();
};
Request includes Body;

dictionary RequestInit {
  ByteString method;
  HeadersInit headers;
  BodyInit? body;
  USVString referrer;
  ReferrerPolicy referrerPolicy;
  RequestMode mode;
  RequestCredentials credentials;
  RequestCache cache;
  RequestRedirect redirect;
  DOMString integrity;
  boolean keepalive;
  AbortSignal? signal;
  RequestDuplex duplex;
  RequestPriority priority;
  any window; // can only be set to null
};

enum RequestDestination { "", "audio", "audioworklet", "document", "embed", "font", "frame", "iframe", "image", "json", "manifest", "object", "paintworklet", "report", "script", "sharedworker", "style", "text", "track", "video", "worker", "xslt" };
enum RequestMode { "navigate", "same-origin", "no-cors", "cors" };
enum RequestCredentials { "omit", "same-origin", "include" };
enum RequestCache { "default", "no-store", "reload", "no-cache", "force-cache", "only-if-cached" };
enum RequestRedirect { "follow", "error", "manual" };
enum RequestDuplex { "half" };
enum RequestPriority { "high", "low", "auto" };

"serviceworker"๋Š” JavaScript์—์„œ ๊ด€์ฐฐํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ RequestDestination์—์„œ ์ƒ๋žต๋ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ตฌํ˜„์—์„œ๋Š” ์—ฌ์ „ํžˆ destination์œผ๋กœ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. "websocket"๊ณผ "webtransport"๋Š” JavaScript์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฑฐ๋‚˜ ๊ด€์ฐฐํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ RequestMode์—์„œ ์ƒ๋žต๋ฉ๋‹ˆ๋‹ค.

Request ๊ฐ์ฒด๋Š” request(request ๊ฐ์ฒด)์„ ๊ฐ€์ง„๋‹ค.

Request ๊ฐ์ฒด๋Š” ๋˜ํ•œ headers(null ๋˜๋Š” Headers ๊ฐ์ฒด, ์ดˆ๊ธฐ๊ฐ’์€ null)์„ ๊ฐ€์ง„๋‹ค.

Request ๊ฐ์ฒด๋Š” signal(null ๋˜๋Š” AbortSignal ๊ฐ์ฒด, ์ดˆ๊ธฐ๊ฐ’์€ null)์„ ๊ฐ€์ง„๋‹ค.

Request ๊ฐ์ฒด์˜ body๋Š” request์˜ body์ด๋‹ค.


request = new Request(input [, init])

์ƒˆ request๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, input์ด ๋ฌธ์ž์—ด์ผ ๊ฒฝ์šฐ url ์†์„ฑ์€ input์ด ๋œ๋‹ค. input์ด Request ๊ฐ์ฒด์ผ ๊ฒฝ์šฐ, url ์†์„ฑ์€ input์˜ ๊ฐ’์ด ๋œ๋‹ค.

init ์ธ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์†์„ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด์ด๋‹ค:

method
request์˜ method๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฌธ์ž์—ด.
headers
Headers ๊ฐ์ฒด, ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด, ๋˜๋Š” 2-์š”์†Œ ๋ฐฐ์—ด์˜ ๋ฐฐ์—ด๋กœ, request์˜ headers๋ฅผ ์„ค์ •.
body
BodyInit ๊ฐ์ฒด ๋˜๋Š” null. request์˜ body๋ฅผ ์„ค์ •.
referrer
๋™์ผ ์ถœ์ฒ˜ URL, "about:client", ๋˜๋Š” ๋นˆ ๋ฌธ์ž์—ด์ด์–ด์•ผ ํ•˜๋ฉฐ, request์˜ referrer๋ฅผ ์„ค์ •.
referrerPolicy
referrer policy์ด๋ฉฐ, request์˜ referrerPolicy๋ฅผ ์„ค์ •.
mode
ํ•ด๋‹น ์š”์ฒญ์ด CORS๋ฅผ ์‚ฌ์šฉํ• ์ง€, ๋™์ผ ์ถœ์ฒ˜๋กœ ์ œํ•œํ• ์ง€๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฌธ์ž์—ด. request์˜ mode๋ฅผ ์„ค์ •. input์ด ๋ฌธ์ž์—ด์ด๋ฉด, ๊ธฐ๋ณธ๊ฐ’์€ "cors"์ž„.
credentials
์ž๊ฒฉ ์ฆ๋ช…์„ ํ•ญ์ƒ, ์ ˆ๋Œ€, ๋˜๋Š” ๋™์ผ ์ถœ์ฒ˜๋กœ๋งŒ ๋ณด๋‚ผ์ง€ ์—ฌ๋ถ€์™€, ์‘๋‹ต์—์„œ ๋ฐ›์€ ์ž๊ฒฉ ์ฆ๋ช…์„ ์‚ฌ์šฉํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฌธ์ž์—ด. request์˜ credentials๋ฅผ ์„ค์ •. input์ด ๋ฌธ์ž์—ด์ด๋ฉด, ๊ธฐ๋ณธ๊ฐ’์€ "same-origin"์ž„.
cache
ํ•ด๋‹น ์š”์ฒญ์ด ๋ธŒ๋ผ์šฐ์ €์˜ ์บ์‹œ์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์ง€์ •ํ•˜๋Š” ๋ฌธ์ž์—ด๋กœ, request์˜ cache๋ฅผ ์„ค์ •.
redirect
request๊ฐ€ ๋ฆฌ๋””๋ ‰์…˜์„ ๋”ฐ๋ฅผ์ง€, ์—๋Ÿฌ๋กœ ์ฒ˜๋ฆฌํ• ์ง€, ๋˜๋Š” ๋ฆฌ๋””๋ ‰์…˜(opaque ๋ฐฉ์‹)์œผ๋กœ ๋ฐ˜ํ™˜ํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฌธ์ž์—ด. request์˜ redirect๋ฅผ ์„ค์ •.
integrity
request๋กœ ๊ฐ€์ ธ์˜ฌ ๋ฆฌ์†Œ์Šค์˜ ์•”ํ˜ธํ™” ํ•ด์‹œ๊ฐ’. request์˜ integrity๋ฅผ ์„ค์ •.
keepalive
๋ถˆ๋ฆฌ์–ธ ๊ฐ’์œผ๋กœ, request์˜ keepalive๋ฅผ ์„ค์ •.
signal
AbortSignal ๋ฅผ ๋ฐ›์•„ request์˜ signal๋ฅผ ์„ค์ •.
window
null๋งŒ ํ—ˆ์šฉ๋˜๋ฉฐ, request๋ฅผ ์–ด๋–ค Window์™€๋„ ์—ฐ๊ด€์‹œํ‚ค์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋จ.
duplex
"half"๋งŒ ์œ ํšจํ•˜๋ฉฐ, ์š”์ฒญ ์ „์ฒด๋ฅผ ๋ณด๋‚ธ ๋’ค ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” half-duplex fetch ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ์‚ฌ์šฉ. "full"์€ ๋ฏธ๋ž˜์˜ full-duplex fetch(์š”์ฒญ ์ „์ฒด๋ฅผ ๋ณด๋‚ด๊ธฐ ์ „์—๋„ ์‘๋‹ต์„ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ)๋ฅผ ์œ„ํ•ด ์˜ˆ์•ฝ๋จ. body ๊ฐ€ ReadableStream ๊ฐ์ฒด์ธ ๊ฒฝ์šฐ ์ด ์†์„ฑ์„ ๋ฐ˜๋“œ์‹œ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค. "full" ๊ด€๋ จ ๋…ผ์˜๋Š” issue #1254 ์ฐธ๊ณ .
priority
๋ฌธ์ž์—ด๋กœ, request์˜ priority๋ฅผ ์„ค์ •.
request . method
request์˜ HTTP method๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ๊ธฐ๋ณธ๊ฐ’์€ "GET"์ž„.
request . url
request์˜ URL์„ ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜.
request . headers
request์— ์—ฐ๊ฒฐ๋œ ํ—ค๋”๋ฅผ ๋‹ด์€ Headers ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜. ๋„คํŠธ์›Œํฌ ๊ณ„์ธต์—์„œ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๊ฐ€ ์ถ”๊ฐ€ํ•˜๋Š” ํ—ค๋”(์˜ˆ: "Host")๋Š” ์—ฌ๊ธฐ์„œ๋Š” ๋ฐ˜์˜๋˜์ง€ ์•Š๋Š”๋‹ค.
request . destination
request๊ฐ€ ์š”์ฒญํ•˜๋Š” ๋ฆฌ์†Œ์Šค์˜ ์ข…๋ฅ˜(์˜ˆ: "document" ๋˜๋Š” "script")๋ฅผ ๋ฐ˜ํ™˜.
request . referrer
request์˜ referrer๋ฅผ ๋ฐ˜ํ™˜. init์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋™์ผ ์ถœ์ฒ˜ URL ๋˜๋Š” ๋นˆ ๋ฌธ์ž์—ด, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด "about:client"์ด ๋œ๋‹ค. fetch ์ค‘์—๋Š” ์‹ค์ œ ์š”์ฒญ์˜ `Referer` ํ—ค๋” ๊ฐ’์„ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋จ.
request . referrerPolicy
request์— ์—ฐ๊ฒฐ๋œ referrer policy๋ฅผ ๋ฐ˜ํ™˜. fetch ์ค‘ request์˜ referrer ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ ์“ฐ์ž„.
request . mode
request์— ์—ฐ๊ฒฐ๋œ mode๋ฅผ ๋ฐ˜ํ™˜. CORS๋ฅผ ์‚ฌ์šฉํ• ์ง€, ๋™์ผ ์ถœ์ฒ˜๋กœ ์ œํ•œํ• ์ง€์— ๋Œ€ํ•œ ๋ฌธ์ž์—ด์ž„.
request . credentials
request์— ์—ฐ๊ฒฐ๋œ credentials mode๋ฅผ ๋ฐ˜ํ™˜. ์ž๊ฒฉ ์ฆ๋ช…์„ ํ•ญ์ƒ, ์ ˆ๋Œ€ ํ˜น์€ ๋™์ผ ์ถœ์ฒ˜์—๋งŒ ๋ณด๋‚ผ์ง€ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด์ž„.
request . cache
request์— ์—ฐ๊ฒฐ๋œ cache mode๋ฅผ ๋ฐ˜ํ™˜. fetch ์‹œ ๋ธŒ๋ผ์šฐ์ €์˜ ์บ์‹œ์™€ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ• ์ง€์— ๋Œ€ํ•œ ๋ฌธ์ž์—ด์ž„.
request . redirect
request์— ์—ฐ๊ด€๋œ redirect mode๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ์ด ๊ฐ’์€ ์š”์ฒญ์˜ ๋ฆฌ๋””๋ ‰์…˜์ด fetch ๋„์ค‘ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋ ์ง€ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. request๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฆฌ๋””๋ ‰์…˜์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
request . integrity
request๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๋ฆฌ์†Œ์Šค์˜ ๋ฌด๊ฒฐ์„ฑ ๊ฒ€์ฆ์šฉ ์•”ํ˜ธ ํ•ด์‹œ(metadata) ๋ฐ˜ํ™˜. ๊ฐ’์€ ์—ฌ๋Ÿฌ ํ•ด์‹œ๊ฐ€ ๊ณต๋ฐฑ ๋ฌธ์ž๋กœ ๊ตฌ๋ถ„๋œ ๋ฌธ์ž์—ด. [SRI]
request . keepalive
request๊ฐ€ ์ƒ์„ฑ๋œ ์ „์—ญ(global) ํ™˜๊ฒฝ์ด ์ข…๋ฃŒ๋˜์–ด๋„ ํ•ด๋‹น ์š”์ฒญ์ด ์‚ด์•„๋‚จ์„ ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ true/false ์—ฌ๋ถ€ ๋ฐ˜ํ™˜.
request . isReloadNavigation
request๊ฐ€ ์ƒˆ๋กœ๊ณ ์นจ ๋„ค๋น„๊ฒŒ์ด์…˜์šฉ์ธ์ง€ true/false๋กœ ๋ฐ˜ํ™˜.
request . isHistoryNavigation
request๊ฐ€ ํžˆ์Šคํ† ๋ฆฌ ๋„ค๋น„๊ฒŒ์ด์…˜(์ฆ‰, ๋’ค๋กœ/์•ž์œผ๋กœ)์ด์—ˆ๋Š”์ง€ true/false๋กœ ๋ฐ˜ํ™˜.
request . signal
request์™€ ์—ฐ๊ฒฐ๋œ AbortSignal ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜. ํ•ด๋‹น ๊ฐ์ฒด๋Š” request๊ฐ€ abort(์ทจ์†Œ)๋˜์—ˆ๋Š”์ง€ ๋ฐ abort ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋‚˜ํƒ€๋ƒ„.
request . duplex
"half"๋ฅผ ๋ฐ˜ํ™˜. ์ฆ‰, ์š”์ฒญ ์ „์ฒด๋ฅผ ๋ณด๋‚ธ ๋‹ค์Œ์— ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” half-duplex fetch์ž„์„ ์˜๋ฏธ. ๋ฏธ๋ž˜์—๋Š” "full"๋„ ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ์Œ. ์ฆ‰, ์š”์ฒญ์ด ๋๋‚˜๊ธฐ ์ „์— ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” full-duplex fetch๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜๋„ ์žˆ์Œ. "full" ๊ด€๋ จ ๋‚ด์šฉ์€ issue #1254 ์ฐธ๊ณ .
request . clone()

request์˜ ๋ณต์ œ๋ณธ์„ ๋ฐ˜ํ™˜.


์ƒ์„ฑ์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด, Request ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ, request request, headers guard guard, AbortSignal ๊ฐ์ฒด signal, ๊ทธ๋ฆฌ๊ณ  realm realm์„ ๋ฐ›์•„ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค:

  1. requestObject๋ฅผ ์ƒˆ๋กœ์šด Request ๊ฐ์ฒด๋กœ realm๊ณผ ํ•จ๊ป˜ ์ƒ์„ฑํ•œ๋‹ค.

  2. requestObject์˜ request๋ฅผ request๋กœ ์„ค์ •ํ•œ๋‹ค.

  3. requestObject์˜ headers๋ฅผ ์ƒˆ๋กœ์šด Headers ๊ฐ์ฒด๋กœ realm๊ณผ ํ•จ๊ป˜ ์ƒ์„ฑํ•˜๋ฉฐ, ํ—ค๋” ๋ฆฌ์ŠคํŠธ๋Š” request์˜ ํ—ค๋” ๋ฆฌ์ŠคํŠธ๋กœ, guard๋Š” guard๋กœ ์„ค์ •ํ•œ๋‹ค.

  4. requestObject์˜ signal์„ signal๋กœ ์„ค์ •ํ•œ๋‹ค.

  5. requestObject๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


new Request(input, init) ์ƒ์„ฑ์ž ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. request๋ฅผ null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. fallbackMode๋ฅผ null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. baseURL์„ this์˜ ๊ด€๋ จ ์„ค์ • ๊ฐ์ฒด์˜ API ๊ธฐ๋ณธ URL๋กœ ๋‘ก๋‹ˆ๋‹ค.

  4. signal์„ null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  5. input์ด ๋ฌธ์ž์—ด์ด๋ฉด:

    1. parsedURL์„ input์„ baseURL๊ณผ ํ•จ๊ป˜ ํŒŒ์‹ฑํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. parsedURL์ด ์‹คํŒจ์ด๋ฉด, TypeError๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

    3. parsedURL์ด ์ž๊ฒฉ ์ฆ๋ช…์„ ํฌํ•จํ•˜๋ฉด, TypeError๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

    4. request๋ฅผ ์š”์ฒญ์˜ ์ƒˆ ์ธ์Šคํ„ด์Šค๋กœ ์„ค์ •ํ•˜๊ณ , ๊ทธ URL์€ parsedURL๋กœ ํ•ฉ๋‹ˆ๋‹ค.

    5. fallbackMode๋ฅผ "cors"๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด:

    1. Assert: input์€ Request ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.

    2. request๋ฅผ input์˜ request๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. signal์„ input์˜ signal๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  7. origin์„ this์˜ ๊ด€๋ จ ์„ค์ • ๊ฐ์ฒด์˜ origin์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  8. traversableForUserPrompts๋ฅผ "client"๋กœ ๋‘ก๋‹ˆ๋‹ค.

  9. request์˜ ์‚ฌ์šฉ์ž ํ”„๋กฌํ”„ํŠธ์šฉ traversable์ด ํ™˜๊ฒฝ ์„ค์ • ๊ฐ์ฒด์ด๊ณ  ๊ทธ origin์ด origin๊ณผ ๋™์ผ ์ถœ์ฒ˜์ด๋ฉด, traversableForUserPrompts๋ฅผ request์˜ ์‚ฌ์šฉ์ž ํ”„๋กฌํ”„ํŠธ์šฉ traversable๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  10. init["window"]๊ฐ€ ์กด์žฌํ•˜๊ณ  null์ด ์•„๋‹ˆ๋ฉด, TypeError๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

  11. init["window"]๊ฐ€ ์กด์žฌํ•˜๋ฉด, traversableForUserPrompts๋ฅผ "no-traversable"๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  12. request๋ฅผ ๋‹ค์Œ ์†์„ฑ์„ ๊ฐ–๋Š” ์ƒˆ ์š”์ฒญ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค:

    URL
    request์˜ URL.
    method
    request์˜ method.
    header list
    request์˜ header list์˜ ๋ณต์‚ฌ๋ณธ.
    unsafe-request flag
    ์„ค์ •๋จ.
    client
    This์˜ ๊ด€๋ จ ์„ค์ • ๊ฐ์ฒด.
    traversable for user prompts
    traversableForUserPrompts.
    internal priority
    request์˜ internal priority.
    origin
    request์˜ origin. ์ด origin์˜ ์ „ํŒŒ๋Š” ์„œ๋น„์Šค ์›Œ์ปค๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ํƒ์ƒ‰ ์š”์ฒญ์—์„œ๋งŒ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์š”์ฒญ์€ ํ˜„์žฌ ํด๋ผ์ด์–ธํŠธ์™€ ๋‹ค๋ฅธ origin์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    referrer
    request์˜ referrer.
    referrer policy
    request์˜ referrer policy.
    mode
    request์˜ mode.
    credentials mode
    request์˜ credentials mode.
    cache mode
    request์˜ cache mode.
    redirect mode
    request์˜ redirect mode.
    integrity metadata
    request์˜ integrity metadata.
    keepalive
    request์˜ keepalive.
    reload-navigation flag
    request์˜ reload-navigation flag.
    history-navigation flag
    request์˜ history-navigation flag.
    URL list
    request์˜ URL list์˜ ํด๋ก .
    initiator type
    "fetch".
  13. init์ด ๋น„์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด:

    1. request์˜ mode๊ฐ€ "navigate"์ด๋ฉด, ์ด๋ฅผ "same-origin"์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. request์˜ reload-navigation flag๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

    3. request์˜ history-navigation flag๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

    4. request์˜ origin์„ "client"๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    5. request์˜ referrer๋ฅผ "client"๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    6. request์˜ referrer policy๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    7. request์˜ URL์„ request์˜ current URL๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    8. request์˜ URL list๋ฅผ ยซ request์˜ URL ยป๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    ์ด๋Š” ์„œ๋น„์Šค ์›Œ์ปค๊ฐ€ ์š”์ฒญ์„ "๋ฆฌ๋””๋ ‰์…˜"ํ•˜๊ณ , ์˜ˆ๋ฅผ ๋“ค์–ด ๊ต์ฐจ ์ถœ์ฒ˜ ์Šคํƒ€์ผ ์‹œํŠธ ์•ˆ์˜ ์ด๋ฏธ์ง€์—์„œ ์˜จ ์š”์ฒญ์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒฝ์šฐ, ๊ทธ ์š”์ฒญ์ด ๋” ์ด์ƒ ์›๋ž˜ ์†Œ์Šค(์ฆ‰, ๊ต์ฐจ ์ถœ์ฒ˜ ์Šคํƒ€์ผ ์‹œํŠธ)์—์„œ ์˜จ ๊ฒƒ์œผ๋กœ ๋ณด์ด์ง€ ์•Š๊ณ  ๋Œ€์‹  ๊ทธ ์š”์ฒญ์„ "๋ฆฌ๋””๋ ‰์…˜"ํ•œ ์„œ๋น„์Šค ์›Œ์ปค์—์„œ ์˜จ ๊ฒƒ์œผ๋กœ ๋ณด์ด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์›๋ž˜ ์†Œ์Šค๊ฐ€ ์„œ๋น„์Šค ์›Œ์ปค์™€ ๋™์ผํ•œ ์ข…๋ฅ˜์˜ ์š”์ฒญ์กฐ์ฐจ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋Š” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์›๋ž˜ ์†Œ์Šค๋ฅผ ์‹ ๋ขฐํ•˜๋Š” ์„œ๋น„์Šค๋Š” ์ด ์ฒ˜๋ฆฌ๊ฐ€ ์—†๋‹ค๋ฉด ์•…์šฉ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋Š” ๋‹ค์†Œ ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ์Šต๋‹ˆ๋‹ค.

  14. init["referrer"]๊ฐ€ ์กด์žฌํ•˜๋ฉด:

    1. referrer๋ฅผ init["referrer"]๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. referrer๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด, request์˜ referrer๋ฅผ "no-referrer"๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด:

      1. parsedReferrer๋ฅผ referrer๋ฅผ baseURL๊ณผ ํ•จ๊ป˜ ํŒŒ์‹ฑํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

      2. parsedReferrer๊ฐ€ ์‹คํŒจ์ด๋ฉด, TypeError๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

      3. ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ฐธ์ด๋ฉด

        • parsedReferrer์˜ scheme์ด "about"์ด๊ณ  path๊ฐ€ ๋ฌธ์ž์—ด "client"์ธ ๊ฒฝ์šฐ

        • parsedReferrer์˜ origin์ด origin๊ณผ ๋™์ผ ์ถœ์ฒ˜๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ

        ๊ทธ๋Ÿฌ๋ฉด request์˜ referrer๋ฅผ "client"๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

      4. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, request์˜ referrer๋ฅผ parsedReferrer๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  15. init["referrerPolicy"]๊ฐ€ ์กด์žฌํ•˜๋ฉด, request์˜ referrer policy๋ฅผ ๊ทธ๊ฒƒ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  16. mode๋ฅผ init["mode"]๊ฐ€ ์กด์žฌํ•˜๋ฉด ๊ทธ๊ฒƒ์œผ๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด fallbackMode๋กœ ๋‘ก๋‹ˆ๋‹ค.

  17. mode๊ฐ€ "navigate"์ด๋ฉด, TypeError๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

  18. mode๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, request์˜ mode๋ฅผ mode๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  19. init["credentials"]๊ฐ€ ์กด์žฌํ•˜๋ฉด, request์˜ credentials mode๋ฅผ ๊ทธ๊ฒƒ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  20. init["cache"]๊ฐ€ ์กด์žฌํ•˜๋ฉด, request์˜ cache mode๋ฅผ ๊ทธ๊ฒƒ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  21. request์˜ cache mode๊ฐ€ "only-if-cached"์ด๊ณ  request์˜ mode๊ฐ€ "same-origin"์ด ์•„๋‹ˆ๋ฉด, TypeError๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

  22. init["redirect"]๊ฐ€ ์กด์žฌํ•˜๋ฉด, request์˜ redirect mode๋ฅผ ๊ทธ๊ฒƒ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  23. init["integrity"]๊ฐ€ ์กด์žฌํ•˜๋ฉด, request์˜ integrity metadata๋ฅผ ๊ทธ๊ฒƒ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  24. init["keepalive"]๊ฐ€ ์กด์žฌํ•˜๋ฉด, request์˜ keepalive๋ฅผ ๊ทธ๊ฒƒ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  25. init["method"]๊ฐ€ ์กด์žฌํ•˜๋ฉด:

    1. method๋ฅผ init["method"]๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. method๊ฐ€ method๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜ method๊ฐ€ ๊ธˆ์ง€๋œ method์ด๋ฉด, TypeError๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

    3. method๋ฅผ ์ •๊ทœํ™”ํ•ฉ๋‹ˆ๋‹ค.

    4. request์˜ method๋ฅผ method๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  26. init["signal"]๊ฐ€ ์กด์žฌํ•˜๋ฉด, signal์„ ๊ทธ๊ฒƒ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  27. init["priority"]๊ฐ€ ์กด์žฌํ•˜๋ฉด:

    1. request์˜ internal priority๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, request์˜ internal priority๋ฅผ ๊ตฌํ˜„ ์ •์˜ ๋ฐฉ์‹์œผ๋กœ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, request์˜ priority๋ฅผ init["priority"]๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  28. this์˜ request๋ฅผ request๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  29. signals๋ฅผ signal์ด null์ด ์•„๋‹ˆ๋ฉด ยซ signal ยป๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ยซ ยป๋กœ ๋‘ก๋‹ˆ๋‹ค.

  30. this์˜ signal์„ signals์—์„œ AbortSignal๊ณผ this์˜ ๊ด€๋ จ ์˜์—ญ์„ ์‚ฌ์šฉํ•ด ์ข…์† abort signal์„ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  31. this์˜ headers๋ฅผ this์˜ ๊ด€๋ จ ์˜์—ญ์„ ๊ฐ–๋Š” ์ƒˆ Headers ๊ฐ์ฒด๋กœ ์„ค์ •ํ•˜๋ฉฐ, ๊ทธ header list๋Š” request์˜ header list์ด๊ณ  guard๋Š” "request"์ž…๋‹ˆ๋‹ค.

  32. this์˜ request์˜ mode๊ฐ€ "no-cors"์ด๋ฉด:

    1. this์˜ request์˜ method๊ฐ€ CORS-safelisted method๊ฐ€ ์•„๋‹ˆ๋ฉด, TypeError๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

    2. this์˜ headers์˜ guard๋ฅผ "request-no-cors"๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  33. init์ด ๋น„์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด:

    ์ด mode์—์„œ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ํ—ค๋”๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ headers๊ฐ€ ์ •๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ด์ „์— ์ •๋ฆฌ๋˜์—ˆ๊ฑฐ๋‚˜ ๊ถŒํ•œ ์žˆ๋Š” API์— ์˜ํ•ด ์„ค์ •๋œ ์ดํ›„ ์ˆ˜์ •๋˜์ง€ ์•Š์€ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

    1. headers๋ฅผ this์˜ headers์™€ ๊ทธ ์—ฐ๊ฒฐ๋œ header list์˜ ๋ณต์‚ฌ๋ณธ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. init["headers"]๊ฐ€ ์กด์žฌํ•˜๋ฉด, headers๋ฅผ init["headers"]๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. this์˜ headers์˜ header list๋ฅผ ๋น„์›๋‹ˆ๋‹ค.

    4. headers๊ฐ€ Headers ๊ฐ์ฒด์ด๋ฉด, ๊ทธ header list์˜ ๊ฐ header์— ๋Œ€ํ•ด for each๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ, header๋ฅผ this์˜ headers์— ๋ง๋ถ™์ธ๋‹ค.

    5. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, this์˜ headers๋ฅผ headers๋กœ ์ฑ„์›๋‹ˆ๋‹ค.

  34. inputBody๋ฅผ input์ด Request ๊ฐ์ฒด์ด๋ฉด input์˜ request์˜ body๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  35. init["body"]๊ฐ€ ์กด์žฌํ•˜๊ณ  null์ด ์•„๋‹ˆ๊ฑฐ๋‚˜ inputBody๊ฐ€ null์ด ์•„๋‹ˆ๋ฉฐ, request์˜ method๊ฐ€ `GET` ๋˜๋Š” `HEAD`์ด๋ฉด, TypeError๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

  36. initBody๋ฅผ null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  37. init["body"]๊ฐ€ ์กด์žฌํ•˜๊ณ  null์ด ์•„๋‹ˆ๋ฉด:

    1. bodyWithType์„ request์˜ keepalive๋กœ ์„ค์ •๋œ keepalive์™€ ํ•จ๊ป˜ init["body"]๋ฅผ ์ถ”์ถœํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. initBody๋ฅผ bodyWithType์˜ body๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. type์„ bodyWithType์˜ type์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

    4. type์ด null์ด ์•„๋‹ˆ๊ณ  this์˜ headers์˜ header list๊ฐ€ `Content-Type`์„ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฉด, (`Content-Type`, type)์„ this์˜ headers์— appendํ•ฉ๋‹ˆ๋‹ค.

  38. inputOrInitBody๋ฅผ initBody๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด ๊ทธ๊ฒƒ์œผ๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด inputBody๋กœ ๋‘ก๋‹ˆ๋‹ค.

  39. inputOrInitBody๊ฐ€ null์ด ์•„๋‹ˆ๊ณ  inputOrInitBody์˜ source๊ฐ€ null์ด๋ฉด:

    1. initBody๊ฐ€ null์ด ์•„๋‹ˆ๊ณ  init["duplex"]๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด, TypeError๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

    2. this์˜ request์˜ mode๊ฐ€ "same-origin"๋„ "cors"๋„ ์•„๋‹ˆ๋ฉด, TypeError๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

    3. this์˜ request์˜ use-CORS-preflight flag๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  40. finalBody๋ฅผ inputOrInitBody๋กœ ๋‘ก๋‹ˆ๋‹ค.

  41. initBody๊ฐ€ null์ด๊ณ  inputBody๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด:

    1. inputBody๊ฐ€ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉด, TypeError๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

    2. finalBody๋ฅผ inputBody์— ๋Œ€ํ•œ ํ”„๋ก์‹œ ์ƒ์„ฑ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  42. this์˜ request์˜ body๋ฅผ finalBody๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

The method getter ๋‹จ๊ณ„๋Š” this์˜ request์˜ method๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

The url getter ๋‹จ๊ณ„๋Š” this์˜ request์˜ URL์„ ์ง๋ ฌํ™”ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

The headers getter ๋‹จ๊ณ„๋Š” this์˜ headers๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

The destination getter ๋‹จ๊ณ„๋Š” this์˜ request์˜ destination์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

The referrer getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. this์˜ request์˜ referrer๊ฐ€ "no-referrer"์ด๋ฉด, ๋นˆ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. this์˜ request์˜ referrer๊ฐ€ "client"์ด๋ฉด, "about:client"๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. this์˜ request์˜ referrer๋ฅผ ์ง๋ ฌํ™”ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

The referrerPolicy getter ๋‹จ๊ณ„๋Š” this์˜ request์˜ referrer policy๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

The mode getter ๋‹จ๊ณ„๋Š” this์˜ request์˜ mode๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

The credentials getter ๋‹จ๊ณ„๋Š” this์˜ request์˜ credentials mode๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

The cache getter ๋‹จ๊ณ„๋Š” this์˜ request์˜ cache mode๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

The redirect getter ๋‹จ๊ณ„๋Š” this์˜ request์˜ redirect mode๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

The integrity getter ๋‹จ๊ณ„๋Š” this์˜ request์˜ integrity metadata๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

The keepalive getter ๋‹จ๊ณ„๋Š” this์˜ request์˜ keepalive๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

The isReloadNavigation getter ๋‹จ๊ณ„๋Š” this์˜ request์˜ reload-navigation flag๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

The isHistoryNavigation getter ๋‹จ๊ณ„๋Š” true if this์˜ request์˜ history-navigation flag๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

The signal getter ๋‹จ๊ณ„๋Š” this์˜ signal์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

This์˜ signal์€ ํ•ญ์ƒ constructor์—์„œ, ๊ทธ๋ฆฌ๊ณ  cloningํ•  ๋•Œ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.

The duplex getter ๋‹จ๊ณ„๋Š” "half"๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


The clone() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. this๊ฐ€ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉด, TypeError๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

  2. clonedRequest๋ฅผ this์˜ request๋ฅผ ๋ณต์ œํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. Assert: this์˜ signal์€ null์ด ์•„๋‹™๋‹ˆ๋‹ค.

  4. clonedSignal์„ ยซ this์˜ signal ยป์—์„œ AbortSignal๊ณผ this์˜ ๊ด€๋ จ ์˜์—ญ์„ ์‚ฌ์šฉํ•ด ์ข…์† abort signal์„ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  5. clonedRequestObject๋ฅผ clonedRequest, this์˜ headers์˜ guard, clonedSignal ๋ฐ this์˜ ๊ด€๋ จ ์˜์—ญ์ด ์ฃผ์–ด์ง„ ์ƒํƒœ์—์„œ Request ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  6. clonedRequestObject๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

5.5. Response ํด๋ž˜์Šค

[Exposed=(Window,Worker)]
interface Response {
  constructor(optional BodyInit? body = null, optional ResponseInit init = {});

  [NewObject] static Response error();
  [NewObject] static Response redirect(USVString url, optional unsigned short status = 302);
  [NewObject] static Response json(any data, optional ResponseInit init = {});

  readonly attribute ResponseType type;

  readonly attribute USVString url;
  readonly attribute boolean redirected;
  readonly attribute unsigned short status;
  readonly attribute boolean ok;
  readonly attribute ByteString statusText;
  [SameObject] readonly attribute Headers headers;

  [NewObject] Response clone();
};
Response includes Body;

dictionary ResponseInit {
  unsigned short status = 200;
  ByteString statusText = "";
  HeadersInit headers;
};

enum ResponseType { "basic", "cors", "default", "error", "opaque", "opaqueredirect" };

Response ๊ฐ์ฒด์—๋Š” ์—ฐ๊ด€๋œ response๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(ํ•˜๋‚˜์˜ response).

Response ๊ฐ์ฒด์—๋Š” ๋˜ํ•œ ์—ฐ๊ด€๋œ headers๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(null ๋˜๋Š” Headers ๊ฐ์ฒด), ์ดˆ๊ธฐ๊ฐ’์€ null์ž…๋‹ˆ๋‹ค.

Response ๊ฐ์ฒด์˜ body๋Š” ๊ทธ response์˜ body์ž…๋‹ˆ๋‹ค.


response = new Response(body = null [, init])

body๋ฅผ body๋กœ ๊ฐ€์ง€๋ฉฐ, status, status message ๋ฐ headers๊ฐ€ init์— ์˜ํ•ด ์ œ๊ณต๋˜๋Š” Response๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

response = Response . error()

๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜ Response๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

response = Response . redirect(url, status = 302)

status ์ƒํƒœ๋กœ url๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๋Š” ๋ฆฌ๋””๋ ‰์…˜ Response๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

response = Response . json(data [, init])

body๊ฐ€ JSON์œผ๋กœ ์ธ์ฝ”๋”ฉ๋œ data์ด๊ณ , status, status message ๋ฐ headers๊ฐ€ init์— ์˜ํ•ด ์ œ๊ณต๋˜๋Š” Response๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

response . type

response์˜ type์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: "cors".

response . url

response์— URL์ด ์žˆ์œผ๋ฉด ๊ทธ URL์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋นˆ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

response . redirected

response๊ฐ€ ๋ฆฌ๋””๋ ‰์…˜์„ ํ†ตํ•ด ์–ป์–ด์กŒ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

response . status

response์˜ status๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

response . ok

response์˜ status๊ฐ€ ok status์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

response . statusText

response์˜ status message๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

response . headers

response์˜ headers๋ฅผ Headers๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

response . clone()

response์˜ ๋ณต์ œ๋ณธ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.


response response, headers guard guard, ๊ทธ๋ฆฌ๊ณ  realm realm์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, Response ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. responseObject๋ฅผ realm์„ ๊ฐ–๋Š” ์ƒˆ Response ๊ฐ์ฒด๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. responseObject์˜ response๋ฅผ response๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  3. responseObject์˜ headers๋ฅผ realm์„ ๊ฐ–๋Š” ์ƒˆ Headers ๊ฐ์ฒด๋กœ ์„ค์ •ํ•˜๋ฉฐ, ๊ทธ headers list๋Š” response์˜ headers list์ด๊ณ  guard๋Š” guard์ž…๋‹ˆ๋‹ค.

  4. responseObject๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Response ๊ฐ์ฒด response, ResponseInit init, ๊ทธ๋ฆฌ๊ณ  null ๋˜๋Š” body with type body๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, response๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋ ค๋ฉด:

  1. init["status"]๊ฐ€ 200๋ถ€ํ„ฐ 599๊นŒ์ง€(ํฌํ•จ) ๋ฒ”์œ„์— ์žˆ์ง€ ์•Š์œผ๋ฉด, RangeError๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

  2. init["statusText"]๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๊ณ  reason-phrase ํ† ํฐ ์ƒ์„ฑ์‹๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด, TypeError๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

  3. response์˜ response์˜ status๋ฅผ init["status"]๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. response์˜ response์˜ status message๋ฅผ init["statusText"]๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. init["headers"]๊ฐ€ ์กด์žฌํ•˜๋ฉด, response์˜ headers๋ฅผ init["headers"]๋กœ ์ฑ„์›๋‹ˆ๋‹ค.

  6. body๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด:

    1. response์˜ status๊ฐ€ null body status์ด๋ฉด, TypeError๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

      101๊ณผ 103์€ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— null body status์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    2. response์˜ body๋ฅผ body์˜ body๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    3. body์˜ type์ด null์ด ์•„๋‹ˆ๊ณ  response์˜ header list๊ฐ€ `Content-Type`์„ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฉด, (`Content-Type`, body์˜ type)์„ response์˜ header list์— appendํ•ฉ๋‹ˆ๋‹ค.


new Response(body, init) ์ƒ์„ฑ์ž ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. this์˜ response๋ฅผ ์ƒˆ response๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. this์˜ headers๋ฅผ this์˜ ๊ด€๋ จ ์˜์—ญ์„ ๊ฐ–๋Š” ์ƒˆ Headers ๊ฐ์ฒด๋กœ ์„ค์ •ํ•˜๋ฉฐ, ๊ทธ header list๋Š” this์˜ response์˜ header list์ด๊ณ  guard๋Š” "response"์ž…๋‹ˆ๋‹ค.

  3. bodyWithType์„ null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  4. body๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, bodyWithType์„ body๋ฅผ ์ถ”์ถœํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. this, init, ๊ทธ๋ฆฌ๊ณ  bodyWithType์ด ์ฃผ์–ด์ง„ ์ƒํƒœ์—์„œ response๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

์ •์  error() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ์ƒˆ network error, "immutable", ๊ทธ๋ฆฌ๊ณ  current realm์ด ์ฃผ์–ด์ง„ ์ƒํƒœ์—์„œ Response ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ •์  redirect(url, status) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. parsedURL์„ url์„ current settings object์˜ API base URL๊ณผ ํ•จ๊ป˜ ํŒŒ์‹ฑํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. parsedURL์ด ์‹คํŒจ์ด๋ฉด, TypeError๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

  3. status๊ฐ€ redirect status๊ฐ€ ์•„๋‹ˆ๋ฉด, RangeError๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

  4. responseObject๋ฅผ ์ƒˆ response, "immutable", ๊ทธ๋ฆฌ๊ณ  current realm์ด ์ฃผ์–ด์ง„ ์ƒํƒœ์—์„œ Response ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  5. responseObject์˜ response์˜ status๋ฅผ status๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. value๋ฅผ parsedURL์ด ์ง๋ ฌํ™”๋˜๊ณ  ๋™ํ˜• ์ธ์ฝ”๋”ฉ๋œ ๊ฒƒ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  7. (`Location`, value)์„ responseObject์˜ response์˜ header list์— Appendํ•ฉ๋‹ˆ๋‹ค.

  8. responseObject๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ •์  json(data, init) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. bytes๋ฅผ data์— ๋Œ€ํ•ด JavaScript ๊ฐ’์„ JSON ๋ฐ”์ดํŠธ๋กœ ์ง๋ ฌํ™”๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. body๋ฅผ bytes๋ฅผ ์ถ”์ถœํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. responseObject๋ฅผ ์ƒˆ response, "response", ๊ทธ๋ฆฌ๊ณ  current realm์ด ์ฃผ์–ด์ง„ ์ƒํƒœ์—์„œ Response ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  4. responseObject, init, ๊ทธ๋ฆฌ๊ณ  (body, "application/json")์ด ์ฃผ์–ด์ง„ ์ƒํƒœ์—์„œ response๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

  5. responseObject๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

type getter ๋‹จ๊ณ„๋Š” this์˜ response์˜ type์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

url getter ๋‹จ๊ณ„๋Š” this์˜ response์˜ URL์ด null์ด๋ฉด ๋นˆ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด this์˜ response์˜ URL์„, exclude fragment๋ฅผ true๋กœ ์„ค์ •ํ•˜์—ฌ ์ง๋ ฌํ™”ํ•œ ๊ฒƒ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

redirected getter ๋‹จ๊ณ„๋Š” this์˜ response์˜ URL list์˜ size๊ฐ€ 1๋ณด๋‹ค ํฌ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฆฌ๋””๋ ‰์…˜์˜ ๊ฒฐ๊ณผ์ธ responses๋ฅผ ํ•„ํ„ฐ๋งํ•˜๋ ค๋ฉด, ์˜ˆ๋ฅผ ๋“ค์–ด fetch(url, { redirect:"error" })์ฒ˜๋Ÿผ API๋ฅผ ํ†ตํ•ด ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜์‹ญ์‹œ์˜ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ž ์žฌ์ ์œผ๋กœ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ response๊ฐ€ ์šฐ๋ฐœ์ ์œผ๋กœ ๋ˆ„์ถœ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

status getter ๋‹จ๊ณ„๋Š” this์˜ response์˜ status๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ok getter ๋‹จ๊ณ„๋Š” this์˜ response์˜ status๊ฐ€ ok status์ด๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

statusText getter ๋‹จ๊ณ„๋Š” this์˜ response์˜ status message๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

headers getter ๋‹จ๊ณ„๋Š” this์˜ headers๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


clone() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. this๊ฐ€ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉด, TypeError๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

  2. clonedResponse๋ฅผ this์˜ response๋ฅผ ๋ณต์ œํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. clonedResponse, this์˜ headers์˜ guard, ๊ทธ๋ฆฌ๊ณ  this์˜ ๊ด€๋ จ ์˜์—ญ์ด ์ฃผ์–ด์ง„ ์ƒํƒœ์—์„œ Response ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

5.6. fetch ๋ฉ”์„œ๋“œ

partial interface mixin WindowOrWorkerGlobalScope {
  [NewObject] Promise<Response> fetch(RequestInfo input, optional RequestInit init = {});
};

dictionary DeferredRequestInit : RequestInit {
  DOMHighResTimeStamp activateAfter;
};

[Exposed=Window]
interface FetchLaterResult {
  readonly attribute boolean activated;
};

partial interface Window {
  [NewObject, SecureContext] FetchLaterResult fetchLater(RequestInfo input, optional DeferredRequestInit init = {});
};

fetch(input, init) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. p๋ฅผ ์ƒˆ promise๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. requestObject๋ฅผ Request์˜ ์ดˆ๊ธฐ๊ฐ’์„ input๊ณผ init์„ ์ธ์ˆ˜๋กœ ํ•˜์—ฌ constructor๋กœ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์˜ˆ์™ธ๋ฅผ throwํ•˜๋ฉด, p๋ฅผ ๊ทธ ์˜ˆ์™ธ๋กœ rejectํ•˜๊ณ  p๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. request๋ฅผ requestObject์˜ request๋กœ ๋‘ก๋‹ˆ๋‹ค.

  4. requestObject์˜ signal์ด aborted์ด๋ฉด, ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

    1. p, request, null ๋ฐ requestObject์˜ signal์˜ abort reason์œผ๋กœ fetch() ํ˜ธ์ถœ์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

    2. p๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  5. globalObject๋ฅผ request์˜ client์˜ global object๋กœ ๋‘ก๋‹ˆ๋‹ค.
  6. globalObject๊ฐ€ ServiceWorkerGlobalScope ๊ฐ์ฒด์ด๋ฉด, request์˜ service-workers mode๋ฅผ "none"์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  7. responseObject๋ฅผ null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  8. relevantRealm์„ this์˜ ๊ด€๋ จ ์˜์—ญ์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  9. locallyAborted๋ฅผ false๋กœ ๋‘ก๋‹ˆ๋‹ค.

    ์ด๋Š” ์ค‘๋‹จ ์š”์ฒญ์ด fetch ํ˜ธ์ถœ๊ณผ ๊ฐ™์€ ์Šค๋ ˆ๋“œ์—์„œ ์˜ค๋Š” ๊ฒฝ์šฐ, ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ํƒ€์ด๋ฐ์œผ๋กœ promise๋ฅผ rejectํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

  10. controller๋ฅผ null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  11. requestObject์˜ signal์— ๋‹ค์Œ abort ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค:

    1. locallyAborted๋ฅผ true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    2. Assert: controller๋Š” null์ด ์•„๋‹™๋‹ˆ๋‹ค.

    3. controller๋ฅผ requestObject์˜ signal์˜ abort reason์œผ๋กœ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

    4. p, request, responseObject, ๊ทธ๋ฆฌ๊ณ  requestObject์˜ signal์˜ abort reason์œผ๋กœ fetch() ํ˜ธ์ถœ์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

  12. controller๋ฅผ request์™€, response๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‹ค์Œ ๋‹จ๊ณ„์ธ processResponse๊ฐ€ ์ฃผ์–ด์ง„ ์ƒํƒœ์—์„œ fetch๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค:

    1. locallyAborted๊ฐ€ true์ด๋ฉด, ์ด ๋‹จ๊ณ„๋ฅผ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

    2. response์˜ aborted flag๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด:

      1. deserializedError๋ฅผ controller์˜ serialized abort reason๊ณผ relevantRealm์ด ์ฃผ์–ด์ง„ ์ƒํƒœ์—์„œ serialized abort reason์„ ์—ญ์ง๋ ฌํ™”ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

      2. p, request, responseObject, ๊ทธ๋ฆฌ๊ณ  deserializedError๋กœ fetch() ํ˜ธ์ถœ์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

      3. ์ด ๋‹จ๊ณ„๋ฅผ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

    3. response๊ฐ€ network error์ด๋ฉด, p๋ฅผ TypeError๋กœ rejectํ•˜๊ณ  ์ด ๋‹จ๊ณ„๋ฅผ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

    4. responseObject๋ฅผ response, "immutable", ๊ทธ๋ฆฌ๊ณ  relevantRealm์ด ์ฃผ์–ด์ง„ ์ƒํƒœ์—์„œ Response ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    5. p๋ฅผ responseObject๋กœ resolveํ•ฉ๋‹ˆ๋‹ค.

  13. p๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

promise, request, responseObject, ๊ทธ๋ฆฌ๊ณ  error๋กœ fetch() ํ˜ธ์ถœ์„ ์ค‘๋‹จํ•˜๋ ค๋ฉด:

  1. promise๋ฅผ error๋กœ rejectํ•ฉ๋‹ˆ๋‹ค.

    promise๊ฐ€ ์ด๋ฏธ fulfilled๋œ ๊ฒฝ์šฐ ์ด๋Š” no-op์ž…๋‹ˆ๋‹ค.

  2. request์˜ body๊ฐ€ null์ด ์•„๋‹ˆ๊ณ  readable์ด๋ฉด, request์˜ body๋ฅผ error๋กœ cancelํ•ฉ๋‹ˆ๋‹ค.

  3. responseObject๊ฐ€ null์ด๋ฉด ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. response๋ฅผ responseObject์˜ response๋กœ ๋‘ก๋‹ˆ๋‹ค.

  5. response์˜ body๊ฐ€ null์ด ์•„๋‹ˆ๊ณ  readable์ด๋ฉด, response์˜ body๋ฅผ error๋กœ error ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

FetchLaterResult์—๋Š” ์—ฐ๊ด€๋œ activated getter steps๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ด๋Š” boolean์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.

activated getter ๋‹จ๊ณ„๋Š” this์˜ activated getter steps๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

fetchLater(input, init) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. requestObject๋ฅผ Request์˜ ์ดˆ๊ธฐ๊ฐ’์„ input๊ณผ init์„ ์ธ์ˆ˜๋กœ ํ•˜์—ฌ constructor๋กœ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. requestObject์˜ signal์ด aborted์ด๋ฉด, signal์˜ abort reason์„ throwํ•ฉ๋‹ˆ๋‹ค.

  3. request๋ฅผ requestObject์˜ request๋กœ ๋‘ก๋‹ˆ๋‹ค.

  4. activateAfter๋ฅผ null๋กœ ๋‘ก๋‹ˆ๋‹ค.

  5. init์ด ์ฃผ์–ด์ง€๊ณ  init["activateAfter"]๊ฐ€ ์กด์žฌํ•˜๋ฉด, activateAfter๋ฅผ init["activateAfter"]๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  6. activateAfter๊ฐ€ 0๋ณด๋‹ค ์ž‘์œผ๋ฉด, RangeError๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

  7. this์˜ ๊ด€๋ จ global object์˜ associated document๊ฐ€ fully active๊ฐ€ ์•„๋‹ˆ๋ฉด, TypeError๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

  8. request์˜ URL์˜ scheme์ด HTTP(S) scheme์ด ์•„๋‹ˆ๋ฉด, TypeError๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

  9. request์˜ URL์ด potentially trustworthy URL์ด ์•„๋‹ˆ๋ฉด, TypeError๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

  10. request์˜ body๊ฐ€ null์ด ์•„๋‹ˆ๊ณ , request์˜ body์˜ length๊ฐ€ null์ด๋ฉด, TypeError๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

    body๊ฐ€ ReadableStream ๊ฐ์ฒด์ธ ์š”์ฒญ์€ ์ง€์—ฐ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  11. quota๋ฅผ request์˜ client์™€ request์˜ URL์˜ origin์ด ์ฃผ์–ด์ง„ ์ƒํƒœ์—์„œ์˜ available deferred-fetch quota๋กœ ๋‘ก๋‹ˆ๋‹ค.

  12. requested๋ฅผ request์˜ total request length๋กœ ๋‘ก๋‹ˆ๋‹ค.

  13. quota๊ฐ€ requested๋ณด๋‹ค ์ž‘์œผ๋ฉด, quota๊ฐ€ quota์ด๊ณ  requested๊ฐ€ requested์ธ QuotaExceededError๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

  14. activated๋ฅผ false๋กœ ๋‘ก๋‹ˆ๋‹ค.

  15. deferredRecord๋ฅผ request, activateAfter, ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„, ์ฆ‰ activated๋ฅผ true๋กœ ์„ค์ •ํ•˜๋Š” ๋‹จ๊ณ„๊ฐ€ ์ฃผ์–ด์ง„ ์ƒํƒœ์—์„œ deferred fetch๋ฅผ ํ์— ๋„ฃ๊ธฐ๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  16. requestObject์˜ signal์— ๋‹ค์Œ abort ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค: deferredRecord์˜ invoke state๋ฅผ "aborted"๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  17. activated getter steps๊ฐ€ activated๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ƒˆ FetchLaterResult๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ํ˜ธ์ถœ์€ ๋ฌธ์„œ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ๊ฐ€์ ธ์˜ฌ ์š”์ฒญ์„ ํ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค:

fetchLater("https://report.example.com", {
  method: "POST",
  body: JSON.stringify(myReport),
  headers: { "Content-Type": "application/json" }
})

๋‹ค์Œ ํ˜ธ์ถœ์€ 5์ดˆ ํ›„์—๋„ ์ด ์š”์ฒญ์„ ํ์— ์ถ”๊ฐ€ํ•˜๋ฉฐ, ๋ฐ˜ํ™˜๋œ ๊ฐ’์œผ๋กœ ํ˜ธ์ถœ์ž๊ฐ€ ์‹ค์ œ๋กœ ํ™œ์„ฑํ™”๋˜์—ˆ๋Š”์ง€ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๊ฐ€ ํƒ€์ด๋จธ๋ฅผ ์ œํ•œํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ์š”์ฒญ์€ ๋ฐ˜๋“œ์‹œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

const result = fetchLater("https://report.example.com", {
  method: "POST",
  body: JSON.stringify(myReport),
  headers: { "Content-Type": "application/json" },
  activateAfter: 5000
});

function check_if_fetched() {
  return result.activated;
}

FetchLaterResult ๊ฐ์ฒด๋Š” AbortSignal ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์‹œ:

let accumulated_events = [];
let previous_result = null;
const abort_signal = new AbortSignal();
function accumulate_event(event) {
  if (previous_result) {
    if (previous_result.activated) {
      // ์š”์ฒญ์ด ์ด๋ฏธ ํ™œ์„ฑํ™”๋˜์—ˆ์œผ๋ฏ€๋กœ, ์ƒˆ๋กญ๊ฒŒ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      accumulated_events = [];
    } else {
      // ์ด ์š”์ฒญ์„ ์ค‘๋‹จํ•˜๊ณ , ๋ชจ๋“  ์ด๋ฒคํŠธ๋กœ ์ƒˆ๋กœ์šด ์š”์ฒญ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
      signal.abort();
    }
  }

  accumulated_events.push(event);
  result = fetchLater("https://report.example.com", {
    method: "POST",
    body: JSON.stringify(accumulated_events),
    headers: { "Content-Type": "application/json" },
    activateAfter: 5000,
    abort_signal
  });
}

๋‹ค์Œ fetchLater() ํ˜ธ์ถœ์€ ๋ชจ๋‘ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค:

// ์˜ค์ง ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” URL๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค.
fetchLater("http://untrusted.example.com");

// ์ง€์—ฐ๋œ ์š”์ฒญ์˜ ๊ธธ์ด๋Š” ๋ฐ˜๋“œ์‹œ ๋ฏธ๋ฆฌ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
fetchLater("https://origin.example.com", {body: someDynamicStream});

// ์ง€์—ฐ๋œ fetch๋Š” ํ™œ์„ฑ ์œˆ๋„์šฐ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
const detachedWindow = iframe.contentWindow;
iframe.remove();
detachedWindow.fetchLater("https://origin.example.com");

์ง€์—ฐ fetch ํ• ๋‹น๋Ÿ‰ ์˜ˆ์‹œ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ์ง€์—ฐ fetch ํ• ๋‹น๋Ÿ‰์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5.7. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜

์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ์ข…๋ฃŒ๊ฐ€ ์Šคํฌ๋ฆฝํŠธ๋กœ ๊ด€์ฐฐ๋  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์ง„ํ–‰ ์ค‘์ธ fetch๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

"์Šคํฌ๋ฆฝํŠธ๋กœ ๊ด€์ฐฐ ๊ฐ€๋Šฅ"ํ•˜๋‹ค๋Š” ๊ฒƒ์€ fetch()์˜ ์ธ์ž์™€ ๋ฐ˜ํ™˜๊ฐ’์„ ํ†ตํ•ด ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ์„œ๋ฒ„์™€์˜ ์‚ฌ์ด๋“œ ์ฑ„๋„ ํ†ต์‹ ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ๋ฐฉ์‹์€ ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์„œ๋ฒ„๊ฐ€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋ก€๋Š” WebSocket ๋ฐ XMLHttpRequest ๊ฐ์ฒด์—์„œ ์ด๋ฏธ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ์ข…๋ฃŒ๊ฐ€ ๊ด€์ฐฐ๋  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ fetch๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

fetch("https://www.example.com/")

์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ์ข…๋ฃŒ๊ฐ€ promise๋ฅผ ํ†ตํ•ด ๊ด€์ฐฐ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ fetch๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

window.promise = fetch("https://www.example.com/")

์—ฐ๊ด€๋œ body๊ฐ€ ๊ด€์ฐฐ๋  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๊ฐ€ fetch๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

window.promise = fetch("https://www.example.com/").then(res => res.headers)

์ข…๋ฃŒ๊ฐ€ ๊ด€์ฐฐ๋  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๊ฐ€ fetch๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

fetch("https://www.example.com/").then(res => res.body.getReader().closed)

promise ๊ฐ์ฒด์— ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋“ฑ๋กํ•˜์—ฌ ์ข…๋ฃŒ๋ฅผ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๊ฐ€ fetch๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

window.promise = fetch("https://www.example.com/")
  .then(res => res.body.getReader().closed)

ํ•ธ๋“ค๋Ÿฌ ๋“ฑ๋ก์„ ํ†ตํ•ด ์ข…๋ฃŒ๊ฐ€ ๊ด€์ฐฐ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๊ฐ€ fetch๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

fetch("https://www.example.com/")
  .then(res => {
    res.body.getReader().closed.then(() => console.log("stream closed!"))
  })

(์œ„์˜ ๋น„๊ด€์ฐฐ์„ฑ ์˜ˆ์‹œ๋Š” body.getReader() ๋“ฑ ๋‚ด์žฅ ์†์„ฑ๊ณผ ํ•จ์ˆ˜๊ฐ€ ๋ฎ์–ด์จ์ง€์ง€ ์•Š์•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.)

6. data: URL

data: URL์— ๋Œ€ํ•œ ์„ค๋ช…์€ RFC 2397์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค. ์ด ์ ˆ์€ ๋ฐฐํฌ๋œ ์ปจํ…์ธ ์™€์˜ ํ˜ธํ™˜์„ ์œ„ํ•ด ํ•ด๋‹น RFC์˜ ํ‘œ์ค€ ์ฒ˜๋ฆฌ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. [RFC2397]

data: URL ๊ตฌ์กฐ์ฒด๋Š” ๊ตฌ์กฐ์ฒด์ด๋ฉฐ, MIME ํƒ€์ž… (MIME type)๊ณผ ๋ณธ๋ฌธ (๋ฐ”์ดํŠธ ์‹œํ€€์Šค)๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

data: URL ์ฒ˜๋ฆฌ๊ธฐ๋Š” URL dataURL์„ ๋ฐ›์•„ ์•„๋ž˜ ์ ˆ์ฐจ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. Assert: dataURL์˜ scheme์ด "data"์ž„์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

  2. input์„ URL serializer๋ฅผ dataURL์— ๋Œ€ํ•ด exclude fragment ์˜ต์…˜์„ true๋กœ ํ•˜์—ฌ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. input์—์„œ ๋งจ ์•ž์˜ "data:"๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

  4. position์„ input์˜ ์‹œ์ž‘ ์œ„์น˜๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

  5. mimeType์„, U+002C(,)์ด ์•„๋‹Œ ์ฝ”๋“œํฌ์ธํŠธ ์‹œํ€€์Šค๋ฅผ ์ˆ˜์ง‘ํ•˜์—ฌ position ๊ธฐ์ค€์œผ๋กœ ์–ป์Šต๋‹ˆ๋‹ค.

  6. ์„ ํ–‰/ํ›„ํ–‰ ASCII ๊ณต๋ฐฑ์„ mimeType์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    ์ด๊ฒƒ์€ U+0020(SPACE) ์ฝ”๋“œํฌ์ธํŠธ๋งŒ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

  7. position์ด input์˜ ๋์„ ์ง€๋‚œ ์œ„์น˜๋ผ๋ฉด, ์‹คํŒจ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  8. position์„ 1๋งŒํผ ์ฆ๊ฐ€์‹œํ‚ต๋‹ˆ๋‹ค.

  9. encodedBody๋ฅผ input์˜ ๋‚˜๋จธ์ง€๋กœ ๋‘ก๋‹ˆ๋‹ค.

  10. body๋ฅผ percent-decoding์„ encodedBody์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  11. mimeType์ด U+003B(;)๋กœ ๋๋‚˜๊ณ , ๊ทธ ๋’ค์— 0๊ฐœ ์ด์ƒ์˜ U+0020(SPACE), ๊ทธ ๋’ค์— "base64"์™€ ASCII ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์—†์ด ์ผ์น˜ํ•œ๋‹ค๋ฉด:

    1. stringBody๋ฅผ isomorphic decode๋ฅผ body์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

    2. body๋ฅผ forgiving-base64 decode๋ฅผ stringBody์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.

    3. body๊ฐ€ ์‹คํŒจ๋ผ๋ฉด ์‹คํŒจ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

    4. mimeType์˜ ๋งˆ์ง€๋ง‰ 6 ์ฝ”๋“œํฌ์ธํŠธ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    5. ํ›„ํ–‰ U+0020(SPACE) ์ฝ”๋“œํฌ์ธํŠธ๋ฅผ mimeType์—์„œ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    6. mimeType์˜ ๋งˆ์ง€๋ง‰ U+003B(;)๋„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

  12. mimeType์ด ";"๋กœ ์‹œ์ž‘ํ•˜๋ฉด, mimeType ์•ž์— "text/plain"์„ ๋ถ™์ž…๋‹ˆ๋‹ค.

  13. mimeTypeRecord๋ฅผ MIME ํƒ€์ž… ํŒŒ์‹ฑ์„ mimeType์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  14. mimeTypeRecord๊ฐ€ ์‹คํŒจ๋ผ๋ฉด, mimeTypeRecord๋ฅผ text/plain;charset=US-ASCII๋กœ ๋‘ก๋‹ˆ๋‹ค.

  15. ์•„๋ž˜ ํ•„๋“œ๋กœ ์ƒˆ data: URL ๊ตฌ์กฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค: MIME ํƒ€์ž…์€ mimeTypeRecord, ๋ณธ๋ฌธ์€ body์ž…๋‹ˆ๋‹ค.

๋ฐฐ๊ฒฝ ์ฝ๊ธฐ

์ด ์„น์…˜๊ณผ ํ•˜์œ„ ์„น์…˜๋“ค์€ ์ฐธ๊ณ ์šฉ์ž…๋‹ˆ๋‹ค.

HTTP ํ—ค๋” ๋ ˆ์ด์–ด ๊ตฌ๋ถ„

fetch ๊ด€์ ์—์„œ API ๋ ˆ์ด์–ด(HTML์˜ img, CSS์˜ background-image), ์ดˆ๊ธฐ fetch ๋ ˆ์ด์–ด, ์„œ๋น„์Šค ์›Œ์ปค ๋ ˆ์ด์–ด, ๋„คํŠธ์›Œํฌ & ์บ์‹œ ๋ ˆ์ด์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. `Accept` ๋ฐ `Accept-Language`๋Š” ์ดˆ๊ธฐ fetch ๋ ˆ์ด์–ด(์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ์— ์˜ํ•ด)์—์„œ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๊ฐ€ ์ œ์–ดํ•˜๋Š” ๋‹ค๋ฅธ ํ—ค๋”๋“ค, ์˜ˆ๋ฅผ ๋“ค์–ด `Accept-Encoding`, `Host`, `Referer`๋Š” ๋„คํŠธ์›Œํฌ & ์บ์‹œ ๋ ˆ์ด์–ด์—์„œ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” API ๋ ˆ์ด์–ด ๋˜๋Š” ์„œ๋น„์Šค ์›Œ์ปค ๋ ˆ์ด์–ด(์ผ๋ฐ˜์ ์œผ๋กœ Request ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด)์—์„œ ํ—ค๋”๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ๊ธˆ์ง€๋œ ์š”์ฒญ ํ—ค๋”์— ๊ฑฐ์˜ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์œผ๋‚˜, `Accept`๋Š” ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ณ , `Referer`๋Š” ์ œํ•œํ•˜๊ฑฐ๋‚˜ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์›์ž์  HTTP ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์ฒ˜๋ฆฌ

๋ฆฌ๋‹ค์ด๋ ‰ํŠธ(์ฆ‰, response์˜ status ๋˜๋Š” internal response์˜(์žˆ๋Š” ๊ฒฝ์šฐ) status๊ฐ€ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์ƒํƒœ์ธ ๊ฒฝ์šฐ)๋Š” API์— ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฅผ ๋…ธ์ถœํ•˜๋ฉด ๊ต์ฐจ ์‚ฌ์ดํŠธ ์Šคํฌ๋ฆฝํŒ… ๊ณต๊ฒฉ์œผ๋กœ๋Š” ์–ป์„ ์ˆ˜ ์—†๋Š” ์ •๋ณด๋ฅผ ๋ˆ„์„คํ•  ์ˆ˜ ์žˆ๋‹ค.

https://example.org/auth๋กœ fetchํ•  ๋•Œ HttpOnly๋กœ ํ‘œ์‹œ๋œ Cookie๊ฐ€ ํฌํ•จ๋˜๋ฉด https://other-origin.invalid/4af955781ea1c84a3b11๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ƒˆ๋กœ์šด URL์—๋Š” ๋น„๋ฐ€์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋ฅผ ๋…ธ์ถœํ•˜๋ฉด ํ•ด๋‹น ๋น„๋ฐ€์ด ๊ต์ฐจ ์‚ฌ์ดํŠธ ์Šคํฌ๋ฆฝํŒ… ๊ณต๊ฒฉ์„ ํ†ตํ•ด ์–ป์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์•ˆ์ „ CORS ํ”„๋กœํ† ์ฝœ ์„ค์ •

IP ์ธ์ฆ ๋˜๋Š” ๋ฐฉํ™”๋ฒฝ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณดํ˜ธ๋˜๋Š” ๋ฆฌ์†Œ์Šค(์•„์ง๋„ ๊ฝค ํ”ํ•จ)์˜ ๊ฒฝ์šฐ CORS ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (์ด ๋•Œ๋ฌธ์— CORS ํ”„๋กœํ† ์ฝœ์ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.)

๊ทธ๋Ÿฌ๋‚˜, ๋‹ค์Œ ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค:

Access-Control-Allow-Origin: *

๋ฆฌ์†Œ์Šค๊ฐ€ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ฟ ํ‚ค๋‚˜ HTTP ์ธ์ฆ์— ๋”ฐ๋ผ ๋…ธ์ถœํ•œ๋‹ค ํ•ด๋„, ์œ„ ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ ์ •๋ณด๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. API(XMLHttpRequest ๋“ฑ)์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ curl, wget์—๋„ ๋™์ผํ•˜๊ฒŒ ๊ณต์œ ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, curl์ด๋‚˜ wget์œผ๋กœ ์›น์— ์—ฐ๊ฒฐ๋œ ์ž„์˜์˜ ์žฅ์น˜์—์„œ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์œ„ ํ—ค๋”๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ํฌํ•จํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

CORS ํ”„๋กœํ† ์ฝœ๊ณผ HTTP ์บ์‹œ

CORS ํ”„๋กœํ† ์ฝœ ์š”๊ตฌ์‚ฌํ•ญ์ด `Access-Control-Allow-Origin`์„ * ๋˜๋Š” ์ •์ ์ธ origin์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋ณต์žกํ•˜๋ฉด, `Vary`๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. [HTML] [HTTP] [HTTP-CACHING]

Vary: Origin

ํŠนํžˆ, `Vary`๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ  ์„œ๋ฒ„๊ฐ€ ํŠน์ • ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด CORS ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์—์„œ๋งŒ `Access-Control-Allow-Origin`์„ ๋ณด๋‚ด๋„๋ก ๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ์ƒ๊ฐํ•ด ๋ณด๋ผ. ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๊ฐ€ ๊ทธ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ non-CORS ์š”์ฒญ์˜ ์‘๋‹ต์„ ๋ฐ›์œผ๋ฉด(์˜ˆ๋ฅผ ๋“ค์–ด ๋‚ด๋น„๊ฒŒ์ด์…˜ ์š”์ฒญ์˜ ๊ฒฐ๊ณผ๋กœ), ๊ทธ ์‘๋‹ต์—๋Š” `Access-Control-Allow-Origin`์ด ์—†๊ณ  ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ๊ทธ ์‘๋‹ต์„ ์บ์‹œํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ดํ›„ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๊ฐ€ ๊ทธ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ CORS ์š”์ฒญ์„ ๋งˆ์ฃผ์น˜๋ฉด, ์ด์ „ non-CORS ์š”์ฒญ์—์„œ ์˜จ ๊ทธ ์บ์‹œ๋œ ์‘๋‹ต์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉฐ, ๊ฑฐ๊ธฐ์—๋Š” `Access-Control-Allow-Origin`์ด ์—†๋‹ค.

ํ•˜์ง€๋งŒ ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋™์ผํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ `Vary: Origin`์ด ์‚ฌ์šฉ๋˜๋ฉด, ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๊ฐ€ `Access-Control-Allow-Origin`์„ ํฌํ•จํ•˜๋Š” ์‘๋‹ต์„ fetchํ•˜๊ฒŒ ํ•˜๋ฉฐ, `Access-Control-Allow-Origin`์ด ์—†๋Š” ์ด์ „ non-CORS ์š”์ฒญ์˜ ์บ์‹œ๋œ ์‘๋‹ต์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ๊ทธ๋ ‡๊ฒŒ ํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ `Access-Control-Allow-Origin`์ด ํŠน์ • ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด * ๋˜๋Š” ์ •์ ์ธ origin์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค๋ฉด, ๊ทธ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์‘๋‹ต์—์„œ non-CORS ์š”์ฒญ๋ฟ ์•„๋‹ˆ๋ผ CORS ์š”์ฒญ์— ๋Œ€ํ•ด์„œ๋„ ํ•ญ์ƒ `Access-Control-Allow-Origin`์„ ๋ณด๋‚ด๋„๋ก ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ , `Vary`๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ.

์›น์†Œ์ผ“(WebSockets)

์—ฐ๊ฒฐ์„ ์„ค์ •ํ•˜๋Š” ๊ณผ์ •์—์„œ WebSocket ๊ฐ์ฒด๋Š” ํŠน๋ณ„ํ•œ ์ข…๋ฅ˜์˜ fetch๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค(์—ฌ๊ธฐ์„œ request์˜ mode๊ฐ€ "websocket"์ž„). ์ด๋ฅผ ํ†ตํ•ด ๋งŽ์€ fetch ์ •์ฑ… ๊ฒฐ์ •(์˜ˆ: HTTP Strict Transport Security (HSTS))์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ถ๊ทน์ ์œผ๋กœ fetch๋Š” WebSockets์— ํ˜ธ์ถœ๋˜์–ด ์ „์šฉ ์—ฐ๊ฒฐ์„ ํš๋“ํ•˜๊ฒŒ ๋œ๋‹ค. [WEBSOCKETS] [HSTS]

๊ณผ๊ฑฐ์—๋Š” Fetch์—์„œ WebSocket ์—ฐ๊ฒฐ ํš๋“ํ•˜๊ธฐ์™€ WebSocket ์—ฐ๊ฒฐ ์„ค์ •ํ•˜๊ธฐ๋ฅผ ์ง์ ‘ ์ •์˜ํ–ˆ์œผ๋‚˜, ํ˜„์žฌ๋Š” ๋‘˜ ๋‹ค WebSockets์—์„œ ์ •์˜๋œ๋‹ค. [WEBSOCKETS]

๋‹ค๋ฅธ ํ‘œ์ค€์—์„œ fetch ์‚ฌ์šฉํ•˜๊ธฐ

๋ณธ์งˆ์ ์œผ๋กœ fetch๋ž€ request์™€ response์˜ ๊ตํ™˜์ด๋‹ค. ์‹ค์ œ๋กœ๋Š” ํ‘œ์ค€์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋„์ž…ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ์— ๋‹ค์†Œ ๋ณต์žกํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค. ์ด ์ ˆ์—์„œ๋Š” ์ด์— ๋Œ€ํ•œ ์กฐ์–ธ์„ ์ œ๊ณตํ•œ๋‹ค.

ํ•ญ์ƒ ๋„๋ฉ”์ธ ์ „๋ฌธ๊ฐ€์˜ ๋ฆฌ๋ทฐ๋ฅผ ์š”์ฒญํ•˜์„ธ์š”.

์ž‘์—… ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.

์š”์ฒญ ์„ค์ •ํ•˜๊ธฐ

fetch์˜ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” request๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ทธ ํ•ญ๋ชฉ๋“ค(items)์„ ์ฑ„์›Œ๋„ฃ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์š”์ฒญ์˜ URL๊ณผ method๋ฅผ HTTP์—์„œ ์ •์˜ํ•œ ๋Œ€๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค. `POST` ๋˜๋Š” `PUT` ์š”์ฒญ์— body๊ฐ€ ํ•„์š”ํ•˜๋ฉด, ์š”์ฒญ์˜ body๋ฅผ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๋กœ ์„ค์ •ํ•˜๊ฑฐ๋‚˜, ๊ทธ stream์ด ์ง์ ‘ ๋งŒ๋“  ReadableStream์ธ ์ƒˆ body๋กœ ์„ค์ •ํ•œ๋‹ค. [HTTP]

์š”์ฒญ์˜ destination์€ destination table์˜ ์ง€์นจ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ ํƒํ•œ๋‹ค. Destinations๋Š” Content Security Policy์— ์˜ํ–ฅ์„ ์ฃผ๋ฉฐ `Sec-Fetch-Dest` ํ—ค๋”์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ์˜ํ–ฅ๋„ ์žˆ์œผ๋ฏ€๋กœ, ๋‹จ์ˆœํ•œ ์ •๋ณด ์ œ๊ณต์šฉ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ค‘์š”ํ•˜๋‹ค. ์ƒˆ ๊ธฐ๋Šฅ์— destination์ด ํ•„์š”ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์ด destination table์— ์—†๋‹ค๋ฉด, ๋…ผ์˜๋ฅผ ์œ„ํ•ด ์ด์Šˆ๋ฅผ ์ œ์ถœํ•˜๋ผ. [CSP]

์š”์ฒญ์˜ client๋ฅผ ์ž‘์—… ์ค‘์ธ ํ™˜๊ฒฝ ์„ค์ • ๊ฐ์ฒด๋กœ ์„ค์ •ํ•œ๋‹ค. ์›น์— ๋…ธ์ถœ๋˜๋Š” API๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ Web IDL๋กœ ์ •์˜๋˜๋ฉฐ, ์—ฌ๊ธฐ์„œ interface๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ชจ๋“  ๊ฐ์ฒด์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” relevant settings object๊ฐ€ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์š”์ฒญ์ด ์š”์†Œ์™€ ์—ฐ๊ด€๋˜์–ด ์žˆ๋‹ค๋ฉด, ๊ทธ ์š”์ฒญ์˜ client๋ฅผ ์š”์†Œ์˜ node document์˜ relevant settings object๋กœ ์„ค์ •ํ•˜๊ฒŒ ๋œ๋‹ค. JavaScript, HTML, CSS ๋˜๋Š” ๋‹ค๋ฅธ Document ํ•˜์œ„ ๋ฆฌ์†Œ์Šค์— ์˜ํ•ด ์ง์ ‘ ์›น์— ๋…ธ์ถœ๋˜๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ์—๋Š” client๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

fetching์ด ์ง์ ‘ ์›น์— ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์˜ˆ๋ฅผ ๋“ค์–ด ํ˜„์žฌ Window ๋˜๋Š” Worker์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ „์†ก๋œ๋‹ค๋ฉด, ์š”์ฒญ์˜ client๋ฅผ null๋กœ ๋‘๊ณ , ๋Œ€์‹  ์š”์ฒญ์˜ origin, policy container, service-workers mode, ๊ทธ๋ฆฌ๊ณ  referrer๋ฅผ ์ ์ ˆํ•œ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฏธ๋ฆฌ ํ™˜๊ฒฝ ์„ค์ • ๊ฐ์ฒด์—์„œ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋” ๊ณ ๊ธ‰ ์‚ฌ๋ก€์—์„œ๋Š” fetch๊ฐ€ Content Security Policy์™€ referrer policy๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€์— ๊ด€ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ๋ช…ํ™•ํžˆ ํ•ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ ์ฝœ๋ฐฑ (fetch ํ˜ธ์ถœ ๋ฐ ์‘๋‹ต ์ฒ˜๋ฆฌ ์ฐธ์กฐ)์ด parallel queue์— ๊ฒŒ์‹œ๋˜๋ฏ€๋กœ, ๋™์‹œ์„ฑ๋„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค. [REFERRER] [CSP]

๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€ ๊นŠ์ด ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค. ์ผ๋ถ€ ๊ธฐ๋Šฅ์€ same origin์—์„œ๋งŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ฒฝ์šฐ ์š”์ฒญ์˜ mode๋ฅผ "same-origin"์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ์ƒˆ๋กœ ์›น์— ๋…ธ์ถœ๋˜๋Š” ๊ธฐ๋Šฅ์€ ๊ฑฐ์˜ ํ•ญ์ƒ ๊ทธ mode๋ฅผ "cors"๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค. ๊ธฐ๋Šฅ์ด ์›น์— ๋…ธ์ถœ๋˜์ง€ ์•Š๊ฑฐ๋‚˜, CORS ์—†์ด ๊ต์ฐจ ์ถœ์ฒ˜ ๋ฆฌ์†Œ์Šค๋ฅผ fetchํ•ด์•ผ ํ•˜๋Š” ๋‹ค๋ฅธ ์ด์œ ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด, ๋…ผ์˜๋ฅผ ์œ„ํ•ด ์ด์Šˆ๋ฅผ ์ œ์ถœํ•˜๋ผ.

๊ต์ฐจ ์ถœ์ฒ˜ ์š”์ฒญ์˜ ๊ฒฝ์šฐ, ์ž๊ฒฉ ์ฆ๋ช…์„ ์š”์ฒญ์— ํฌํ•จํ• ์ง€ ์—ฌ๋ถ€๋„ ๊ฒฐ์ •ํ•˜๋ฉฐ, ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์š”์ฒญ์˜ credentials mode๋ฅผ "include"๋กœ ์„ค์ •ํ•œ๋‹ค.

fetch๊ฐ€ Resource Timing์— ๋ณด๊ณ ๋˜์–ด์•ผ ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค initiator type์œผ๋กœ ๋ณด๊ณ ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•œ๋‹ค. initiator type์„ ์š”์ฒญ์— ์ „๋‹ฌํ•˜๋ฉด, fetch๊ฐ€ ์™„๋ฃŒ๋˜๊ณ  ์‘๋‹ต์ด ์™„์ „ํžˆ ๋‹ค์šด๋กœ๋“œ๋œ ๋’ค Resource Timing์— ๋Œ€ํ•œ ๋ณด๊ณ ๊ฐ€ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค. [RESOURCE-TIMING]

์š”์ฒญ์— ์ถ”๊ฐ€ HTTP ํ—ค๋”๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด, ๊ทธ header list๋ฅผ ํ•ด๋‹น ํ—ค๋”๋“ค์„ ํฌํ•จํ•˜๋Š” header list๋กœ ์„ค์ •ํ•œ๋‹ค. ์˜ˆ: ยซ (`My-Header-Name`, `My-Header-Value`) ยป. ์‚ฌ์šฉ์ž ์ง€์ • ํ—ค๋”๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ์€ CORS-preflight fetch๊ฐ€ ํ•„์š”ํ•ด์ง€๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜ํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๋ผ.

๊ธฐ๋ณธ ์บ์‹ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์žฌ์ •์˜ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์˜ˆ๋ฅผ ๋“ค์–ด ์ด ์š”์ฒญ์— ๋Œ€ํ•œ ์บ์‹ฑ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด, ์š”์ฒญ์˜ cache mode๋ฅผ "default"๊ฐ€ ์•„๋‹Œ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

์š”์ฒญ์ด ๋ฆฌ๋””๋ ‰์…˜์„ ์ง€์›ํ•˜๊ฒŒ ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. ์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๊ทธ redirect mode๋ฅผ "error"๋กœ ์„ค์ •ํ•œ๋‹ค.

์š”์ฒญ์˜ ๋‚˜๋จธ์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์„ ์‚ดํŽด๋ณด๊ณ  ๋‹ค๋ฅธ ๊ด€๋ จ ์‚ฌํ•ญ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ๋‚˜๋จธ์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์€ ๋œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ฃผ๋กœ ํŠน์ˆ˜ํ•œ ๋ชฉ์ ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๊ณ , ์ด ํ‘œ์ค€์˜ ยง 2.2.5 Requests ์ ˆ์—์„œ ์ž์„ธํžˆ ๋ฌธ์„œํ™”๋˜์–ด ์žˆ๋‹ค.

fetch ํ˜ธ์ถœ ๋ฐ ์‘๋‹ต ์ฒ˜๋ฆฌ

์š”์ฒญ ์™ธ์—๋„ fetch ์ž‘์—…์€ ์—ฌ๋Ÿฌ ์„ ํƒ์  ์ธ์ˆ˜๋ฅผ ๋ฐ›๋Š”๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ฐ›๋Š” ์ธ์ˆ˜์˜ ๊ฒฝ์šฐ: ๊ทธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ task์—์„œ ํ˜ธ์ถœ๋œ๋‹ค(๋˜๋Š” parallel queue์—์„œ ํ˜ธ์ถœ๋œ๋‹ค. useParallelQueue๊ฐ€ true์ธ ๊ฒฝ์šฐ).

์š”์ฒญ์ด ์„ค์ •๋˜๋ฉด, fetch์— ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ „๋‹ฌํ• ์ง€ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด, ์‘๋‹ต์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์€์ง€, ํŠนํžˆ ์–ด๋–ค ๋‹จ๊ณ„์—์„œ ์ฝœ๋ฐฑ์„ ๋ฐ›๊ณ  ์‹ถ์€์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค:

์™„๋ฃŒ ์‹œ

์ด๋Š” ๋Œ€๋ถ€๋ถ„์˜ ํ˜ธ์ถœ์ž๊ฐ€ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด scripts์™€ style resources๊ฐ€ ๊ทธ๋ ‡๋‹ค. ์‘๋‹ต์˜ body๋Š” ์ „์ฒด๊ฐ€ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๋กœ ์ฝํžŒ ๋’ค, ํ˜ธ์ถœ์ž๊ฐ€ ์ฒ˜๋ฆฌํ•œ๋‹ค.

์™„๋ฃŒ ์‹œ ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด, ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ fetch์˜ processResponseConsumeBody ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ๋‹ค. ์ฃผ์–ด์ง„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋Š” ์‘๋‹ต๊ณผ ์™„์ „ํžˆ ์ฝํžŒ body (์‘๋‹ต์˜ ๋‚ด๋ถ€ ์‘๋‹ต์˜ ๊ฒƒ)๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ธ์ˆ˜๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜์˜ ๊ฐ’์€ ๋‹ค์Œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค:

null
์‘๋‹ต์˜ body๊ฐ€ null์ด๋‹ค. ์ด๋Š” ์‘๋‹ต์ด network error์ด๊ฑฐ๋‚˜ null body status๋ฅผ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
failure
์‘๋‹ต์˜ body ๋‚ด์šฉ์„ ์™„์ „ํžˆ ์ฝ์œผ๋ ค๋Š” ์‹œ๋„๊ฐ€ ์‹คํŒจํ–ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด I/O ์˜ค๋ฅ˜ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ๋‹ค.
๋ฐ”์ดํŠธ ์‹œํ€€์Šค

์‘๋‹ต์˜ ๋‚ด๋ถ€ ์‘๋‹ต์˜ body ๋‚ด์šฉ์„ ์™„์ „ํžˆ ์ฝ๊ธฐ๊ฐ€ ์„ฑ๊ณตํ–ˆ๋‹ค.

์ „์ฒด ๋‚ด์šฉ์„ ํฌํ•จํ•˜๋Š” ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๋Š” ์š”์ฒญ์˜ mode๊ฐ€ "no-cors"์ธ ๊ฒฝ์šฐ์—๋„ ์ „๋‹ฌ๋œ๋‹ค. ๊ทธ๋Ÿฌํ•œ ์ฝ˜ํ…์ธ ๋Š” ์š”์ฒญํ•˜๋Š” origin์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์–ด์•ผ ํ•˜๋ฏ€๋กœ, ํ˜ธ์ถœ์ž๋Š” ์ด๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ˜ธ์ถœ์ž๋Š” "no-cors" ์‘๋‹ต์˜ ๋‚ด์šฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€ ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ง์ ‘ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ ์ด๋ฏธ์ง€ ์ฝ˜ํ…์ธ ๋Š” ์ž„๋ฒ ๋”ฉ ๋ฌธ์„œ์˜ ์Šคํฌ๋ฆฝํŠธ์— ์ง์ ‘ ๋…ธ์ถœ๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค.

  1. request๋ฅผ ์š”์ฒญ์œผ๋กœ ๋‘๋ฉฐ, ๊ทธ URL์€ https://stuff.example.com/์ด๊ณ  client๋Š” this์˜ relevant settings object์ด๋‹ค.

  2. request๋ฅผ Fetchํ•˜๋˜, processResponseConsumeBody๋ฅผ ์‘๋‹ต response์™€ null, failure, ๋˜๋Š” ๋ฐ”์ดํŠธ ์‹œํ€€์Šค contents๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค:

    1. contents๊ฐ€ null ๋˜๋Š” failure์ด๋ฉด, ์‚ฌ์šฉ์ž์—๊ฒŒ ์˜ค๋ฅ˜๋ฅผ ํ‘œ์‹œํ•œ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, response์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ contents๋ฅผ ํŒŒ์‹ฑํ•˜๊ณ , ๊ทธ์— ๋Œ€ํ•ด ์ž์ฒด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

ํ—ค๋” ๋จผ์ €, ๊ทธ๋‹ค์Œ ์ฒญํฌ ๋‹จ์œ„๋กœ

์ผ๋ถ€ ๊ฒฝ์šฐ, ์˜ˆ๋ฅผ ๋“ค์–ด ๋น„๋””์˜ค๋ฅผ ์žฌ์ƒํ•˜๊ฑฐ๋‚˜ ์ด๋ฏธ์ง€๋ฅผ ์ ์ง„์ ์œผ๋กœ ๋กœ๋“œํ•  ๋•Œ, ํ˜ธ์ถœ์ž๋Š” ์‘๋‹ต์„ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๊ณ  ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ฒญํฌ์”ฉ ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ๋‹ค. ์‘๋‹ต์€ ํ—ค๋”๊ฐ€ ์ฒ˜๋ฆฌ๋œ ๋’ค fetch ํ˜ธ์ถœ์ž์—๊ฒŒ ๋„˜๊ฒจ์ง€๊ณ , ํ˜ธ์ถœ์ž๋Š” ๊ทธ ์ง€์ ๋ถ€ํ„ฐ ๊ณ„์†ํ•œ๋‹ค.

์‘๋‹ต์„ ์ฒญํฌ ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด, ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ fetch์˜ processResponse ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ๋‹ค. ์ฃผ์–ด์ง„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋Š” ์‘๋‹ต์˜ ํ—ค๋”๊ฐ€ ์ˆ˜์‹ ๋˜์—ˆ์„ ๋•Œ ์‘๋‹ต์ด ์ „๋‹ฌ๋˜๋ฉฐ, ๋‚˜๋จธ์ง€ ์‘๋‹ต์„ ๋‹ค์šด๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด ์‘๋‹ต์˜ body์˜ stream์„ ์ฝ์„ ์ฑ…์ž„์ด ์žˆ๋‹ค. ํŽธ์˜๋ฅผ ์œ„ํ•ด processResponseEndOfBody ์ธ์ˆ˜์—๋„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์‘๋‹ต๊ณผ ๊ทธ body๋ฅผ ์™„์ „ํžˆ ์ฝ๋Š” ๊ฒƒ์„ ๋๋ƒˆ์„ ๋•Œ ํ•œ ๋ฒˆ ํ˜ธ์ถœ๋œ๋‹ค. processResponseConsumeBody์™€ ๋‹ฌ๋ฆฌ, processResponse ๋˜๋Š” processResponseEndOfBody ์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•ด๋„ ์‘๋‹ต์ด ์™„์ „ํžˆ ์ฝํžŒ๋‹ค๋Š” ๋ณด์žฅ์€ ์—†์œผ๋ฉฐ, ํ˜ธ์ถœ์ž๋Š” ์ด๋ฅผ ์ง์ ‘ ์ฝ์„ ์ฑ…์ž„์ด ์žˆ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜๋ผ.

processResponse ์ธ์ˆ˜๋Š” ์‘๋‹ต์˜ header list์™€ status๋ฅผ body๋ฅผ ์ „ํ˜€ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฃจ๋Š” ๋ฐ์—๋„ ์œ ์šฉํ•˜๋‹ค. ์ด๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด ok status๋ฅผ ๊ฐ–์ง€ ์•Š๋Š” ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

  1. request๋ฅผ ์š”์ฒญ์œผ๋กœ ๋‘๋ฉฐ, ๊ทธ URL์€ https://stream.example.com/์ด๊ณ  client๋Š” this์˜ relevant settings object์ด๋‹ค.

  2. request๋ฅผ Fetchํ•˜๋˜, processResponse๋ฅผ ์‘๋‹ต response๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค:

    1. response๊ฐ€ network error์ด๋ฉด, ์‚ฌ์šฉ์ž์—๊ฒŒ ์˜ค๋ฅ˜๋ฅผ ํ‘œ์‹œํ•œ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , response์˜ status๊ฐ€ ok status๊ฐ€ ์•„๋‹ˆ๋ฉด, ์‚ฌ์šฉ์ž์—๊ฒŒ ์–ด๋–ค fallback ๊ฐ’์„ ํ‘œ์‹œํ•œ๋‹ค.

    3. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, reader๋ฅผ ์–ป๊ณ , ์ด๋Š” response์˜ body์˜ stream์— ๋Œ€ํ•œ ๊ฒƒ์ด๋ฉฐ, response์˜ headers list์—์„œ MIME type์„ ์ถ”์ถœํ•˜์—ฌ ์‹๋ณ„ํ•œ MIME type์— ์ ์ ˆํ•œ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

์‘๋‹ต ๋ฌด์‹œ

์ผ๋ถ€ ๊ฒฝ์šฐ์—๋Š” ์‘๋‹ต์ด ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด navigator.sendBeacon()์˜ ๊ฒฝ์šฐ๊ฐ€ ๊ทธ๋ ‡๋‹ค. ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ฝœ๋ฐฑ์„ fetch์— ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ์„ ํƒ ์‚ฌํ•ญ์ด๋ฏ€๋กœ, ์ฝœ๋ฐฑ์„ ์ƒ๋žตํ•˜๋ฉด ์‘๋‹ต์„ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š๊ณ  fetchํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋Š” ์‘๋‹ต์˜ body์˜ stream์ด ํ๊ธฐ๋˜๋ฉฐ, ํ˜ธ์ถœ์ž๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

Fetchํ•  ์š”์ฒญ์€ ๊ทธ URL์ด https://fire-and-forget.example.com/, method๊ฐ€ `POST`์ด๊ณ , client๊ฐ€ this์˜ relevant settings object์ธ ๊ฒƒ์ด๋‹ค.

์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝœ๋ฐฑ ์™ธ์—๋„, fetch๋Š” ๊ณ ๊ธ‰ ์‚ฌ๋ก€๋ฅผ ์œ„ํ•œ ์ถ”๊ฐ€ ์ฝœ๋ฐฑ์„ ๋ฐ›๋Š”๋‹ค. processEarlyHintsResponse๋Š” ํŠนํžˆ ์‘๋‹ต ์ค‘ status๊ฐ€ 103์ธ ๊ฒƒ์„ ์œ„ํ•ด ์˜๋„๋œ ๊ฒƒ์ด๋ฉฐ, ํ˜„์žฌ๋Š” ๋‚ด๋น„๊ฒŒ์ด์…˜์—์„œ๋งŒ ์ฒ˜๋ฆฌ๋œ๋‹ค. processRequestBodyChunkLength์™€ processRequestEndOfBody๋Š” ํ˜ธ์ถœ์ž์—๊ฒŒ request body ์—…๋กœ๋“œ ์ง„ํ–‰ ์ƒํ™ฉ์„ ์•Œ๋ฆฐ๋‹ค.

fetch ์ž‘์—…์€ ํ˜ธ์ถœ๋œ ๋™์ผํ•œ ์Šค๋ ˆ๋“œ์—์„œ ์‹œ์ž‘ํ•œ ๋’ค, ๋‚ด๋ถ€ ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋ถ„๋ฆฌ๋œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜๋ผ. ์•ž์„œ ์–ธ๊ธ‰ํ•œ ์ฝœ๋ฐฑ์€ ์ฃผ์–ด์ง„ event loop์— ๊ฒŒ์‹œ๋˜๋ฉฐ, ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๋Š” client์˜ ์ „์—ญ ๊ฐ์ฒด์ด๋‹ค. ์‘๋‹ต์„ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์™€์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ์ง์ ‘ ๋‹ค๋ฃจ๋ ค๋ฉด, fetchํ•˜๋˜ useParallelQueue๋ฅผ true๋กœ ์„ค์ •ํ•œ๋‹ค.

์ง„ํ–‰ ์ค‘์ธ fetch ์กฐ์ž‘ํ•˜๊ธฐ

์ด๋ฏธ ์‹œ์ž‘๋œ fetch ์—ฐ์‚ฐ์„ ์กฐ์ž‘ํ•˜๋ ค๋ฉด, fetch controller๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. fetch controller๋Š” fetch ํ˜ธ์ถœ ์‹œ ๋ฐ˜ํ™˜๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž์˜ ๋™์ž‘์ด๋‚˜ ํŽ˜์ด์ง€ ๋กœ์ง์— ๋”ฐ๋ผ abort๋ฅผ, ๋ธŒ๋ผ์šฐ์ € ๋‚ด๋ถ€ ์‚ฌ์ •์— ๋”ฐ๋ผ terminate๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ข…๋ฃŒ ๋ฐ ์ค‘๋‹จ ์™ธ์—๋„, ํ˜ธ์ถœ์ž๋Š” ํƒ€์ด๋ฐ ๋ณด๊ณ (initiator type์„ ์ „๋‹ฌํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ)๋‚˜ ์ „์ฒด ํƒ€์ด๋ฐ ์ •๋ณด ์ถ”์ถœ๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค(์ด ๊ธฐ๋Šฅ์€ ๋„ค๋น„๊ฒŒ์ด์…˜์—์„œ๋งŒ ์‚ฌ์šฉ๋จ). fetch controller๋Š” ๋˜ํ•œ request์˜ redirect mode๊ฐ€ "manual"์ผ ๋•Œ ๋‹ค์Œ ์ˆ˜๋™ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์ฒ˜๋ฆฌ์—๋„ ์‚ฌ์šฉ๋œ๋‹ค.

๊ฐ์‚ฌ์˜ ๊ธ€

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค: Adam Barth, Adam Lavin, Alan Jeffrey, Alexey Proskuryakov, Andreas Kling, Andrรฉs Gutiรฉrrez, Andrew Sutherland, Andrew Williams, รngel Gonzรกlez, Anssi Kostiainen, Arkadiusz Michalski, Arne Johannessen, Artem Skoretskiy, Arthur Barstow, Arthur Sonzogni, Asanka Herath, Axel Rauschmayer, Ben Kelly, Benjamin Gruenbaum, Benjamin Hawkes-Lewis, Benjamin VanderSloot, Bert Bos, Bjรถrn Hรถhrmann, Boris Zbarsky, Brad Hill, Brad Porter, Bryan Smith, Caitlin Potter, Cameron McCormack, Carlo Cannas, ็™ฝไธž็ฅ (Cheng-You Bai), Chirag S Kumar, Chris Needham, Chris Rebert, Clement Pellerin, Collin Jackson, Daniel Robertson, Daniel Veditz, Dave Tapuska, David Benjamin, David Hรฅsรคther, David Orchard, Dean Jackson, Devdatta Akhawe, Domenic Denicola, Dominic Farolino, Dominique Hazaรซl-Massieux, Doug Turner, Douglas Creager, Eero Hรคkkinen, Ehsan Akhgari, Emily Stark, Eric Lawrence, Eric Orth, Farel Hanafi, Feng Yu, Franรงois Marier, Frank Ellerman, Frederick Hirsch, Frederik Braun, Gary Blackwood, Gavin Carothers, Glenn Maynard, Graham Klyne, Gregory Terzian, Guohui Deng(้‚“ๅ›ฝ่พ‰), Hal Lockhart, Hallvord R. M. Steen, Harris Hancock, Henri Sivonen, Henry Story, Hiroshige Hayashizaki, Honza Bambas, Ian Hickson, Ilya Grigorik, isonmad, Jake Archibald, James Graham, Jamie Mansfield, Janusz Majnert, Jeena Lee, Jeff Carpenter, Jeff Hodges, Jeffrey Yasskin, Jensen Chappell, Jeremy Roman, Jesse M. Heines, Jianjun Chen, Jinho Bang, Jochen Eisinger, John Wilander, Jonas Sicking, Jonathan Kingston, Jonathan Watt, ์ตœ์ข…์ฐฌ (Jongchan Choi), Jordan Stephens, Jรถrn Zaefferer, Joseph Pecoraro, Josh Matthews, jub0bs, Julian Krispel-Samsel, Julian Reschke, ์†ก์ •๊ธฐ (Jungkee Song), Jussi Kalliokoski, Jxck, Kagami Sascha Rosylight, Keita Suzuki, Keith Yeung, Kenji Baheux, Lachlan Hunt, Larry Masinter, Liam Brummitt, Linus Groh, Louis Ryan, Luca Casonato, Lucas Gonze, ลukasz Anforowicz, ๅ‘‚ๅบท่ฑช (Kang-Hao Lu), Maciej Stachowiak, Malisa, Manfred Stock, Manish Goregaokar, Marc Silbey, Marcos Caceres, Marijn Kruisselbrink, Mark Nottingham, Mark S. Miller, Martin Dรผrst, Martin Oโ€™Neal, Martin Thomson, Matt Andrews, Matt Falkenhagen, Matt Menke, Matt Oshry, Matt Seddon, Matt Womer, Mhano Harkness, Michael Ficarra, Michael Kohler, Michaelโ„ข Smith, Mike Pennisi, Mike West, Mohamed Zergaoui, Mohammed Zubair Ahmed, Moritz Kneilmann, Ms2ger, Nico Schlรถmer, Nicolรกs Peรฑa Moreno, Nidhi Jaju, Nikhil Marathe, Nikki Bee, Nikunj Mehta, Noam Rosenthal, Odin Hรธrthe Omdal, Olli Pettay, Ondล™ej ลฝรกra, O. Opsec, Patrick Meenan, Perry Jiang, Philip Jรคgenstedt, R. Auburn, Raphael Kubo da Costa, Robert Linder, Rondinelly, Rory Hewitt, Ross A. Baker, Ryan Sleevi, Sam Atkins, Samy Kamkar, Sรฉbastien Cevey, Sendil Kumar N, Shao-xuan Kang, Sharath Udupa, Shivakumar Jagalur Matt, Shivani Sharma, Sigbjรธrn Finne, Simon Pieters, Simon Sapin, Simon Wรผlker, Srirama Chandra Sekhar Mogali, Stephan Paul, Steven Salat, Sunava Dutta, Surya Ismail, Tab Atkins-Bittner, Takashi Toyoshima, ๅ‰้‡Žๅ‰›ๅฒ (Takeshi Yoshino), Thomas Roessler, Thomas Steiner, Thomas Wisniewski, Tiancheng "Timothy" Gu, Tobie Langel, Tom Schuster, Tomรกs Aparicio, triple-underscore, ไฟๅ‘‚ๆฏ… (Tsuyoshi Horo), Tyler Close, Ujjwal Sharma, Vignesh Shanmugam, Vladimir Dzhuvinov, Wayne Carr, Xabier Rodrรญguez, Yehuda Katz, Yoav Weiss, Yoshisato Yanagisawa, Youenn Fablet, Yoichi Osato, ํ‰้‡Ž่ฃ• (Yutaka Hirano), ๊ทธ๋ฆฌ๊ณ  Zhenbin Xu ๋ชจ๋‘์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ด ํ‘œ์ค€์€ Anne van Kesteren (Apple, annevk@annevk.nl)๊ฐ€ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์ง€์  ์žฌ์‚ฐ๊ถŒ

Copyright ยฉ WHATWG (Apple, Google, Mozilla, Microsoft). ์ด ๋ฌธ์„œ๋Š” ํฌ๋ฆฌ์—์ดํ‹ฐ๋ธŒ ์ปค๋จผ์ฆˆ ์ €์ž‘์žํ‘œ์‹œ 4.0 ๊ตญ์ œ ๋ผ์ด์„ ์Šค๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€๊ฐ€ ์†Œ์Šค ์ฝ”๋“œ์— ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ์†Œ์Šค ์ฝ”๋“œ ๋ถ€๋ถ„์€ BSD 3-Clause License๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์„œ๋Š” ํ˜„ํ–‰ ํ‘œ์ค€์ž…๋‹ˆ๋‹ค. ํŠนํ—ˆ ๊ฒ€ํ†  ๋ฒ„์ „์— ๊ด€์‹ฌ ์žˆ์œผ์‹  ๋ถ„๋“ค์€ ํ˜„ํ–‰ ํ‘œ์ค€ ๊ฒ€ํ†  ์ดˆ์•ˆ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ƒ‰์ธ

์ด ๋ช…์„ธ์„œ์—์„œ ์ •์˜ํ•œ ์šฉ์–ด

์ฐธ์กฐ๋กœ ์ •์˜๋œ ์šฉ์–ด

์ฐธ๊ณ  ๋ฌธํ—Œ

๊ทœ๋ฒ” ์ฐธ๊ณ  ๋ฌธํ—Œ

[ABNF]
D. Crocker, Ed.; P. Overell. ๊ตฌ๋ฌธ ๋ช…์„ธ๋ฅผ ์œ„ํ•œ ํ™•์žฅ BNF: ABNF. 2008๋…„ 1์›”. ์ธํ„ฐ๋„ท ํ‘œ์ค€. URL: https://www.rfc-editor.org/info/rfc5234/
[BEACON]
Ilya Grigorik; Alois Reitbauer. Beacon. URL: https://w3c.github.io/beacon/
[COOKIES]
Johann Hofmann; Anne van Kesteren. ์ฟ ํ‚ค: HTTP ์ƒํƒœ ๊ด€๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜. URL: https://httpwg.org/http-extensions/draft-ietf-httpbis-layered-cookies.html
[CSP]
Mike West; Antonio Sartori. ์ฝ˜ํ…์ธ  ๋ณด์•ˆ ์ •์ฑ… ๋ ˆ๋ฒจ 3. URL: https://w3c.github.io/webappsec-csp/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS ๊ฐ’๊ณผ ๋‹จ์œ„ ๋ชจ๋“ˆ ๋ ˆ๋ฒจ 4. URL: https://drafts.csswg.org/css-values-4/
[DOM]
Anne van Kesteren. DOM ํ‘œ์ค€. ํ˜„ํ–‰ ํ‘œ์ค€. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript ์–ธ์–ด ๋ช…์„ธ. URL: https://tc39.es/ecma262/multipage/
[ENCODING]
Anne van Kesteren. ์ธ์ฝ”๋”ฉ ํ‘œ์ค€. ํ˜„ํ–‰ ํ‘œ์ค€. URL: https://encoding.spec.whatwg.org/
[FETCH-METADATA]
Mike West. Fetch ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์š”์ฒญ ํ—ค๋”. URL: https://w3c.github.io/webappsec-fetch-metadata/
[FILEAPI]
Marijn Kruisselbrink. ํŒŒ์ผ API. URL: https://w3c.github.io/FileAPI/
[HR-TIME-3]
Yoav Weiss. ๊ณ ํ•ด์ƒ๋„ ์‹œ๊ฐ„. URL: https://w3c.github.io/hr-time/
[HSTS]
J. Hodges; C. Jackson; A. Barth. HTTP ์—„๊ฒฉํ•œ ์ „์†ก ๋ณด์•ˆ(HSTS). 2012๋…„ 11์›”. ์ œ์•ˆ ํ‘œ์ค€. URL: https://www.rfc-editor.org/info/rfc6797/
[HTML]
Anne van Kesteren; et al. HTML ํ‘œ์ค€. ํ˜„ํ–‰ ํ‘œ์ค€. URL: https://html.spec.whatwg.org/multipage/
[HTTP]
R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed.. HTTP ์˜๋ฏธ๋ก . 2022๋…„ 6์›”. ์ธํ„ฐ๋„ท ํ‘œ์ค€. URL: https://httpwg.org/specs/rfc9110.html
[HTTP-CACHING]
R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed.. HTTP ์บ์‹ฑ. 2022๋…„ 6์›”. ์ธํ„ฐ๋„ท ํ‘œ์ค€. URL: https://httpwg.org/specs/rfc9111.html
[HTTP1]
R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed.. HTTP/1.1. 2022๋…„ 6์›”. ์ธํ„ฐ๋„ท ํ‘œ์ค€. URL: https://httpwg.org/specs/rfc9112.html
[HTTP3]
M. Bishop, Ed.. HTTP/3. 2022๋…„ 6์›”. ์ œ์•ˆ ํ‘œ์ค€. URL: https://httpwg.org/specs/rfc9114.html
[HTTP3-DATAGRAM]
D. Schinazi; L. Pardue. HTTP ๋ฐ์ดํ„ฐ๊ทธ๋žจ๊ณผ ์บก์А ํ”„๋กœํ† ์ฝœ. 2022๋…„ 8์›”. ์ œ์•ˆ ํ‘œ์ค€. URL: https://www.rfc-editor.org/info/rfc9297/
[IANA-HTTP-PARAMS]
ํ•˜์ดํผํ…์ŠคํŠธ ์ „์†ก ํ”„๋กœํ† ์ฝœ(HTTP) ๋งค๊ฐœ๋ณ€์ˆ˜. URL: https://www.iana.org/assignments/http-parameters/http-parameters.xhtml
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra ํ‘œ์ค€. ํ˜„ํ–‰ ํ‘œ์ค€. URL: https://infra.spec.whatwg.org/
[MIMESNIFF]
Gordon P. Hemsley. MIME ์Šค๋‹ˆํ•‘ ํ‘œ์ค€. ํ˜„ํ–‰ ํ‘œ์ค€. URL: https://mimesniff.spec.whatwg.org/
[MIX]
Emily Stark; Mike West; Carlos IbarraLopez. ํ˜ผํ•ฉ ์ฝ˜ํ…์ธ . URL: https://w3c.github.io/webappsec-mixed-content/
[PERMISSIONS-POLICY-1]
Ian Clelland; Ari Chivukula. ๊ถŒํ•œ ์ •์ฑ…. URL: https://w3c.github.io/webappsec-permissions-policy/
[REFERRER]
Jochen Eisinger; Emily Stark. ๋ฆฌํผ๋Ÿฌ ์ •์ฑ…. URL: https://w3c.github.io/webappsec-referrer-policy/
[REPORTING]
Douglas Creager; Ian Clelland; Mike West. ๋ณด๊ณ  API. URL: https://w3c.github.io/reporting/
[RESOURCE-TIMING]
Yoav Weiss; Noam Rosenthal. ๋ฆฌ์†Œ์Šค ํƒ€์ด๋ฐ. URL: https://w3c.github.io/resource-timing/
[RFC7405]
P. Kyzivat. ABNF์˜ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ๋ฌธ์ž์—ด ์ง€์›. 2014๋…„ 12์›”. ์ œ์•ˆ ํ‘œ์ค€. URL: https://www.rfc-editor.org/info/rfc7405/
[RFC7578]
L. Masinter. ํผ์—์„œ ๊ฐ’ ๋ฐ˜ํ™˜: multipart/form-data. 2015๋…„ 7์›”. ์ œ์•ˆ ํ‘œ์ค€. URL: https://www.rfc-editor.org/info/rfc7578/
[RFC9218]
K. Oku; L. Pardue. HTTP๋ฅผ ์œ„ํ•œ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์šฐ์„ ์ˆœ์œ„ ์ง€์ • ๋ฐฉ์‹. 2022๋…„ 6์›”. ์ œ์•ˆ ํ‘œ์ค€. URL: https://httpwg.org/specs/rfc9218.html
[RFC9651]
M. Nottingham; P-H. Kamp. HTTP๋ฅผ ์œ„ํ•œ ๊ตฌ์กฐํ™”๋œ ํ•„๋“œ ๊ฐ’. 2024๋…„ 9์›”. ์ œ์•ˆ ํ‘œ์ค€. URL: https://www.rfc-editor.org/info/rfc9651/
[SECURE-CONTEXTS]
Mike West. ๋ณด์•ˆ ์ปจํ…์ŠคํŠธ. URL: https://w3c.github.io/webappsec-secure-contexts/
[SRI]
Frederik Braun. ์„œ๋ธŒ๋ฆฌ์†Œ์Šค ๋ฌด๊ฒฐ์„ฑ. URL: https://w3c.github.io/webappsec-subresource-integrity/
[STALE-WHILE-REVALIDATE]
M. Nottingham. ์˜ค๋ž˜๋œ ์ฝ˜ํ…์ธ ๋ฅผ ์œ„ํ•œ HTTP Cache-Control ํ™•์žฅ. 2010๋…„ 5์›”. ์ •๋ณด ์ œ๊ณต์šฉ. URL: https://httpwg.org/specs/rfc5861.html
[STREAMS]
Adam Rice; et al. Streams ํ‘œ์ค€. ํ˜„ํ–‰ ํ‘œ์ค€. URL: https://streams.spec.whatwg.org/
[SVCB]
B. Schwartz; M. Bishop; E. Nygren. DNS๋ฅผ ํ†ตํ•œ ์„œ๋น„์Šค ๋ฐ”์ธ๋”ฉ ๋ฐ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ช…์„ธ(SVCB ๋ฐ HTTPS ๋ฆฌ์†Œ์Šค ๋ ˆ์ฝ”๋“œ). 2023๋…„ 11์›”. ์ œ์•ˆ ํ‘œ์ค€. URL: https://www.rfc-editor.org/info/rfc9460/
[SW]
Monica CHINTALA; Yoshisato Yanagisawa. ์„œ๋น„์Šค ์›Œ์ปค ๋‚˜์ดํ‹€๋ฆฌ. URL: https://w3c.github.io/ServiceWorker/
[TLS]
E. Rescorla. ์ „์†ก ๊ณ„์ธต ๋ณด์•ˆ(TLS) ํ”„๋กœํ† ์ฝœ ๋ฒ„์ „ 1.3. 2026๋…„ 7์›”. ์ œ์•ˆ ํ‘œ์ค€. URL: https://www.rfc-editor.org/info/rfc9846/
[UPGRADE-INSECURE-REQUESTS]
Mike West. ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์š”์ฒญ ์—…๊ทธ๋ ˆ์ด๋“œ. URL: https://w3c.github.io/webappsec-upgrade-insecure-requests/
[URL]
Anne van Kesteren. URL ํ‘œ์ค€. ํ˜„ํ–‰ ํ‘œ์ค€. URL: https://url.spec.whatwg.org/
[WEBCRYPTO]
Daniel Huigens. ์›น ์•”ํ˜ธํ™” ๋ ˆ๋ฒจ 2. URL: https://w3c.github.io/webcrypto/
[WEBDRIVER-BIDI]
James Graham; Alex Rudenko; Maksim Sadym. WebDriver BiDi. URL: https://w3c.github.io/webdriver-bidi/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL ํ‘œ์ค€. ํ˜„ํ–‰ ํ‘œ์ค€. URL: https://webidl.spec.whatwg.org/
[WEBSOCKETS]
Adam Rice. WebSockets ํ‘œ์ค€. ํ˜„ํ–‰ ํ‘œ์ค€. URL: https://websockets.spec.whatwg.org/
[WEBTRANSPORT]
Jan-Ivar Bruaroey; Victor Vasiliev; Nidhi Jaju. WebTransport. URL: https://w3c.github.io/webtransport/
[WEBTRANSPORT-HTTP3]
V. Vasiliev. HTTP/3๋ฅผ ํ†ตํ•œ WebTransport. URL: https://datatracker.ietf.org/doc/html/draft-ietf-webtrans-http3
[XHR]
Anne van Kesteren. XMLHttpRequest ํ‘œ์ค€. ํ˜„ํ–‰ ํ‘œ์ค€. URL: https://xhr.spec.whatwg.org/

์ •๋ณด ์ฐธ๊ณ  ๋ฌธํ—Œ

[HTTPVERBSEC1]
์—ฌ๋Ÿฌ ๊ณต๊ธ‰์—…์ฒด์˜ ์›น ์„œ๋ฒ„์—์„œ HTTP TRACE ๋ฉ”์„œ๋“œ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.. URL: https://www.kb.cert.org/vuls/id/867593
[HTTPVERBSEC2]
Microsoft Internet Information Server (IIS)๋Š” HTTP TRACK ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•œ ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ์Šคํฌ๋ฆฝํŒ…์— ์ทจ์•ฝํ•ฉ๋‹ˆ๋‹ค.. URL: https://www.kb.cert.org/vuls/id/288308
[HTTPVERBSEC3]
HTTP ํ”„๋ก์‹œ์˜ ๊ธฐ๋ณธ ๊ตฌ์„ฑ์€ ์ž„์˜์˜ TCP ์—ฐ๊ฒฐ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.. URL: https://www.kb.cert.org/vuls/id/150227
[NAVIGATION-TIMING]
Zhiheng Wang. ํƒ์ƒ‰ ํƒ€์ด๋ฐ. 2012๋…„ 12์›” 17์ผ. REC. URL: https://www.w3.org/TR/navigation-timing/
[ORIGIN]
A. Barth. ์›น ์ถœ์ฒ˜ ๊ฐœ๋…. 2011๋…„ 12์›”. ์ œ์•ˆ ํ‘œ์ค€. URL: https://www.rfc-editor.org/info/rfc6454/
[RFC1035]
P. Mockapetris. ๋„๋ฉ”์ธ ์ด๋ฆ„ - ๊ตฌํ˜„ ๋ฐ ๋ช…์„ธ. 1987๋…„ 11์›”. ์ธํ„ฐ๋„ท ํ‘œ์ค€. URL: https://www.rfc-editor.org/info/rfc1035/
[RFC2397]
L. Masinter. "data" URL ์Šคํ‚ด. 1998๋…„ 8์›”. ์ œ์•ˆ ํ‘œ์ค€. URL: https://www.rfc-editor.org/info/rfc2397/
[RFC3986]
T. Berners-Lee; R. Fielding; L. Masinter. ํ†ตํ•ฉ ์ž์› ์‹๋ณ„์ž(URI): ์ผ๋ฐ˜ ๊ตฌ๋ฌธ. 2005๋…„ 1์›”. ์ธํ„ฐ๋„ท ํ‘œ์ค€. URL: https://www.rfc-editor.org/info/rfc3986/
[RFC5952]
S. Kawamura; M. Kawashima. IPv6 ์ฃผ์†Œ ํ…์ŠคํŠธ ํ‘œํ˜„์— ๋Œ€ํ•œ ๊ถŒ๊ณ . 2010๋…„ 8์›”. ์ œ์•ˆ ํ‘œ์ค€. URL: https://www.rfc-editor.org/info/rfc5952/
[RFC6960]
S. Santesson; et al. X.509 ์ธํ„ฐ๋„ท ๊ณต๊ฐœ ํ‚ค ์ธํ”„๋ผ ์˜จ๋ผ์ธ ์ธ์ฆ์„œ ์ƒํƒœ ํ”„๋กœํ† ์ฝœ - OCSP. 2013๋…„ 6์›”. ์ œ์•ˆ ํ‘œ์ค€. URL: https://www.rfc-editor.org/info/rfc6960/
[RFC7301]
S. Friedl; et al. ์ „์†ก ๊ณ„์ธต ๋ณด์•ˆ(TLS) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต ํ”„๋กœํ† ์ฝœ ํ˜‘์ƒ ํ™•์žฅ. 2014๋…„ 7์›”. ์ œ์•ˆ ํ‘œ์ค€. URL: https://www.rfc-editor.org/info/rfc7301/
[RFC7918]
A. Langley; N. Modadugu; B. Moeller. ์ „์†ก ๊ณ„์ธต ๋ณด์•ˆ(TLS) False Start. 2016๋…„ 8์›”. ์ •๋ณด ์ œ๊ณต์šฉ. URL: https://www.rfc-editor.org/info/rfc7918/
[RFC8470]
M. Thomson; M. Nottingham; W. Tarreau. HTTP์—์„œ Early Data ์‚ฌ์šฉ. 2018๋…„ 9์›”. ์ œ์•ˆ ํ‘œ์ค€. URL: https://httpwg.org/specs/rfc8470.html
[RFC9163]
E. Stark. HTTP์šฉ Expect-CT ํ™•์žฅ. 2022๋…„ 6์›”. ์‹คํ—˜์ . URL: https://www.rfc-editor.org/info/rfc9163/

IDL ์ƒ‰์ธ

typedef (sequence<sequence<ByteString>> or record<ByteString, ByteString>) HeadersInit;

[Exposed=(Window,Worker)]
interface Headers {
  constructor(optional HeadersInit init);

  undefined append(ByteString name, ByteString value);
  undefined delete(ByteString name);
  ByteString? get(ByteString name);
  sequence<ByteString> getSetCookie();
  boolean has(ByteString name);
  undefined set(ByteString name, ByteString value);
  iterable<ByteString, ByteString>;
};

typedef (Blob or BufferSource or FormData or URLSearchParams or USVString) XMLHttpRequestBodyInit;

typedef (ReadableStream or XMLHttpRequestBodyInit) BodyInit;
interface mixin Body {
  readonly attribute ReadableStream? body;
  readonly attribute boolean bodyUsed;
  [NewObject] Promise<ArrayBuffer> arrayBuffer();
  [NewObject] Promise<Blob> blob();
  [NewObject] Promise<Uint8Array> bytes();
  [NewObject] Promise<FormData> formData();
  [NewObject] Promise<any> json();
  [NewObject] Promise<USVString> text();
  [NewObject] ReadableStream textStream();
};
typedef (Request or USVString) RequestInfo;

[Exposed=(Window,Worker)]
interface Request {
  constructor(RequestInfo input, optional RequestInit init = {});

  readonly attribute ByteString method;
  readonly attribute USVString url;
  [SameObject] readonly attribute Headers headers;

  readonly attribute RequestDestination destination;
  readonly attribute USVString referrer;
  readonly attribute ReferrerPolicy referrerPolicy;
  readonly attribute RequestMode mode;
  readonly attribute RequestCredentials credentials;
  readonly attribute RequestCache cache;
  readonly attribute RequestRedirect redirect;
  readonly attribute DOMString integrity;
  readonly attribute boolean keepalive;
  readonly attribute boolean isReloadNavigation;
  readonly attribute boolean isHistoryNavigation;
  readonly attribute AbortSignal signal;
  readonly attribute RequestDuplex duplex;

  [NewObject] Request clone();
};
Request includes Body;

dictionary RequestInit {
  ByteString method;
  HeadersInit headers;
  BodyInit? body;
  USVString referrer;
  ReferrerPolicy referrerPolicy;
  RequestMode mode;
  RequestCredentials credentials;
  RequestCache cache;
  RequestRedirect redirect;
  DOMString integrity;
  boolean keepalive;
  AbortSignal? signal;
  RequestDuplex duplex;
  RequestPriority priority;
  any window; // can only be set to null
};

enum RequestDestination { "", "audio", "audioworklet", "document", "embed", "font", "frame", "iframe", "image", "json", "manifest", "object", "paintworklet", "report", "script", "sharedworker", "style", "text", "track", "video", "worker", "xslt" };
enum RequestMode { "navigate", "same-origin", "no-cors", "cors" };
enum RequestCredentials { "omit", "same-origin", "include" };
enum RequestCache { "default", "no-store", "reload", "no-cache", "force-cache", "only-if-cached" };
enum RequestRedirect { "follow", "error", "manual" };
enum RequestDuplex { "half" };
enum RequestPriority { "high", "low", "auto" };

[Exposed=(Window,Worker)]
interface Response {
  constructor(optional BodyInit? body = null, optional ResponseInit init = {});

  [NewObject] static Response error();
  [NewObject] static Response redirect(USVString url, optional unsigned short status = 302);
  [NewObject] static Response json(any data, optional ResponseInit init = {});

  readonly attribute ResponseType type;

  readonly attribute USVString url;
  readonly attribute boolean redirected;
  readonly attribute unsigned short status;
  readonly attribute boolean ok;
  readonly attribute ByteString statusText;
  [SameObject] readonly attribute Headers headers;

  [NewObject] Response clone();
};
Response includes Body;

dictionary ResponseInit {
  unsigned short status = 200;
  ByteString statusText = "";
  HeadersInit headers;
};

enum ResponseType { "basic", "cors", "default", "error", "opaque", "opaqueredirect" };

partial interface mixin WindowOrWorkerGlobalScope {
  [NewObject] Promise<Response> fetch(RequestInfo input, optional RequestInit init = {});
};

dictionary DeferredRequestInit : RequestInit {
  DOMHighResTimeStamp activateAfter;
};

[Exposed=Window]
interface FetchLaterResult {
  readonly attribute boolean activated;
};

partial interface Window {
  [NewObject, SecureContext] FetchLaterResult fetchLater(RequestInfo input, optional DeferredRequestInit init = {});
};

โœ”MDN

Headers/Headers

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js18.0.0+
โœ”MDN

Headers/append

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js18.0.0+
โœ”MDN

Headers/delete

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js18.0.0+
โœ”MDN

Headers/get

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js18.0.0+
โœ”MDN

Headers/getSetCookie

In all current engines.

Firefox112+Safari17+Chrome113+
Opera?Edge113+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js19.7.0+
โœ”MDN

Headers/has

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js18.0.0+
โœ”MDN

Headers/set

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js18.0.0+
โœ”MDN

Headers

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js18.0.0+
โœ”MDN

Request/Request

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera27+Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile27+
โœ”MDN

Request/arrayBuffer

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Response/arrayBuffer

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โœ”MDN

Request/blob

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Response/blob

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Request/body

FirefoxNoneSafari11.1+Chrome105+
Opera?Edge105+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Response/body

In all current engines.

Firefox65+Safari10.1+Chrome43+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โœ”MDN

Request/bodyUsed

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Response/bodyUsed

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โœ”MDN

Request/cache

In all current engines.

Firefox48+Safari10.1+Chrome64+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โœ”MDN

Request/clone

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โœ”MDN

Request/credentials

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โœ”MDN

Request/destination

In all current engines.

Firefox61+Safari10.1+Chrome65+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โœ”MDN

Request/formData

In all current engines.

Firefox39+Safari14.1+Chrome60+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Response/formData

In all current engines.

Firefox39+Safari14.1+Chrome60+
Opera?Edge79+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โœ”MDN

Request/headers

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โœ”MDN

Request/integrity

In all current engines.

Firefox51+Safari10.1+Chrome46+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โœ”MDN

Request/json

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Response/json

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โœ”MDN

Request/method

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โœ”MDN

Request/mode

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โœ”MDN

Request/redirect

In all current engines.

Firefox43+Safari10.1+Chrome46+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โœ”MDN

Request/referrer

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โœ”MDN

Request/referrerPolicy

In all current engines.

Firefox47+Safari10.1+Chrome52+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet7.2+Opera Mobile?
โœ”MDN

Request/signal

In all current engines.

Firefox57+Safari12.1+Chrome66+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โœ”MDN

Request/text

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?

Response/text

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โœ”MDN

Request/url

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile27+
โœ”MDN

Request

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js18.0.0+
โœ”MDN

Response/Response

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โœ”MDN

Response/clone

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โœ”MDN

Response/error_static

In all current engines.

Firefox39+Safari10.1+Chrome43+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โœ”MDN

Response/headers

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
MDN

Response/json_static

Firefox115+SafariNoneChrome105+
Opera?Edge105+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โœ”MDN

Response/ok

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โœ”MDN

Response/redirect_static

In all current engines.

Firefox39+Safari10.1+Chrome44+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โœ”MDN

Response/redirected

In all current engines.

Firefox49+Safari10.1+Chrome57+
Opera?Edge79+
Edge (Legacy)16+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView60+Samsung Internet8.0+Opera Mobile?
โœ”MDN

Response/status

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โœ”MDN

Response/statusText

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โœ”MDN

Response/type

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โœ”MDN

Response/url

In all current engines.

Firefox39+Safari10.1+Chrome40+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โœ”MDN

Response

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js18.0.0+
โœ”MDN

fetch

In all current engines.

Firefox39+Safari10.1+Chrome42+
Opera?Edge79+
Edge (Legacy)14+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js18.0.0+
โœ”MDN

Headers/Access-Control-Allow-Credentials

In all current engines.

Firefox3.5+Safari4+Chrome4+
Opera12+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for AndroidYesAndroid WebView2+Samsung Internet?Opera Mobile12+
โœ”MDN

Headers/Access-Control-Allow-Headers

In all current engines.

Firefox3.5+Safari4+Chrome4+
Opera12+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for AndroidYesAndroid WebView2+Samsung Internet?Opera Mobile12+
โœ”MDN

Headers/Access-Control-Allow-Methods

In all current engines.

Firefox3.5+Safari4+Chrome4+
Opera12+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for AndroidYesAndroid WebView2+Samsung Internet?Opera Mobile12+
โœ”MDN

Headers/Access-Control-Allow-Origin

In all current engines.

Firefox3.5+Safari4+Chrome4+
Opera12+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for AndroidYesAndroid WebView2+Samsung Internet?Opera Mobile12+
โœ”MDN

Headers/Access-Control-Expose-Headers

In all current engines.

Firefox3.5+Safari4+Chrome4+
Opera12+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for AndroidYesAndroid WebView2+Samsung Internet?Opera Mobile12+
โœ”MDN

Headers/Access-Control-Max-Age

In all current engines.

Firefox3.5+Safari4+Chrome4+
Opera12+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for AndroidYesAndroid WebView2+Samsung Internet?Opera Mobile12+
โœ”MDN

Headers/Access-Control-Request-Headers

In all current engines.

Firefox3.5+Safari4+Chrome4+
Opera12+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for AndroidYesAndroid WebView2+Samsung Internet?Opera Mobile12+
โœ”MDN

Headers/Access-Control-Request-Method

In all current engines.

Firefox3.5+Safari4+Chrome4+
Opera12+Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for AndroidYesAndroid WebView2+Samsung Internet?Opera Mobile12+
โœ”MDN

Headers/Cross-Origin-Resource-Policy

In all current engines.

Firefox74+Safari12+Chrome73+
OperaNoneEdge79+
Edge (Legacy)NoneIENone
Firefox for AndroidNoneiOS Safari?Chrome for Android?Android WebView?Samsung Internet11.0+Opera MobileNone
โœ”MDN

Headers/Origin

In all current engines.

Firefox70+SafariYesChromeYes
Opera?EdgeYes
Edge (Legacy)12+IEYes
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
โš MDN

Headers/Sec-Purpose

In only one current engine.

Firefox115+SafariNoneChromeNone
Opera?EdgeNone
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera MobileNone
โœ”MDN

Headers/X-Content-Type-Options

In all current engines.

Firefox50+Safari11+Chrome64+
OperaYesEdge79+
Edge (Legacy)12+IE8+
Firefox for Android?iOS Safari?Chrome for Android64+Android WebView?Samsung Internet?Opera MobileYes