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

URL

ํ˜„ํ–‰ ํ‘œ์ค€ โ€” ์ตœ๊ทผ ์—…๋ฐ์ดํŠธ

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

์š”์•ฝ

URL ํ‘œ์ค€์€ URL, ๋„๋ฉ”์ธ, IP ์ฃผ์†Œ, application/x-www-form-urlencoded ํ˜•์‹, ๊ทธ๋ฆฌ๊ณ  ์ด๋“ค์˜ API๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

๋ชฉํ‘œ

URL ํ‘œ์ค€์€ URL์˜ ์™„์ „ํ•œ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ทจํ•ฉ๋‹ˆ๋‹ค:

ํŽธ์ง‘์ž๊ฐ€ ์ฃผ์ œ๋ฅผ ๋” ๊นŠ์ด ํ•™์Šตํ•จ์— ๋”ฐ๋ผ ๋ชฉํ‘œ์˜ ๋ฒ”์œ„๊ฐ€ ๋‹ค์†Œ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1. ์ธํ”„๋ผ์ŠคํŠธ๋Ÿญ์ฒ˜

์ด ๋ช…์„ธ๋Š” Infra์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. [INFRA]

์ด ๋ช…์„ธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ผ๋ถ€ ์šฉ์–ด๋“ค์€ ๋‹ค์Œ ํ‘œ์ค€ ๋ฐ ๋ช…์„ธ์—์„œ ์ •์˜๋ฉ๋‹ˆ๋‹ค:


์ •์ˆ˜๋ฅผ ์ง๋ ฌํ™”ํ•˜๋‹ค๋Š”, ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ์งง์€ ์‹ญ์ง„์ˆ˜๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

1.1. ์ž‘์„ฑ

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

๊ฒ€์ฆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ํŒŒ์„œ๊ฐ€ ์ข…๋ฃŒ๋œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ํŒŒ์„œ์˜ ์ข…๋ฃŒ๋Š” ํ•ญ์ƒ ๋ช…์‹œ์ ์œผ๋กœ, ์˜ˆ๋ฅผ ๋“ค์–ด return ๋ฌธ์„ ํ†ตํ•ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

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

์˜ค๋ฅ˜ ์œ ํ˜• ์˜ค๋ฅ˜ ์„ค๋ช… ์‹คํŒจ ์—ฌ๋ถ€
IDNA
domain-to-ASCII

Unicode ToASCII๋Š” CheckHyphens, UseSTD3ASCIIRules, ๊ทธ๋ฆฌ๊ณ  VerifyDnsLength๊ฐ€ ๋ชจ๋‘ true๋กœ ์„ค์ •๋˜์—ˆ์„ ๋•Œ ์˜ค๋ฅ˜๋ฅผ ๊ธฐ๋กํ•œ๋‹ค. [UTS46]

Unicode ToASCII ์˜ค๋ฅ˜์— ๊ด€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ๊ธฐ๋ก๋œ ๊ฒฝ์šฐ, ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ์ด๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค.

URL์ด ํŠน์ˆ˜ํ•จ์ผ ๋•Œ, ์ฒ˜๋ฆฌ๋˜๊ธฐ ์ „์— ํ˜ธ์ŠคํŠธ๋Š” ํผ์„ผํŠธ ๋””์ฝ”๋”ฉ๋˜๋ฉฐ, ์ด๋กœ ์ธํ•ด ๋‹ค์Œ ํ˜ธ์ŠคํŠธ ๋ถ€๋ถ„์€ "exa#mple.org"๊ฐ€ ๋˜์–ด ์ด ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

"https://exa%23mple.org"

์˜ˆ
(beStrict๊ฐ€ true์ด๊ฑฐ๋‚˜, domain์ด ASCII ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ฉฐ ์™„ํ™”๋œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ Unicode ToASCII๋„ ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ)
ํ˜ธ์ŠคํŠธ ๊ตฌ๋ฌธ ๋ถ„์„
domain-percent-encoded

๋„๋ฉ”์ธ์œผ๋กœ ์ฒ˜๋ฆฌ๋  ์ž…๋ ฅ์˜ ํ˜ธ์ŠคํŠธ์— ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ๋œ ๋ฐ”์ดํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

"https://exam%70le.org"

ยท
host-invalid-code-point

(ํŠน์ˆ˜ํ•˜์ง€ ์•Š์€ URL ์•ˆ์˜) ๋ถˆํˆฌ๋ช… ํ˜ธ์ŠคํŠธ์— ๊ธˆ์ง€๋œ ํ˜ธ์ŠคํŠธ ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

"foo://exa[mple.org"

์˜ˆ
IPv4-empty-part

IPv4 ์ฃผ์†Œ๊ฐ€ U+002E (.)๋กœ ๋๋‚œ๋‹ค.

"https://127.0.0.1./"

ยท
IPv4-too-few-parts

IPv4 ์ฃผ์†Œ๊ฐ€ 4๊ฐœ๋ณด๋‹ค ์ ์€ ๋ถ€๋ถ„์„ ๊ฐ€์ง„๋‹ค.

"https://1.2.3/"

ยท
IPv4-too-many-parts

IPv4 ์ฃผ์†Œ๊ฐ€ 4๊ฐœ๋ณด๋‹ค ๋งŽ์€ ๋ถ€๋ถ„์„ ๊ฐ€์ง„๋‹ค.

"https://1.2.3.4.5/"

์˜ˆ
IPv4-non-numeric-part

IPv4 ์ฃผ์†Œ ๋ถ€๋ถ„์ด ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋‹ค.

"https://test.42"

์˜ˆ
IPv4-non-decimal-part

IPv4 ์ฃผ์†Œ์— 16์ง„์ˆ˜ ๋˜๋Š” 8์ง„์ˆ˜ ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ•ด ํ‘œํ˜„๋œ ์ˆซ์ž๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

"https://127.0.0x0.1"

ยท
IPv4-out-of-range-part

IPv4 ์ฃผ์†Œ ๋ถ€๋ถ„์ด 255๋ฅผ ์ดˆ๊ณผํ•œ๋‹ค.

"https://255.255.4000.1"

์˜ˆ
(๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์— ์ ์šฉ๋˜๋Š” ๊ฒฝ์šฐ์— ํ•œํ•จ)
IPv4-non-ASCII-input

IPv4 ์ฃผ์†Œ๊ฐ€ IDNA ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ํ†ตํ•ด ๋น„-ASCII ๋ฌธ์ž์—ด๋กœ๋ถ€ํ„ฐ ํŒŒ์ƒ๋œ๋‹ค.

"https://โ‘ .โ‘ก.โ‘ข.โ‘ฃ"

ยท
IPv6-unclosed

IPv6 ์ฃผ์†Œ์— ๋‹ซ๋Š” U+005D (])๊ฐ€ ์—†๋‹ค.

"https://[::1"

์˜ˆ
IPv6-invalid-compression

IPv6 ์ฃผ์†Œ๊ฐ€ ๋ถ€์ ์ ˆํ•œ ์••์ถ•์œผ๋กœ ์‹œ์ž‘ํ•œ๋‹ค.

"https://[:1]"

์˜ˆ
IPv6-too-many-pieces

IPv6 ์ฃผ์†Œ์— 8๊ฐœ๋ณด๋‹ค ๋งŽ์€ ์กฐ๊ฐ์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

"https://[1:2:3:4:5:6:7:8:9]"

์˜ˆ
IPv6-multiple-compression

IPv6 ์ฃผ์†Œ๊ฐ€ ๋‘˜ ์ด์ƒ์˜ ์œ„์น˜์—์„œ ์••์ถ•๋˜์–ด ์žˆ๋‹ค.

"https://[1::1::1]"

์˜ˆ
IPv6-invalid-code-point

IPv6 ์ฃผ์†Œ์— ASCII 16์ง„ ์ˆซ์ž ๋„ ์•„๋‹ˆ๊ณ  U+003A (:)๋„ ์•„๋‹Œ ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. ๋˜๋Š” ์˜ˆ์ƒ์น˜ ๋ชปํ•˜๊ฒŒ ๋๋‚œ๋‹ค.

"https://[1:2:3!:4]"

"https://[1:2:3:]"

์˜ˆ
IPv6-too-few-pieces

์••์ถ•๋˜์ง€ ์•Š์€ IPv6 ์ฃผ์†Œ์— 8๊ฐœ๋ณด๋‹ค ์ ์€ ์กฐ๊ฐ์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

"https://[1:2:3]"

์˜ˆ
IPv6-piece-leading-zero

IPv6 ์ฃผ์†Œ ์กฐ๊ฐ์— ์„ ํ–‰ U+0030 (0)์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

"https://[::01]"

ยท
IPv4-in-IPv6-too-many-pieces

IPv6 ์ฃผ์†Œ๊ฐ€ IPv4 ์ฃผ์†Œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ: IPv6 ์ฃผ์†Œ๊ฐ€ 6๊ฐœ๋ณด๋‹ค ๋งŽ์€ ์กฐ๊ฐ์„ ๊ฐ€์ง„๋‹ค.

"https://[1:1:1:1:1:1:1:127.0.0.1]"

์˜ˆ
IPv4-in-IPv6-invalid-code-point

IPv6 ์ฃผ์†Œ๊ฐ€ IPv4 ์ฃผ์†Œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ:

  • IPv4 ๋ถ€๋ถ„์ด ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ๋น„-ASCII ์ˆซ์ž๋ฅผ ํฌํ•จํ•œ๋‹ค.
  • IPv4 ๋ถ€๋ถ„์— ์„ ํ–‰ 0์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.
  • IPv4 ๋ถ€๋ถ„์ด ๋„ˆ๋ฌด ๋งŽ๋‹ค.

"https://[ffff::.0.0.1]"

"https://[ffff::127.0.xyz.1]"

"https://[ffff::127.0xyz]"

"https://[ffff::127.00.0.1]"

"https://[ffff::127.0.0.1.2]"

์˜ˆ
IPv4-in-IPv6-out-of-range-part

IPv6 ์ฃผ์†Œ๊ฐ€ IPv4 ์ฃผ์†Œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ: IPv4 ๋ถ€๋ถ„์ด 255๋ฅผ ์ดˆ๊ณผํ•œ๋‹ค.

"https://[ffff::127.0.0.4000]"

์˜ˆ
IPv4-in-IPv6-too-few-parts

IPv6 ์ฃผ์†Œ๊ฐ€ IPv4 ์ฃผ์†Œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ: IPv4 ์ฃผ์†Œ์— ๋„ˆ๋ฌด ์ ์€ ๋ถ€๋ถ„์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

"https://[ffff::127.0.0]"

์˜ˆ
URL ๊ตฌ๋ฌธ ๋ถ„์„
invalid-URL-unit

URL ๋‹จ์œ„๊ฐ€ ์•„๋‹Œ ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ ๋ฐœ๊ฒฌ๋œ๋‹ค.

"https://example.org/>"

" https://example.org "

"ht
tps://example.org
"

"https://example.org/%s"

ยท
special-scheme-missing-following-solidus

์ž…๋ ฅ์˜ ์Šคํ‚ด ๋’ค์— "//"๊ฐ€ ์˜ค์ง€ ์•Š๋Š”๋‹ค.

"file:c:/my-secret-folder"

"https:example.org"

const url = new URL("https:foo.html", "https://example.org/");
ยท
missing-scheme-non-relative-URL

์ž…๋ ฅ์— ์Šคํ‚ด์ด ์—†๋‹ค. ์ด๋Š” ์ž…๋ ฅ์ด ASCII ์•ŒํŒŒ๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ธฐ๋ฐ˜ URL์ด ์ œ๊ณต๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ๊ธฐ๋ฐ˜ URL์— ๋ถˆํˆฌ๋ช… ๊ฒฝ๋กœ๊ฐ€ ์žˆ์–ด ๊ธฐ๋ฐ˜ URL๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ž…๋ ฅ์˜ ์Šคํ‚ด์ด ์—†๊ณ  ๊ธฐ๋ฐ˜ URL๋„ ์ œ๊ณต๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ:

const url = new URL("๐Ÿ’ฉ");

์ž…๋ ฅ์˜ ์Šคํ‚ด์€ ์—†์ง€๋งŒ, ๊ธฐ๋ฐ˜ URL์— ๋ถˆํˆฌ๋ช… ๊ฒฝ๋กœ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ.

const url = new URL("๐Ÿ’ฉ", "mailto:user@example.org");
์˜ˆ
invalid-reverse-solidus

URL์ด ํŠน์ˆ˜ ์Šคํ‚ด์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, U+002F (/) ๋Œ€์‹  U+005C (\)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

"https://example.org\path\to\file"

ยท
invalid-credentials

์ž…๋ ฅ์ด ์ž๊ฒฉ ์ฆ๋ช…์„ ํฌํ•จํ•œ๋‹ค.

"https://user@example.org"

"ssh://user@example.org"

ยท
host-missing

์ž…๋ ฅ์ด ํŠน์ˆ˜ ์Šคํ‚ด์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ, ํ˜ธ์ŠคํŠธ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.

"https://#fragment"

"https://:443"

"https://user:pass@"

์˜ˆ
port-out-of-range

์ž…๋ ฅ์˜ ํฌํŠธ๊ฐ€ ๋„ˆ๋ฌด ํฌ๋‹ค.

"https://example.org:70000"

์˜ˆ
port-invalid

์ž…๋ ฅ์˜ ํฌํŠธ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š๋‹ค.

"https://example.org:7z"

์˜ˆ
file-invalid-Windows-drive-letter

์ž…๋ ฅ์ด ์ƒ๋Œ€ URL ๋ฌธ์ž์—ด์ด๊ณ , Windows ๋“œ๋ผ์ด๋ธŒ ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜๋ฉฐ, ๊ธฐ๋ฐ˜ URL์˜ ์Šคํ‚ด์ด "file"์ธ ๊ฒฝ์šฐ.

const url = new URL("/c:/path/to/file", "file:///c:/");
ยท
file-invalid-Windows-drive-letter-host

file: URL์˜ ํ˜ธ์ŠคํŠธ๊ฐ€ Windows ๋“œ๋ผ์ด๋ธŒ ๋ฌธ์ž์ด๋‹ค.

"file://c:"

ยท

1.2. ํŒŒ์„œ

EOF ์ฝ”๋“œ ํฌ์ธํŠธ๋Š” ๋ฌธ์ž์—ด์ด๋‚˜ ์ฝ”๋“œ ํฌ์ธํŠธ ์ŠคํŠธ๋ฆผ์˜ ๋์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐœ๋…์ ์ธ ์ฝ”๋“œ ํฌ์ธํŠธ์ž…๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด input์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋Š” input ๋‚ด์˜ ์ฝ”๋“œ ํฌ์ธํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ •์ˆ˜์ž…๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” input์˜ ์‹œ์ž‘์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ฐ’์ด โˆ’1์ด๋ฉด ์•„๋ฌด ๊ณณ๋„ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. input์˜ ์ฝ”๋“œ ํฌ์ธํŠธ ๊ธธ์ด๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด EOF ์ฝ”๋“œ ํฌ์ธํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

ํฌ์ธํ„ฐ๊ฐ€ ์‚ฌ์šฉ๋  ๋•Œ, c๋Š” ์ฝ”๋“œ ํฌ์ธํŠธ ์ค‘ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์œ„์น˜๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, ์•„๋ฌด ๊ณณ๋„ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š์„ ๋•Œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ๊ฐ€ ์•„๋ฌด ๊ณณ๋„ ๊ฐ€๋ฆฌํ‚ฌ ๋•Œ c๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํฌ์ธํ„ฐ๊ฐ€ ์‚ฌ์šฉ๋  ๋•Œ, remaining์€ ๋ฌธ์ž์—ด์˜ ๋๊นŒ์ง€์˜ ์ฝ”๋“œ ํฌ์ธํŠธ ์„œ๋ธŒ์ŠคํŠธ๋ง์„ ํฌ์ธํ„ฐ + 1 ๋ถ€ํ„ฐ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, c๊ฐ€ EOF ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ ์•„๋‹ ๋•Œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. c๊ฐ€ EOF ์ฝ”๋“œ ํฌ์ธํŠธ์ผ ๋•Œ remaining์€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

"mailto:username@example"๊ฐ€ ์ฒ˜๋ฆฌ ์ค‘์ธ ๋ฌธ์ž์—ด์ด๊ณ  ํฌ์ธํ„ฐ๊ฐ€ @์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค๋ฉด, c๋Š” U+0040 (@)์ด๊ณ  remaining์€ "example"์ž…๋‹ˆ๋‹ค.

๋นˆ ๋ฌธ์ž์—ด์„ ์ฒ˜๋ฆฌ ์ค‘์ด๊ณ  ํฌ์ธํ„ฐ๊ฐ€ ์‹œ์ž‘์„ ๊ฐ€๋ฆฌํ‚ค๋‹ค๊ฐ€ โˆ’1๋กœ ๊ฐ์†Œ๋œ๋‹ค๋ฉด, c๋‚˜ remaining์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์˜ค๋ฅ˜์ž…๋‹ˆ๋‹ค.

1.3. ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ ๋ฐ”์ดํŠธ

ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ๋œ ๋ฐ”์ดํŠธ๋Š” U+0025 (%) ๋’ค์— ๋‘ ๊ฐœ์˜ ASCII 16์ง„์ˆ˜ ์ˆซ์ž๊ฐ€ ์˜ค๋Š” ๋ฌธ์ž์—ด์ด๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ๋œ ๋ฐ”์ดํŠธ์˜ ์‹œํ€€์Šค๋Š” ํผ์„ผํŠธ ๋””์ฝ”๋”ฉ๋œ ๋‹ค์Œ BOM ์—†์ด UTF-8 ๋””์ฝ”๋”ฉ ๋˜๋Š” ์‹คํŒจ์— ์ „๋‹ฌ๋˜์—ˆ์„ ๋•Œ, ์ตœ์ข…์ ์œผ๋กœ ์‹คํŒจ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์ด๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€๋Š” ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ๋œ ๋ฐ”์ดํŠธ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ์œ„์น˜์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ˜ธ์ŠคํŠธ ํŒŒ์„œ์˜ ๊ฒฝ์šฐ ์ด ์กฐ์–ธ์„ ๋”ฐ๋ฅด์ง€ ์•Š์œผ๋ฉด ์น˜๋ช…์ ์ด์ง€๋งŒ, URL ๋ Œ๋”๋ง์˜ ๊ฒฝ์šฐ ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ๋œ ๋ฐ”์ดํŠธ๋Š” ํผ์„ผํŠธ ๋””์ฝ”๋”ฉ๋˜์–ด ๋ Œ๋”๋ง๋˜์ง€ ์•Š๋Š”๋‹ค.

๋ฐ”์ดํŠธ byte ๋ฅผ ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ ํ•˜๋ ค๋ฉด U+0025(%) ๋’ค์— byte ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‘ ๊ฐœ์˜ ASCII ๋Œ€๋ฌธ์ž 16์ง„์ˆ˜ ์ˆซ์ž ๊ฐ€ ์˜ค๋Š” ๋ฌธ์ž์—ด ์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ”์ดํŠธ ์‹œํ€€์Šค input ์„ ํผ์„ผํŠธ ๋””์ฝ”๋”ฉ ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

input์— ASCII ๋ฐ”์ดํŠธ๊ฐ€ ์•„๋‹Œ ๋ฐ”์ดํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์„ ๋•Œ BOM ์—†์ด UTF-8 ๋””์ฝ”๋“œ ์™ธ์˜ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์•ˆ์ „ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  1. output์„ ๋นˆ byte sequence๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. input์˜ ๊ฐ byte์— ๋Œ€ํ•ด:

    1. byte๊ฐ€ 0x25 (%)๊ฐ€ ์•„๋‹ˆ๋ฉด output์— byte๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , byte๊ฐ€ 0x25 (%)์ด๋ฉฐ input์˜ byte ๋‹ค์Œ ๋‘ ๋ฐ”์ดํŠธ๊ฐ€ 0x30(0)~0x39(9), 0x41(A)~0x46(F), 0x61(a)~0x66(f) ๋ฒ”์œ„์— ์†ํ•˜์ง€ ์•Š์œผ๋ฉด output์— byte๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

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

      1. bytePoint๋ฅผ input์˜ byte ๋’ค์˜ ๋‘ ๋ฐ”์ดํŠธ๋ฅผ ๋””์ฝ”๋”ฉ ํ›„ 16์ง„์ˆ˜ ์ˆซ์ž๋กœ ํ•ด์„ํ•œ ๊ฐ’์œผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

      2. bytePoint ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๋ฐ”์ดํŠธ๋ฅผ output์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

      3. input์˜ ๋‹ค์Œ ๋‘ ๋ฐ”์ดํŠธ๋ฅผ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.

  3. output์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์Šค์นผ๋ผ ๊ฐ’ ๋ฌธ์ž์—ด input ์„ ํผ์„ผํŠธ ๋””์ฝ”๋”ฉ ํ•˜๋ ค๋ฉด:

  1. bytes๋ฅผ input์˜ UTF-8 ์ธ์ฝ”๋”ฉ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค.

  2. bytes์˜ ํผ์„ผํŠธ ๋””์ฝ”๋”ฉ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ ๊ฒฐ๊ณผ๋Š” ์ž…๋ ฅ๋ณด๋‹ค U+0025 (%) ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ ๋” ๋งŽ๊ณ , ํผ์„ผํŠธ ๋””์ฝ”๋”ฉ ๊ฒฐ๊ณผ๋Š” ์ž…๋ ฅ๋ณด๋‹ค 0x25 (%) ๋ฐ”์ดํŠธ๊ฐ€ ๋” ์ ์Šต๋‹ˆ๋‹ค.


percent-encode set์€ ์ง‘ํ•ฉ์ด๋ฉฐ, ์ฝ”๋“œ ํฌ์ธํŠธ์˜ ์ง‘ํ•ฉ์ด๋‹ค.

C0 control percent-encode set์€ percent-encode set์ด๋ฉฐ, C0 ์ œ์–ด ๋ฌธ์ž์™€ U+007E (~)๋ณด๋‹ค ํฐ ๋ชจ๋“  ์ฝ”๋“œ ํฌ์ธํŠธ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

fragment percent-encode set์€ percent-encode set์ด๋ฉฐ, C0 control percent-encode set๊ณผ U+0020 SPACE, U+0022 ("), U+003C (<), U+003E (>), U+0060 (`)์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

query percent-encode set์€ percent-encode set์ด๋ฉฐ, C0 control percent-encode set๊ณผ U+0020 SPACE, U+0022 ("), U+0023 (#), U+003C (<), U+003E (>)๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

query percent-encode set์€ fragment percent-encode set์—์„œ U+0060 (`)์ด ๋น ์ ธ์žˆ์œผ๋ฏ€๋กœ ๊ทธ์™€ ๊ฐ™์€ ๊ด€์ ์—์„œ ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค.

special-query percent-encode set์€ percent-encode set์ด๋ฉฐ, query percent-encode set๊ณผ U+0027 (')์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

path percent-encode set์€ percent-encode set์ด๋ฉฐ, query percent-encode set๊ณผ U+003F (?), U+005E (^), U+0060 (`), U+007B ({), U+007D (})๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

userinfo percent-encode set์€ percent-encode set์ด๋ฉฐ, path percent-encode set๊ณผ U+002F (/), U+003A (:), U+003B (;), U+003D (=), U+0040 (@), U+005B ([)๋ถ€ํ„ฐ U+005D (])๊นŒ์ง€ ํฌํ•จํ•˜์—ฌ, U+007C (|)๋„ ํฌํ•จํ•œ๋‹ค.

component percent-encode set์€ percent-encode set์ด๋ฉฐ, userinfo percent-encode set๊ณผ U+0024 ($)๋ถ€ํ„ฐ U+0026 (&)๊นŒ์ง€, U+002B (+), U+002C (,)์„ ํฌํ•จํ•œ๋‹ค.

์ด๊ฒƒ์€ HTML์˜ registerProtocolHandler()์—์„œ ์‚ฌ์šฉ๋˜๊ณ , ๋‹ค๋ฅธ ํ‘œ์ค€์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ percent-encode ํ•˜์—ฌ URL์˜ ๊ฒฝ๋กœ(path), ์ฟผ๋ฆฌ(query), ํ”„๋ž˜๊ทธ๋จผํŠธ(fragment) ํ˜น์€ ๋ถˆํˆฌ๋ช… ํ˜ธ์ŠคํŠธ(opaque host)์— ์‚ฝ์ž…ํ•˜๋Š” ๋ฐ์—๋„ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. UTF-8 percent-encode์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด JavaScript์˜ encodeURIComponent()์™€ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ค€๋‹ค. [HTML] [ECMA-262]

application/x-www-form-urlencoded percent-encode set์€ percent-encode set์ด๋ฉฐ, component percent-encode set๊ณผ U+0021 (!), U+0027 (')๋ถ€ํ„ฐ U+0029 ์˜ค๋ฅธ์ชฝ ๊ด„ํ˜ธ, ๊ทธ๋ฆฌ๊ณ  U+007E (~)๋ฅผ ํฌํ•จํ•œ๋‹ค.

application/x-www-form-urlencoded percent-encode set์€ ASCII ์˜์ˆซ์ž, U+002A (*), U+002D (-), U+002E (.), U+005F (_)๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ์ฝ”๋“œ ํฌ์ธํŠธ๋ฅผ ํฌํ•จํ•œ๋‹ค.

percent-encode after encoding ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฃผ์–ด์ง„ ์ธ์ฝ”๋”ฉ(encoding) encoding, ์Šค์นผ๋ผ ๊ฐ’ ๋ฌธ์ž์—ด(scalar value string) input, ๊ทธ๋ฆฌ๊ณ  percent-encode set percentEncodeSet์„ ์‚ฌ์šฉํ•œ๋‹ค:

  1. ๋‹จ์–ธ: encoding์€ UTF-8์ด๊ฑฐ๋‚˜ percentEncodeSet์ด special-query percent-encode set ๋˜๋Š” application/x-www-form-urlencoded percent-encode set์ด์–ด์•ผ ํ•œ๋‹ค.

  2. spaceAsPlus๋ฅผ percentEncodeSet์ด application/x-www-form-urlencoded percent-encode set์ด๋ฉด true๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋กœ ํ•œ๋‹ค.

  3. encoder๋ฅผ ์ธ์ฝ”๋” ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ encoding์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ํ•œ๋‹ค.

  4. inputQueue๋ฅผ input์„ I/O ํ๋กœ ๋ณ€ํ™˜ํ•œ ๊ฐ’์œผ๋กœ ํ•œ๋‹ค.

  5. output์„ ๋นˆ ๋ฌธ์ž์—ด๋กœ ํ•œ๋‹ค.

  6. potentialError๋ฅผ 0์œผ๋กœ ํ•œ๋‹ค.

    while ๋ฃจํ”„๋ฅผ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ์ด ๊ฐ’์ด null์ด ์•„๋‹ˆ์–ด์•ผ ํ•œ๋‹ค.

  7. potentialError๊ฐ€ null์ด ์•„๋‹ ๋™์•ˆ:

    1. encodeOutput์„ ๋น„์–ด ์žˆ๋Š” I/O ํ๋กœ ํ•œ๋‹ค.

    2. potentialError๋ฅผ encode or fail์„ inputQueue, encoder, encodeOutput์œผ๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ํ•œ๋‹ค.

    3. encodeOutput์„ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๋กœ ๋ณ€ํ™˜ํ•œ ๊ฐ byte์— ๋Œ€ํ•ด:

      1. spaceAsPlus๊ฐ€ true์ด๊ณ  byte๊ฐ€ 0x20 (SP)์ด๋ฉด, output์— U+002B (+)๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ณ„์†ํ•œ๋‹ค.

      2. isomorph๋ฅผ ์ฝ”๋“œ ํฌ์ธํŠธ๋กœ ๋‘๊ณ , ๊ทธ ๊ฐ’์€ byte์˜ ๊ฐ’์ด ๋œ๋‹ค.

      3. ๋‹จ์–ธ: percentEncodeSet์€ ASCII ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ ์•„๋‹Œ ๋ชจ๋“  ๊ฐ’์„ ํฌํ•จํ•œ๋‹ค.

      4. isomorph๊ฐ€ percentEncodeSet์— ์—†๋‹ค๋ฉด output์— isomorph๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

      5. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, percent-encode byte๋ฅผ ํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ output์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    4. ๋งŒ์•ฝ potentialError๊ฐ€ null์ด ์•„๋‹ˆ๋ผ๋ฉด, output์— โ€œ%26%23โ€, ๊ทธ๋ฆฌ๊ณ  ASCII ์ˆซ์ž๋กœ potentialError๋ฅผ 10์ง„์ˆ˜๋กœ ๊ฐ€์žฅ ์งง์€ ์‹œํ€€์Šค๋กœ ๋‚˜ํƒ€๋‚ธ ๋’ค, โ€œ%3Bโ€๋ฅผ ๋ง๋ถ™์ธ๋‹ค.

      ์ด๊ฒƒ์€ encoding์ด UTF-8์ด ์•„๋‹ ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

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

percentEncodeSet ์ธ์ž ๊ฐ’ ์ค‘ U+0025 (%)๋ฅผ ์ธ์ฝ”๋”ฉํ•˜์—ฌ โ€œ์™•๋ณต ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ(roundtripable data)โ€๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ component percent-encode set๊ณผ application/x-www-form-urlencoded percent-encode set ๋‘ ๊ฐ€์ง€ ๋ฟ์ด๋‹ค. percentEncodeSet ์ธ์ž์˜ ๋‹ค๋ฅธ ๊ฐ’๋“ค (์ฆ‰, URL ํŒŒ์„œ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ’)์€ U+0025 (%)๋ฅผ ๋ณ€ํ™˜ํ•˜์ง€ ์•Š๊ณ  ๋„˜๊ฒจ์„œ ์ ์ ˆํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋ ค๋ฉด ๋จผ์ € percent-encode ํ•ด์•ผ ํ•œ๋‹ค.

UTF-8 percent-encode๋Š” ์Šค์นผ๋ผ ๊ฐ’ scalarValue์™€ percentEncodeSet์— ๋Œ€ํ•ด percent-encode after encoding์„ UTF-8, scalarValue(๋ฌธ์ž์—ด), percentEncodeSet์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

UTF-8 percent-encode๋Š” ์Šค์นผ๋ผ ๊ฐ’ ๋ฌธ์ž์—ด input๊ณผ percentEncodeSet์„ ์‚ฌ์šฉํ•ด percent-encode after encoding์„ UTF-8, input, percentEncodeSet์œผ๋กœ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


์•„๋ž˜๋Š” ์œ„์—์„œ ์ •์˜๋œ ์—ฐ์‚ฐ๋“ค์˜ ์˜ˆ์‹œ ์š”์•ฝ์ด๋‹ค:

Operation Input Output
Percent-encode input 0x23 "%23"
0x7F "%7F"
Percent-decode input `%25%s%1G` `%%s%1G`
Percent-decode input "โ€ฝ%25%2E" 0xE2 0x80 0xBD 0x25 0x2E
Percent-encode after encoding with Shift_JIS, input, and the special-query percent-encode set " " "%20"
"โ‰ก" "%81%DF"
"โ€ฝ" "%26%238253%3B"
Percent-encode after encoding with ISO-2022-JP, input, and the special-query percent-encode set "ยฅ" "%1B(J\%1B(B"
Percent-encode after encoding with Shift_JIS, input, and the application/x-www-form-urlencoded percent-encode set "1+1 โ‰ก 2%20โ€ฝ" "1%2B1+%81%DF+2%2520%26%238253%3B"
UTF-8 percent-encode input using the userinfo percent-encode set U+2261 (โ‰ก) "%E2%89%A1"
U+203D (โ€ฝ) "%E2%80%BD"
UTF-8 percent-encode input using the userinfo percent-encode set "Say whatโ€ฝ" "Say%20what%E2%80%BD"

2. ๋ณด์•ˆ ๊ณ ๋ ค์‚ฌํ•ญ

URL์˜ ๋ณด์•ˆ์€ ๊ทธ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. URL์„ ๋ Œ๋”๋ง, ํ•ด์„, ์ „๋‹ฌํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ URL์„ ๋ Œ๋”๋งํ•˜๊ฑฐ๋‚˜ ํ• ๋‹นํ•  ๋•Œ "์Šคํ‘ธํ•‘"์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค. ํ•œ ํ˜ธ์ŠคํŠธ ๋˜๋Š” URL์ด ๋‹ค๋ฅธ ๊ฒƒ๊ณผ ํ˜ผ๋™๋  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฒฉ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 1/l/I, m/rn/rri, 0/O, ๊ทธ๋ฆฌ๊ณ  ะฐ/a๊ฐ€ ๋ชจ๋‘ ์•„์ฃผ ๋น„์Šทํ•˜๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ๋‹ค. ๋” ์‹ฌ๊ฐํ•˜๊ฒŒ๋Š”, U+202A ์ขŒโ†’์šฐ ์ž„๋ฒ ๋”ฉ(LEFT-TO-RIGHT EMBEDDING) ๋“ฑ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ ๋ณด์ด์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. [UTR36]

URL์„ A์—์„œ B๋กœ ์ „๋‹ฌํ•  ๋•Œ ๋‘ ์ชฝ ๋ชจ๋‘ ์‹ ์ค‘ํ•˜๊ฒŒ ์ƒํ™ฉ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. A๋Š” ์›ํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ถœํ•  ์ˆ˜ ์žˆ๊ณ , B๋Š” ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ž…๋ ฅ์„ ๋ฐ›์•„ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ•ด๋ฅผ ๋ผ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ B๋Š” A๋ฅผ ์ ˆ๋Œ€ ์‹ ๋ขฐํ•ด์„œ๋Š” ์•ˆ ๋˜๋ฉฐ, ์–ธ์ œ๋“ ์ง€ A๋กœ๋ถ€ํ„ฐ ์˜ค๋Š” URL์ด ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์†Œ์Šค์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ํ˜ธ์ŠคํŠธ (๋„๋ฉ”์ธ ๋ฐ IP ์ฃผ์†Œ)

์ƒ์œ„ ์ˆ˜์ค€์—์„œ ํ˜ธ์ŠคํŠธ, ์œ ํšจํ•œ ํ˜ธ์ŠคํŠธ ๋ฌธ์ž์—ด, ํ˜ธ์ŠคํŠธ ํŒŒ์„œ, ํ˜ธ์ŠคํŠธ ์ง๋ ฌํ™”๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—ฐ๊ด€๋ฉ๋‹ˆ๋‹ค:

ํŒŒ์‹ฑ-์ง๋ ฌํ™” ๋ผ์šด๋“œํŠธ๋ฆฝ์˜ ๊ฒฐ๊ณผ๋Š” ํ˜ธ์ŠคํŠธ ํŒŒ์„œ์˜ isOpaque ์ธ์ž์— ๋”ฐ๋ผ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

์ž…๋ ฅ ์ถœ๋ ฅ (isOpaque = false) ์ถœ๋ ฅ (isOpaque = true)
EXAMPLE.COM example.com (๋„๋ฉ”์ธ) EXAMPLE.COM (๋ถˆํˆฌ๋ช… ํ˜ธ์ŠคํŠธ)
example%2Ecom example%2Ecom (๋ถˆํˆฌ๋ช… ํ˜ธ์ŠคํŠธ)
faรŸ.example xn--fa-hia.example (๋„๋ฉ”์ธ) fa%C3%9F.example (๋ถˆํˆฌ๋ช… ํ˜ธ์ŠคํŠธ)
0 0.0.0.0 (IPv4) 0 (๋ถˆํˆฌ๋ช… ํ˜ธ์ŠคํŠธ)
%30 %30 (๋ถˆํˆฌ๋ช… ํ˜ธ์ŠคํŠธ)
0x 0x (๋ถˆํˆฌ๋ช… ํ˜ธ์ŠคํŠธ)
0xffffffff 255.255.255.255 (IPv4) 0xffffffff (๋ถˆํˆฌ๋ช… ํ˜ธ์ŠคํŠธ)
[0:0::1] [::1] (IPv6)
[0:0::1%5D ์‹คํŒจ
[0:0::%31]
09 ์‹คํŒจ 09 (๋ถˆํˆฌ๋ช… ํ˜ธ์ŠคํŠธ)
example.255 example.255 (๋ถˆํˆฌ๋ช… ํ˜ธ์ŠคํŠธ)
example^example ์‹คํŒจ

3.1. ํ˜ธ์ŠคํŠธ ํ‘œํ˜„

ํ˜ธ์ŠคํŠธ๋Š” ๋„๋ฉ”์ธ, IP ์ฃผ์†Œ, ๋ถˆํˆฌ๋ช… ํ˜ธ์ŠคํŠธ, ๋˜๋Š” ๋นˆ ํ˜ธ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํ˜ธ์ŠคํŠธ๋Š” ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ๋กœ ์‚ฌ์šฉ๋˜์ง€๋งŒ, ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ URL์—์„œ ๋ถˆํˆฌ๋ช… ์‹๋ณ„์ž๋กœ ์‚ฌ์šฉ๋˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

์ „ํ˜•์ ์ธ URL์—์„œ host๊ฐ€ ๋ถˆํˆฌ๋ช… ํ˜ธ์ŠคํŠธ์ธ ์˜ˆ์‹œ๋Š” git://github.com/whatwg/url.git์ž…๋‹ˆ๋‹ค.

์•„๋ž˜ ๋ฌธ๋‹จ์—์„œ ์ฐธ์กฐ๋œ RFC๋Š” ์ •๋ณด ์ œ๊ณต์šฉ์ž…๋‹ˆ๋‹ค. ํŠน๋ณ„ํžˆ ๋ช…์‹œํ•˜์ง€ ์•Š๋Š” ํ•œ ํ˜ธ์ŠคํŠธ ์ž‘์„ฑ, ํŒŒ์‹ฑ, ์ง๋ ฌํ™”์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋„๋ฉ”์ธ์€ ๋„คํŠธ์›Œํฌ ๋‚ด ์˜์—ญ์„ ์‹๋ณ„ํ•˜๋Š” ๋น„์–ด ์žˆ์ง€ ์•Š์€ ASCII ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. [RFC1034]

๋„๋ฉ”์ธ ๋ ˆ์ด๋ธ”์€ ๋„๋ฉ”์ธ domain์„ U+002E(.)๋กœ ์—„๊ฒฉํ•˜๊ฒŒ ๋ถ„ํ• ํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

example.com๊ณผ example.com. ๋„๋ฉ”์ธ์€ ๋™๋“ฑํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณ„๊ฐœ์˜ ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰๋ฉ๋‹ˆ๋‹ค.

IP ์ฃผ์†Œ๋Š” IPv4 ์ฃผ์†Œ ๋˜๋Š” IPv6 ์ฃผ์†Œ์ž…๋‹ˆ๋‹ค.

IPv4 ์ฃผ์†Œ๋Š” ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ๋ฅผ ์‹๋ณ„ํ•˜๋Š” 32๋น„ํŠธ ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜์ž…๋‹ˆ๋‹ค. [RFC791]

IPv6 ์ฃผ์†Œ๋Š” ๋„คํŠธ์›Œํฌ ์ฃผ์†Œ๋ฅผ ์‹๋ณ„ํ•˜๋Š” 128๋น„ํŠธ ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ์ •์ˆ˜๋Š” ๋ฆฌ์ŠคํŠธ๋กœ ์ด๋ฃจ์–ด์ง„ 8๊ฐœ์˜ 16๋น„ํŠธ ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ, IPv6 ์ฃผ์†Œ์˜ ์กฐ๊ฐ์ด๋ผ ๋ถ€๋ฆ…๋‹ˆ๋‹ค. [RFC4291]

<zone_id> ์ง€์›์€ ์˜๋„์ ์œผ๋กœ ์ƒ๋žต๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ถˆํˆฌ๋ช… ํ˜ธ์ŠคํŠธ๋Š” ์ถ”๊ฐ€ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๋น„์–ด ์žˆ์ง€ ์•Š์€ ASCII ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

๋นˆ ํ˜ธ์ŠคํŠธ๋Š” ๋นˆ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

3.2. ํ˜ธ์ŠคํŠธ ๊ธฐํƒ€

๊ธˆ์ง€๋œ ํ˜ธ์ŠคํŠธ ์ฝ”๋“œ ํฌ์ธํŠธ๋Š” U+0000(NULL), U+0009(TAB), U+000A(LF), U+000D(CR), U+0020(๊ณต๋ฐฑ), U+0023(#), U+002F(/), U+003A(:), U+003C(<), U+003E(>), U+003F(?), U+0040(@), U+005B([), U+005C(\), U+005D(]), U+005E(^), ๋˜๋Š” U+007C(|) ์ž…๋‹ˆ๋‹ค.

๊ธˆ์ง€๋œ ๋„๋ฉ”์ธ ์ฝ”๋“œ ํฌ์ธํŠธ๋Š” ๊ธˆ์ง€๋œ ํ˜ธ์ŠคํŠธ ์ฝ”๋“œ ํฌ์ธํŠธ, C0 ์ œ์–ด ๋ฌธ์ž, U+0025(%), ๋˜๋Š” U+007F(DELETE)์ž…๋‹ˆ๋‹ค.

ํ˜ธ์ŠคํŠธ์˜ public suffix๋ฅผ ์–ป์œผ๋ ค๋ฉด host host์— ๋Œ€ํ•ด ๋‹ค์Œ ์ ˆ์ฐจ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” null ๋˜๋Š” Public Suffix List์— ํฌํ•จ๋œ host์˜ ์ผ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋„๋ฉ”์ธ์ž…๋‹ˆ๋‹ค. [PSL]

  1. host๊ฐ€ ๋„๋ฉ”์ธ์ด ์•„๋‹ˆ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. trailingDot์„ host๊ฐ€ "."๋กœ ๋๋‚˜๋ฉด ".", ์•„๋‹ˆ๋ฉด ๋นˆ ๋ฌธ์ž์—ด๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. publicSuffix๋ฅผ host๋ฅผ ๋„๋ฉ”์ธ์œผ๋กœ ํ•˜์—ฌ Public Suffix List ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค. [PSL]

  4. ๋‹จ์–ธ(Assert): publicSuffix๋Š” ASCII ๋ฌธ์ž์—ด์ด๋ฉฐ, ๋์ด trailingDot์œผ๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค.

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

ํ˜ธ์ŠคํŠธ์˜ ๋“ฑ๋ก ๊ฐ€๋Šฅ ๋„๋ฉ”์ธ์„ ์–ป์œผ๋ ค๋ฉด host host์— ๋Œ€ํ•ด ๋‹ค์Œ ์ ˆ์ฐจ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” null ๋˜๋Š” host์˜ public suffix์™€ ๊ทธ ์•ž์˜ ๋„๋ฉ”์ธ ๋ ˆ์ด๋ธ”(์žˆ๋‹ค๋ฉด)๋กœ ๊ตฌ์„ฑ๋œ ๋„๋ฉ”์ธ์ž…๋‹ˆ๋‹ค.

  1. host์˜ public suffix๊ฐ€ null์ด๊ฑฐ๋‚˜ host์˜ public suffix๊ฐ€ host์™€ ๋™๋“ฑํ•˜๋‹ค๋ฉด null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. trailingDot์„ host๊ฐ€ "."๋กœ ๋๋‚˜๋ฉด ".", ์•„๋‹ˆ๋ฉด ๋นˆ ๋ฌธ์ž์—ด๋กœ ๋‘ก๋‹ˆ๋‹ค.

  3. registrableDomain์„ host๋ฅผ ๋„๋ฉ”์ธ์œผ๋กœ ํ•˜์—ฌ Public Suffix List ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘ก๋‹ˆ๋‹ค. [PSL]

  4. ๋‹จ์–ธ(Assert): registrableDomain์€ ASCII ๋ฌธ์ž์—ด์ด๋ฉฐ, ๋์ด trailingDot์œผ๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค.

  5. registrableDomain์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ํ˜ธ์ŠคํŠธ ์ž…๋ ฅ Public suffix ๋“ฑ๋ก ๊ฐ€๋Šฅ ๋„๋ฉ”์ธ
com com null
example.com com example.com
www.example.com com example.com
sub.www.example.com com example.com
EXAMPLE.COM com example.com
example.com. com. example.com.
github.io github.io null
whatwg.github.io github.io whatwg.github.io
ุฅุฎุชุจุงุฑ xn--kgbechtv null
example.ุฅุฎุชุจุงุฑ xn--kgbechtv example.xn--kgbechtv
sub.example.ุฅุฎุชุจุงุฑ xn--kgbechtv example.xn--kgbechtv
[2001:0db8:85a3:0000:0000:8a2e:0370:7334] null null

๋ช…์„ธ์—์„œ๋Š” ๋ณด์•ˆ ๊ฒฐ์ •์„ ์œ„ํ•ด origin ๊ฐœ๋…์„ ์šฐ์„ ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. "public suffix"์™€ "๋“ฑ๋ก ๊ฐ€๋Šฅ ๋„๋ฉ”์ธ" ๊ฐœ๋…์€ ํ™•์‹คํ•œ ๋ณด์•ˆ ๊ฒฝ๊ณ„๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. public suffix list๋Š” ํด๋ผ์ด์–ธํŠธ๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ถŒ๊ณ ๋ฅผ ๋ฌด์‹œํ•˜๋Š” ๋ช…์„ธ๋Š” URL์˜ scheme์„ ๊ฒฐ์ •์— ํฌํ•จํ•ด์•ผ ํ• ์ง€ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋ฉฐ, ์ฆ‰ same site ๋˜๋Š” schemelessly same site ๊ฐœ๋…์„ ์‚ฌ์šฉํ• ์ง€ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3.3. IDNA

๋„๋ฉ”์ธ ํŒŒ์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์Šค์นผ๋ผ ๊ฐ’ ๋ฌธ์ž์—ด domain๊ณผ ๋ถˆ๋ฆฌ์–ธ beStrict๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ด ๋‹จ๊ณ„๋“ค์€ ์‹คํŒจ ๋˜๋Š” ๋„๋ฉ”์ธ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  1. strictResult๋ฅผ domain๊ณผ true๋กœ ๋„๋ฉ”์ธ ํŒŒ์„œ ToASCII๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. strictResult๊ฐ€ ์‹คํŒจ ๊ฐ’์ด๋ฉด, domain-to-ASCII ๊ฒ€์ฆ ์˜ค๋ฅ˜์ด๋‹ค. ์ด ๋‹จ๊ณ„๋Š” ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.

  3. beStrict๊ฐ€ true์ด๋ฉด:

    1. strictResult๊ฐ€ ์‹คํŒจ ๊ฐ’์ด๋ฉด, ์‹คํŒจ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

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

  4. result๋ฅผ null๋กœ ๋‘”๋‹ค.

  5. domain์ด ASCII ๋ฌธ์ž์—ด์ด๋ฉด, result๋ฅผ domain์„ ์†Œ๋ฌธ์žํ™”ํ•œ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    beStrict๊ฐ€ false์ด๊ณ  domain์ด ASCII ๋ฌธ์ž์—ด์ด๋ฉด, ์›น ํ˜ธํ™˜์„ฑ ๋•Œ๋ฌธ์— ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ Unicode ToASCII์˜ ๊ฒฐ๊ณผ์™€ ๊ด€๊ณ„์—†์ด domain์„ ์†Œ๋ฌธ์žํ™”ํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. IgnoreInvalidPunycode๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค. Punycode๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ๋””์ฝ”๋”ฉ๋  ์ˆ˜ ์žˆ์–ด๋„ ์—ฌ์ „ํžˆ ์œ ํšจ์„ฑ ๊ธฐ์ค€์—๋Š” ์‹คํŒจํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, xn--8i7caa๋Š” ๏ฝ—๏ฝ—๏ฝ—๋กœ ๋””์ฝ”๋”ฉ๋˜๋ฉฐ, ๊ทธ ์ฝ”๋“œ ํฌ์ธํŠธ๋“ค์˜ ์ƒํƒœ๋Š” "mapped"์ด๋‹ค. [UTS46]

  6. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด:

    1. result๋ฅผ domain๊ณผ false๋กœ ๋„๋ฉ”์ธ ํŒŒ์„œ ToASCII๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. result๊ฐ€ ์‹คํŒจ ๊ฐ’์ด๋ฉด, ์‹คํŒจ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  7. result๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด, ์‹คํŒจ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  8. result๊ฐ€ ๊ธˆ์ง€๋œ ๋„๋ฉ”์ธ ์ฝ”๋“œ ํฌ์ธํŠธ๋ฅผ ํฌํ•จํ•˜๋ฉด, ์‹คํŒจ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    ์›น ํ˜ธํ™˜์„ฑ๊ณผ DNS ๊ธฐ๋ฐ˜์ด ์•„๋‹Œ ์‹œ์Šคํ…œ๊ณผ์˜ ํ˜ธํ™˜์„ฑ ๋•Œ๋ฌธ์— ๊ธˆ์ง€๋œ ๋„๋ฉ”์ธ ์ฝ”๋“œ ํฌ์ธํŠธ๋Š” UseSTD3ASCIIRules๊ฐ€ true์ผ ๋•Œ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ๋“ค์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์ด๋‹ค. ์ด์Šˆ #397๋„ ์ฐธ์กฐํ•˜๋ผ.

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

์ด ๋ฌธ์„œ์™€ ์›น ํ”Œ๋žซํผ ์ „๋ฐ˜์€ IDNA2008์ด ์•„๋‹ˆ๋ผ Unicode IDNA Compatibility Processing์„ ์‚ฌ์šฉํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, โ˜•.example์€ ์‹คํŒจ๊ฐ€ ์•„๋‹ˆ๋ผ xn--53h.example์ด ๋œ๋‹ค. [UTS46] [RFC5890]

๋„๋ฉ”์ธ ํŒŒ์„œ ToASCII ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์Šค์นผ๋ผ ๊ฐ’ ๋ฌธ์ž์—ด domain๊ณผ ๋ถˆ๋ฆฌ์–ธ beStrict๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, domain_name์„ domain์œผ๋กœ, CheckHyphens๋ฅผ beStrict๋กœ, CheckBidi๋ฅผ true๋กœ, CheckJoiners๋ฅผ true๋กœ, UseSTD3ASCIIRules๋ฅผ beStrict๋กœ, Transitional_Processing์„ false๋กœ, VerifyDnsLength๋ฅผ beStrict๋กœ, ๊ทธ๋ฆฌ๊ณ  IgnoreInvalidPunycode๋ฅผ false๋กœ ์„ค์ •ํ•˜์—ฌ Unicode ToASCII๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. [UTS46]

๋„๋ฉ”์ธ์„ Unicode๋กœ ๋ณ€ํ™˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋„๋ฉ”์ธ domain์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค:

  1. result๋ฅผ domain_name์„ domain์œผ๋กœ ์„ค์ •ํ•˜๊ณ  Unicode ToUnicode๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค. CheckHyphens๋Š” false, CheckBidi๋Š” true, CheckJoiners๋Š” true, UseSTD3ASCIIRules๋Š” false, Transitional_Processing์€ false, ๊ทธ๋ฆฌ๊ณ  IgnoreInvalidPunycode๋Š” false๋กœ ์„ค์ •ํ•œ๋‹ค. [UTS46]

  2. ์˜ค๋ฅ˜๊ฐ€ ๊ธฐ๋ก๋˜์—ˆ์œผ๋ฉด, domain์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    domain์€ ํ˜ธ์ŠคํŠธ ํŒŒ์„œ์˜ ๊ฒฐ๊ณผ๋กœ๋งŒ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๊ธฐ๋ก๋œ ๋ชจ๋“  ์˜ค๋ฅ˜๋Š” ์ด๋ฏธ ๊ฒ€์ฆ ์˜ค๋ฅ˜๋กœ ํ‘œ์‹œ๋˜์—ˆ์„ ๊ฒƒ์ด๋‹ค. domain์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋„๋ฉ”์ธ ํŒŒ์„œ์™€ ๋„๋ฉ”์ธ์„ Unicode๋กœ ๋ณ€ํ™˜์ด xn--8i7caa์™€ ๊ฐ™์€ ์ž…๋ ฅ์—์„œ ์™•๋ณต๋˜๋„๋ก ๋ณด์žฅํ•œ๋‹ค.

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

3.4. ํ˜ธ์ŠคํŠธ ์ž‘์„ฑ

์œ ํšจํ•œ ํ˜ธ์ŠคํŠธ ๋ฌธ์ž์—ด์€ ์œ ํšจํ•œ ๋„๋ฉ”์ธ ๋ฌธ์ž์—ด, ์œ ํšจํ•œ IPv4 ์ฃผ์†Œ ๋ฌธ์ž์—ด, ๋˜๋Š” ๋‹ค์Œ์ด์–ด์•ผ ํ•œ๋‹ค: U+005B ([), ๋’ค์ด์–ด ์œ ํšจํ•œ IPv6 ์ฃผ์†Œ ๋ฌธ์ž์—ด, ๋’ค์ด์–ด U+005D (]).

๋ฌธ์ž์—ด input์€ ๋‹ค์Œ ๋‹จ๊ณ„๋“ค์ด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์œ ํšจํ•œ ๋„๋ฉ”์ธ์ด๋‹ค:

  1. domain์„ input๊ณผ true๋กœ ๋„๋ฉ”์ธ ํŒŒ์„œ๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. domain์ด ์‹คํŒจ์ด๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. domain์— ๋Œ€ํ•ด ์ˆซ์ž๋กœ ๋๋‚˜๋Š”์ง€ ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๊ฐ€ true์ด๋ฉด, false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

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

์ด์ƒ์ ์œผ๋กœ๋Š” ์ด๋ฅผ ๋‘๋”์ง€ ์žก๊ธฐ์‹ ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ผ, ์œ ํšจํ•œ ๋„๋ฉ”์ธ์„ ๊ตฌ์„ฑํ•˜๋Š” ์ฝ”๋“œ ํฌ์ธํŠธ ์‹œํ€€์Šค์˜ ๊ด€์ ์—์„œ ์ •์˜ํ•œ๋‹ค: ์ด์Šˆ 245.

์œ ํšจํ•œ ๋„๋ฉ”์ธ ๋ฌธ์ž์—ด์€ ์œ ํšจํ•œ ๋„๋ฉ”์ธ์ธ ๋ฌธ์ž์—ด์ด์–ด์•ผ ํ•œ๋‹ค.

์œ ํšจํ•œ IPv4 ์ฃผ์†Œ ๋ฌธ์ž์—ด์€ 0 ์ด์ƒ 255 ์ดํ•˜์˜ ๋ฒ”์œ„์— ์žˆ๋Š” 10์ง„์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”, ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ์งง์€ ASCII ์ˆซ์ž ๋ฌธ์ž์—ด ๋„ค ๊ฐœ๊ฐ€ U+002E (.)๋กœ ์„œ๋กœ ๊ตฌ๋ถ„๋œ ๊ฒƒ์ด์–ด์•ผ ํ•œ๋‹ค.

์œ ํšจํ•œ IPv6 ์ฃผ์†Œ ๋ฌธ์ž์—ด์€ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค:

์œ ํšจํ•œ IPv6 ์กฐ๊ฐ ๋ฐ IPv4 ๋ฌธ์ž์—ด์€ ์œ ํšจํ•œ IPv6 ์กฐ๊ฐ ๋ฌธ์ž์—ด ๋’ค์— U+003A (:)๊ฐ€ ์˜ค๊ณ , ๊ทธ ๋’ค์— ์œ ํšจํ•œ IPv4 ์ฃผ์†Œ ๋ฌธ์ž์—ด์ด ์˜ค๋Š” ๊ฒƒ์ด๊ฑฐ๋‚˜; ๋˜๋Š” ์œ ํšจํ•œ IPv4 ์ฃผ์†Œ ๋ฌธ์ž์—ด ๋‹จ๋…์ด๋‹ค.

์œ ํšจํ•œ IPv6 ์กฐ๊ฐ ๋ฌธ์ž์—ด์€ ํ•˜๋‚˜ ์ด์ƒ์˜ ์œ ํšจํ•œ IPv6 ์กฐ๊ฐ ๋ฌธ์ž์—ด์ด U+003A (:)๋กœ ์„œ๋กœ ๊ตฌ๋ถ„๋œ ๊ฒƒ์ด๋‹ค.

์œ ํšจํ•œ IPv6 ์กฐ๊ฐ ๋ฌธ์ž์—ด์€ 0 ์ด์ƒ 0xFFFF ์ดํ•˜์˜ ๋ฒ”์œ„์— ์žˆ๋Š” 16์ง„์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”, ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ์งง์€ ASCII 16์ง„์ˆ˜ ์ˆซ์ž ๋ฌธ์ž์—ด์ด๋‹ค.

์œ ํšจํ•œ IPv6 ์กฐ๊ฐ ๋ฌธ์ž์—ด์˜ ์œ ํšจ ์กฐ๊ฐ ๊ธธ์ด๋Š” ๊ทธ๊ฒƒ์ด ํฌํ•จํ•˜๋Š” ์œ ํšจํ•œ IPv6 ์กฐ๊ฐ ๋ฌธ์ž์—ด์˜ ์ˆ˜์ด๋‹ค. ์œ ํšจ ์กฐ๊ฐ ๊ธธ์ด ์œ ํšจํ•œ IPv6 ์กฐ๊ฐ ๋ฐ IPv4 ๋ฌธ์ž์—ด์˜ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๊ฒƒ์ด ํฌํ•จํ•˜๋Š” ์œ ํšจํ•œ IPv6 ์กฐ๊ฐ ๋ฌธ์ž์—ด์˜ ์ˆ˜์— 2๋ฅผ ๋”ํ•œ ๊ฐ’์ด๋‹ค.

์ด๋Š” A Recommendation for IPv6 Address Text Representation์—์„œ ํŒŒ์ƒ๋˜์—ˆ๋‹ค. IPv4์™€์˜ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ์„ ํ–‰ 0์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค. [RFC5952]

์œ ํšจํ•œ ๋ถˆํˆฌ๋ช… ํ˜ธ์ŠคํŠธ ๋ฌธ์ž์—ด์€ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค:

์ด๋Š” ์œ ํšจํ•œ ํ˜ธ์ŠคํŠธ ๋ฌธ์ž์—ด์˜ ์ •์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๋‹ค. ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ๋ฌธ๋งฅ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

3.5. ํ˜ธ์ŠคํŠธ ํŒŒ์‹ฑ

ํ˜ธ์ŠคํŠธ ํŒŒ์„œ๋Š” ์Šค์นผ๋ผ ๊ฐ’ ๋ฌธ์ž์—ด input๊ณผ ์„ ํƒ์  boolean isOpaque(๊ธฐ๋ณธ๊ฐ’ false)๋ฅผ ๋ฐ›์•„ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ด ๋‹จ๊ณ„๋“ค์€ failure ๋˜๋Š” ํ˜ธ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  1. input์ด U+005B ([)๋กœ ์‹œ์ž‘ํ•˜๋ฉด:

    1. input์ด U+005D (])๋กœ ๋๋‚˜์ง€ ์•Š์œผ๋ฉด, IPv6-unclosed ๊ฒ€์ฆ ์˜ค๋ฅ˜, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    2. input์—์„œ ์•ž์˜ U+005B ([)์™€ ๋’ค์˜ U+005D (])๋ฅผ ์ œ๊ฑฐํ•œ ๊ฐ’์œผ๋กœ IPv6 ๊ตฌ๋ฌธ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. isOpaque๊ฐ€ true์ด๋ฉด, ๋ถˆํˆฌ๋ช… ํ˜ธ์ŠคํŠธ ๊ตฌ๋ฌธ ๋ถ„์„ input์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. Assert: input์€ ๋นˆ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋‹ค.

  4. input์— ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ๋œ ๋ฐ”์ดํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด, domain-percent-encoded ๊ฒ€์ฆ ์˜ค๋ฅ˜.

  5. domain์„ input์˜ ํผ์„ผํŠธ ๋””์ฝ”๋”ฉ์— BOM ์—†๋Š” UTF-8 ๋””์ฝ”๋”ฉ์„ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

    ๋˜๋Š”, BOM ์—†๋Š” UTF-8 ๋””์ฝ”๋”ฉ ๋˜๋Š” ์‹คํŒจ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , failure์— ๋Œ€ํ•ด ์กฐ๊ธฐ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋„๋ฉ”์ธ ํŒŒ์„œ๋Š” U+FFFD (๏ฟฝ)์—์„œ ์‹คํŒจํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  6. asciiDomain์„ ๋„๋ฉ”์ธ ํŒŒ์„œ๋ฅผ domain๊ณผ false๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

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

  8. asciiDomain์ด ์ˆซ์ž๋กœ ๋๋‚˜๋ฉด:

    1. domain์ด ASCII ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ฉด, IPv4-non-ASCII-input ๊ฒ€์ฆ ์˜ค๋ฅ˜.

    2. IPv4 ๊ตฌ๋ฌธ ๋ถ„์„ asciiDomain์˜ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

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


์ˆซ์ž๋กœ ๋๋‚˜๋Š”์ง€ ๊ฒ€์‚ฌ๊ธฐ๋Š” ASCII ๋ฌธ์ž์—ด input์„ ๋ฐ›์•„ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ด ๋‹จ๊ณ„๋“ค์€ boolean์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  1. Assert: input์€ ๋นˆ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋‹ค.

  2. parts๋ฅผ input์„ U+002E (.)์—์„œ ์—„๊ฒฉํ•˜๊ฒŒ ๋ถ„ํ• ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  3. parts์˜ ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์ด ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด, parts์—์„œ ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•œ๋‹ค.

  4. last๋ฅผ parts์˜ ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์œผ๋กœ ๋‘”๋‹ค.

  5. last๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๊ณ  ASCII ์ˆซ์ž๋งŒ ํฌํ•จํ•˜๋ฉด, true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    ์ž˜๋ชป๋œ ์ž…๋ ฅ "09"๋Š” ์ดํ›„ ๋‹จ๊ณ„์—์„œ IPv4 ํŒŒ์„œ์— ์˜ํ•ด ์žกํžŒ๋‹ค.

  6. last๋ฅผ IPv4 ์ˆซ์ž๋กœ ๊ตฌ๋ฌธ ๋ถ„์„ํ–ˆ์„ ๋•Œ failure๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉด, true๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    ์ด๋Š” last๊ฐ€ "0X" ๋˜๋Š” "0x"์ด๊ณ , ๊ทธ ๋’ค์— 0๊ฐœ ์ด์ƒ์˜ ASCII 16์ง„ ์ˆซ์ž๊ฐ€ ์˜ค๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ๊ณผ ๋™๋“ฑํ•˜๋‹ค.

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

IPv4 ํŒŒ์„œ๋Š” ASCII ๋ฌธ์ž์—ด input์„ ๋ฐ›์•„ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ด ๋‹จ๊ณ„๋“ค์€ failure ๋˜๋Š” IPv4 ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

IPv4 ํŒŒ์„œ๋Š” ์ง์ ‘ ํ˜ธ์ถœํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. ๋Œ€์‹  ํ˜ธ์ŠคํŠธ ํŒŒ์„œ์˜ ๋ฐ˜ํ™˜ ๊ฐ’์ด IPv4 ์ฃผ์†Œ์ธ์ง€ ํ™•์ธํ•œ๋‹ค.

  1. parts๋ฅผ input์„ U+002E (.)์—์„œ ์—„๊ฒฉํ•˜๊ฒŒ ๋ถ„ํ• ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. parts์˜ ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์ด ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด:

    1. IPv4-empty-part ๊ฒ€์ฆ ์˜ค๋ฅ˜.

    2. parts์˜ ํฌ๊ธฐ๊ฐ€ 1๋ณด๋‹ค ํฌ๋ฉด, parts์—์„œ ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•œ๋‹ค.

  3. parts์˜ ํฌ๊ธฐ๊ฐ€ 4๋ณด๋‹ค ์ž‘์œผ๋ฉด, IPv4-too-few-parts ๊ฒ€์ฆ ์˜ค๋ฅ˜.

  4. parts์˜ ํฌ๊ธฐ๊ฐ€ 4๋ณด๋‹ค ํฌ๋ฉด, IPv4-too-many-parts ๊ฒ€์ฆ ์˜ค๋ฅ˜, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  5. numbers๋ฅผ ๋นˆ ๋ชฉ๋ก์œผ๋กœ ๋‘”๋‹ค.

  6. parts์˜ ๊ฐ part์— ๋Œ€ํ•ด ๋ฐ˜๋ณตํ•œ๋‹ค:

    1. result๋ฅผ part๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

    2. result๊ฐ€ failure์ด๋ฉด, IPv4-non-numeric-part ๊ฒ€์ฆ ์˜ค๋ฅ˜, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    3. result[1]์ด true์ด๋ฉด, IPv4-non-decimal-part ๊ฒ€์ฆ ์˜ค๋ฅ˜.

    4. result[0]์„ numbers์— ์ถ”๊ฐ€ํ•œ๋‹ค.

  7. numbers์˜ ์–ด๋–ค ํ•ญ๋ชฉ์ด๋“  255๋ณด๋‹ค ํฌ๋ฉด, IPv4-out-of-range-part ๊ฒ€์ฆ ์˜ค๋ฅ˜.

  8. numbers์—์„œ ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์„ ์ œ์™ธํ•œ ์–ด๋–ค ํ•ญ๋ชฉ์ด๋“  255๋ณด๋‹ค ํฌ๋ฉด, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  9. numbers์˜ ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์ด 256(5 โˆ’ numbers์˜ ํฌ๊ธฐ)๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  10. ipv4๋ฅผ numbers์˜ ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์œผ๋กœ ๋‘”๋‹ค.

  11. numbers์—์„œ ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•œ๋‹ค.

  12. counter๋ฅผ 0์œผ๋กœ ๋‘”๋‹ค.

  13. numbers์˜ ๊ฐ n์— ๋Œ€ํ•ด ๋ฐ˜๋ณตํ•œ๋‹ค:

    1. ipv4๋ฅผ n ร— 256(3 โˆ’ counter)๋งŒํผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

    2. counter๋ฅผ 1๋งŒํผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

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

IPv4 ์ˆซ์ž ํŒŒ์„œ๋Š” ASCII ๋ฌธ์ž์—ด input์„ ๋ฐ›์•„ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ด ๋‹จ๊ณ„๋“ค์€ failure ๋˜๋Š” ์ˆซ์ž์™€ boolean์˜ ํŠœํ”Œ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  1. input์ด ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

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

  3. R์„ 10์œผ๋กœ ๋‘”๋‹ค.

  4. input์ด ์ ์–ด๋„ ๋‘ ๊ฐœ์˜ ์ฝ”๋“œ ํฌ์ธํŠธ๋ฅผ ํฌํ•จํ•˜๊ณ  ์ฒ˜์Œ ๋‘ ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ "0X" ๋˜๋Š” "0x"์ด๋ฉด:

    1. validationError๋ฅผ true๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. input์—์„œ ์ฒ˜์Œ ๋‘ ์ฝ”๋“œ ํฌ์ธํŠธ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

    3. R์„ 16์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  5. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , input์ด ์ ์–ด๋„ ๋‘ ๊ฐœ์˜ ์ฝ”๋“œ ํฌ์ธํŠธ๋ฅผ ํฌํ•จํ•˜๊ณ  ์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ U+0030 (0)์ด๋ฉด:

    1. validationError๋ฅผ true๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. input์—์„œ ์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ ํฌ์ธํŠธ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

    3. R์„ 8๋กœ ์„ค์ •ํ•œ๋‹ค.

  6. input์ด ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด, (0, true)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  7. input์— radix-R ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  8. output์„ input์ด radix-R ํ‘œ๊ธฐ๋ฒ•์—์„œ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆ˜ํ•™์  ์ •์ˆ˜ ๊ฐ’์œผ๋กœ ๋‘”๋‹ค. ์ด๋•Œ ๊ฐ’ 0๋ถ€ํ„ฐ 15๊นŒ์ง€์˜ ์ˆซ์ž์—๋Š” ASCII 16์ง„ ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  9. (output, validationError)๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


IPv6 ํŒŒ์„œ๋Š” ์Šค์นผ๋ผ ๊ฐ’ ๋ฌธ์ž์—ด input์„ ๋ฐ›์•„ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ด ๋‹จ๊ณ„๋“ค์€ failure ๋˜๋Š” IPv6 ์ฃผ์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

IPv6 ํŒŒ์„œ๋Š” ์ด๋ก ์ ์œผ๋กœ ์ง์ ‘ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์‹ค์ œ๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ธฐ ์ „์— ์ด ๋ฌธ์„œ์˜ ํŽธ์ง‘์ž๋“ค๊ณผ ๋…ผ์˜ํ•˜๊ธฐ ๋ฐ”๋ž€๋‹ค.

  1. address๋ฅผ ๋ชจ๋“  ์กฐ๊ฐ์ด 0์ธ ์ƒˆ IPv6 ์ฃผ์†Œ๋กœ ๋‘”๋‹ค.

  2. pieceIndex๋ฅผ 0์œผ๋กœ ๋‘”๋‹ค.

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

  4. pointer๋ฅผ input์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋กœ ๋‘”๋‹ค.

  5. c๊ฐ€ U+003A (:)์ด๋ฉด:

    1. remaining์ด U+003A (:)๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š์œผ๋ฉด, IPv6-invalid-compression ๊ฒ€์ฆ ์˜ค๋ฅ˜, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    2. pointer๋ฅผ 2๋งŒํผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

    3. pieceIndex๋ฅผ 1๋งŒํผ ์ฆ๊ฐ€์‹œํ‚จ ๋‹ค์Œ compress๋ฅผ pieceIndex๋กœ ์„ค์ •ํ•œ๋‹ค.

  6. c๊ฐ€ EOF ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ ์•„๋‹Œ ๋™์•ˆ:

    1. pieceIndex๊ฐ€ 8์ด๋ฉด, IPv6-too-many-pieces ๊ฒ€์ฆ ์˜ค๋ฅ˜, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    2. c๊ฐ€ U+003A (:)์ด๋ฉด:

      1. compress๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, IPv6-multiple-compression ๊ฒ€์ฆ ์˜ค๋ฅ˜, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      2. pointer์™€ pieceIndex๋ฅผ 1๋งŒํผ ์ฆ๊ฐ€์‹œํ‚ค๊ณ , compress๋ฅผ pieceIndex๋กœ ์„ค์ •ํ•œ ๋‹ค์Œ continueํ•œ๋‹ค.
    3. value์™€ length๋ฅผ 0์œผ๋กœ ๋‘”๋‹ค.

    4. length๊ฐ€ 4๋ณด๋‹ค ์ž‘๊ณ  c๊ฐ€ ASCII 16์ง„ ์ˆซ์ž์ธ ๋™์•ˆ, value๋ฅผ value ร— 0x10 + 16์ง„์ˆ˜๋กœ ํ•ด์„ํ•œ c๋กœ ์„ค์ •ํ•˜๊ณ , pointer์™€ length๋ฅผ 1๋งŒํผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

    5. c๊ฐ€ U+002E (.)์ด๋ฉด:

      1. length๊ฐ€ 0์ด๋ฉด, IPv4-in-IPv6-invalid-code-point ๊ฒ€์ฆ ์˜ค๋ฅ˜, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      2. pointer๋ฅผ length๋งŒํผ ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

      3. pieceIndex๊ฐ€ 6๋ณด๋‹ค ํฌ๋ฉด, IPv4-in-IPv6-too-many-pieces ๊ฒ€์ฆ ์˜ค๋ฅ˜, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      4. numbersSeen์„ 0์œผ๋กœ ๋‘”๋‹ค.

      5. c๊ฐ€ EOF ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ ์•„๋‹Œ ๋™์•ˆ:

        1. ipv4Piece๋ฅผ null๋กœ ๋‘”๋‹ค.

        2. numbersSeen์ด 0๋ณด๋‹ค ํฌ๋ฉด:

          1. c๊ฐ€ U+002E (.)์ด๊ณ  numbersSeen์ด 4๋ณด๋‹ค ์ž‘์œผ๋ฉด, pointer๋ฅผ 1๋งŒํผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

          2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, IPv4-in-IPv6-invalid-code-point ๊ฒ€์ฆ ์˜ค๋ฅ˜, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
        3. c๊ฐ€ ASCII ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ฉด, IPv4-in-IPv6-invalid-code-point ๊ฒ€์ฆ ์˜ค๋ฅ˜, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

        4. c๊ฐ€ ASCII ์ˆซ์ž์ธ ๋™์•ˆ:

          1. number๋ฅผ ์‹ญ์ง„์ˆ˜๋กœ ํ•ด์„ํ•œ c๋กœ ๋‘”๋‹ค.

          2. ipv4Piece๊ฐ€ null์ด๋ฉด, ipv4Piece๋ฅผ number๋กœ ์„ค์ •ํ•œ๋‹ค.

          3. ๊ทธ๋ ‡์ง€ ์•Š๊ณ  ipv4Piece๊ฐ€ 0์ด๋ฉด, IPv4-in-IPv6-invalid-code-point ๊ฒ€์ฆ ์˜ค๋ฅ˜, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

          4. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ipv4Piece๋ฅผ ipv4Piece ร— 10 + number๋กœ ์„ค์ •ํ•œ๋‹ค.

          5. ipv4Piece๊ฐ€ 255๋ณด๋‹ค ํฌ๋ฉด, IPv4-in-IPv6-out-of-range-part ๊ฒ€์ฆ ์˜ค๋ฅ˜, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

          6. pointer๋ฅผ 1๋งŒํผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

        5. address[pieceIndex]๋ฅผ address[pieceIndex] ร— 0x100 + ipv4Piece๋กœ ์„ค์ •ํ•œ๋‹ค.

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

        7. numbersSeen์ด 2 ๋˜๋Š” 4์ด๋ฉด, pieceIndex๋ฅผ 1๋งŒํผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

      6. numbersSeen์ด 4๊ฐ€ ์•„๋‹ˆ๋ฉด, IPv4-in-IPv6-too-few-parts ๊ฒ€์ฆ ์˜ค๋ฅ˜, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      7. Breakํ•œ๋‹ค.

    6. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , c๊ฐ€ U+003A (:)์ด๋ฉด:

      1. pointer๋ฅผ 1๋งŒํผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

      2. c๊ฐ€ EOF ์ฝ”๋“œ ํฌ์ธํŠธ์ด๋ฉด, IPv6-invalid-code-point ๊ฒ€์ฆ ์˜ค๋ฅ˜, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    7. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , c๊ฐ€ EOF ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ ์•„๋‹ˆ๋ฉด, IPv6-invalid-code-point ๊ฒ€์ฆ ์˜ค๋ฅ˜, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    8. length๊ฐ€ 1๋ณด๋‹ค ํฌ๊ณ  value๊ฐ€ 0x10length โˆ’ 1๋ณด๋‹ค ์ž‘์œผ๋ฉด, IPv6-piece-leading-zero ๊ฒ€์ฆ ์˜ค๋ฅ˜.

    9. address[pieceIndex]๋ฅผ value๋กœ ์„ค์ •ํ•œ๋‹ค.

    10. pieceIndex๋ฅผ 1๋งŒํผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

  7. compress๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด:

    1. swaps๋ฅผ pieceIndex โˆ’ compress๋กœ ๋‘”๋‹ค.

    2. pieceIndex๋ฅผ 7๋กœ ์„ค์ •ํ•œ๋‹ค.

    3. pieceIndex๊ฐ€ 0์ด ์•„๋‹ˆ๊ณ  swaps๊ฐ€ 0๋ณด๋‹ค ํฐ ๋™์•ˆ, address[pieceIndex]์™€ address[compress + swaps โˆ’ 1]์„ ๋งž๋ฐ”๊พผ ๋‹ค์Œ, pieceIndex์™€ swaps๋ฅผ ๋ชจ๋‘ 1๋งŒํผ ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

  8. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , compress๊ฐ€ null์ด๊ณ  pieceIndex๊ฐ€ 8์ด ์•„๋‹ˆ๋ฉด, IPv6-too-few-pieces ๊ฒ€์ฆ ์˜ค๋ฅ˜, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

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


๋ถˆํˆฌ๋ช… ํ˜ธ์ŠคํŠธ ํŒŒ์„œ๋Š” ์Šค์นผ๋ผ ๊ฐ’ ๋ฌธ์ž์—ด input์„ ๋ฐ›์•„, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ด ๋‹จ๊ณ„๋“ค์€ failure ๋˜๋Š” ๋ถˆํˆฌ๋ช… ํ˜ธ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  1. input์— ๊ธˆ์ง€๋œ ํ˜ธ์ŠคํŠธ ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด, host-invalid-code-point ๊ฒ€์ฆ ์˜ค๋ฅ˜, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. input์— ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ณ , ๊ทธ๊ฒƒ์ด URL ์ฝ”๋“œ ํฌ์ธํŠธ๋„ ์•„๋‹ˆ๋ฉฐ U+0025 (%)๋„ ์•„๋‹ˆ๋ฉด, invalid-URL-unit ๊ฒ€์ฆ ์˜ค๋ฅ˜.

  3. input์— U+0025 (%)๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ณ  ๊ทธ ๋’ค์˜ ๋‘ ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ ASCII 16์ง„ ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ฉด, invalid-URL-unit ๊ฒ€์ฆ ์˜ค๋ฅ˜.

  4. input์— C0 ์ œ์–ด ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ ์ง‘ํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ UTF-8 ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ์„ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

3.6. ํ˜ธ์ŠคํŠธ ์ง๋ ฌํ™”

ํ˜ธ์ŠคํŠธ ์ง๋ ฌํ™”๊ธฐ๋Š” ํ˜ธ์ŠคํŠธ host๋ฅผ ๋ฐ›์•„ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ด ๋‹จ๊ณ„๋“ค์€ ASCII ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  1. host๊ฐ€ IPv4 ์ฃผ์†Œ์ด๋ฉด, host์— IPv4 ์ง๋ ฌํ™”๊ธฐ๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , host๊ฐ€ IPv6 ์ฃผ์†Œ์ด๋ฉด, U+005B ([)์™€ host์— IPv6 ์ง๋ ฌํ™”๊ธฐ๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ, ๊ทธ๋ฆฌ๊ณ  U+005D (])๋ฅผ ์ฐจ๋ก€๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, host๋Š” ๋„๋ฉ”์ธ, ๋ถˆํˆฌ๋ช… ํ˜ธ์ŠคํŠธ, ๋˜๋Š” ๋นˆ ํ˜ธ์ŠคํŠธ์ด๋ฉฐ, host๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

IPv4 ์ง๋ ฌํ™”๊ธฐ๋Š” IPv4 ์ฃผ์†Œ address๋ฅผ ๋ฐ›์•„ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ด ๋‹จ๊ณ„๋“ค์€ ASCII ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  1. output์„ ๋นˆ ๋ฌธ์ž์—ด๋กœ ๋‘”๋‹ค.

  2. n์„ address์˜ ๊ฐ’์œผ๋กœ ๋‘”๋‹ค.

  3. 1๋ถ€ํ„ฐ 4๊นŒ์ง€์˜ ๋ฒ”์œ„(์–‘ ๋ ํฌํ•จ)์— ์žˆ๋Š” ๊ฐ i์— ๋Œ€ํ•ด ๋ฐ˜๋ณตํ•œ๋‹ค:

    1. n % 256์„ ์ง๋ ฌํ™”ํ•œ ๊ฐ’์„ output ์•ž์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    2. i๊ฐ€ 4๊ฐ€ ์•„๋‹ˆ๋ฉด, U+002E (.)๋ฅผ output ์•ž์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    3. n์„ floor(n / 256)์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

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

IPv6 ์ง๋ ฌํ™”๊ธฐ๋Š” IPv6 ์ฃผ์†Œ address๋ฅผ ๋ฐ›์•„ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ด ๋‹จ๊ณ„๋“ค์€ ASCII ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  1. output์„ ๋นˆ ๋ฌธ์ž์—ด๋กœ ๋‘”๋‹ค.

  2. compress๋ฅผ ์ฃผ์–ด์ง„ address์— ๋Œ€ํ•ด IPv6 ์ฃผ์†Œ์˜ ์••์ถ•๋œ ์กฐ๊ฐ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๋Š” ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  3. ignore0์„ false๋กœ ๋‘”๋‹ค.

  4. address์˜ ์กฐ๊ฐ๋“ค์˜ ์ธ๋ฑ์Šค์— ์žˆ๋Š” ๊ฐ pieceIndex์— ๋Œ€ํ•ด ๋ฐ˜๋ณตํ•œ๋‹ค:

    1. ignore0์ด true์ด๊ณ  address[pieceIndex]๊ฐ€ 0์ด๋ฉด, continueํ•œ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , ignore0์ด true์ด๋ฉด, ignore0์„ false๋กœ ์„ค์ •ํ•œ๋‹ค.

    3. compress๊ฐ€ pieceIndex์ด๋ฉด:

      1. pieceIndex๊ฐ€ 0์ด๋ฉด separator๋ฅผ "::"๋กœ ๋‘๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด U+003A (:)๋กœ ๋‘”๋‹ค.

      2. separator๋ฅผ output์— ์ถ”๊ฐ€ํ•œ๋‹ค.

      3. ignore0์„ true๋กœ ์„ค์ •ํ•˜๊ณ  continueํ•œ๋‹ค.

    4. address[pieceIndex]๋ฅผ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ์งง์€ ์†Œ๋ฌธ์ž 16์ง„์ˆ˜๋กœ ํ‘œํ˜„ํ•˜์—ฌ output์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    5. pieceIndex๊ฐ€ 7์ด ์•„๋‹ˆ๋ฉด, U+003A (:)๋ฅผ output์— ์ถ”๊ฐ€ํ•œ๋‹ค.

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

์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ IPv6 ์ฃผ์†Œ ํ…์ŠคํŠธ ํ‘œํ˜„์„ ์œ„ํ•œ ๊ถŒ๊ณ ์•ˆ์˜ ๊ถŒ๊ณ ๋ฅผ ์š”๊ตฌํ•œ๋‹ค. [RFC5952]

IPv6 ์ฃผ์†Œ address๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, IPv6 ์ฃผ์†Œ ์••์ถ• ์กฐ๊ฐ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ์œผ๋ ค๋ฉด:

  1. longestIndex๋ฅผ null๋กœ ๋‘”๋‹ค.

  2. longestSize๋ฅผ 1๋กœ ๋‘”๋‹ค.

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

  4. foundSize๋ฅผ 0์œผ๋กœ ๋‘”๋‹ค.

  5. address์˜ ์กฐ๊ฐ๋“ค์˜ ์ธ๋ฑ์Šค ์ค‘ ๊ฐ pieceIndex์— ๋Œ€ํ•ด ๋ฐ˜๋ณตํ•œ๋‹ค:

    1. address์˜ ์กฐ๊ฐ[pieceIndex]๊ฐ€ 0์ด ์•„๋‹ˆ๋ฉด:

      1. foundSize๊ฐ€ longestSize๋ณด๋‹ค ํฌ๋ฉด, longestIndex๋ฅผ foundIndex๋กœ, longestSize๋ฅผ foundSize๋กœ ์„ค์ •ํ•œ๋‹ค.

      2. foundIndex๋ฅผ null๋กœ ์„ค์ •ํ•œ๋‹ค.
      3. foundSize๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
    2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด:

      1. foundIndex๊ฐ€ null์ด๋ฉด, foundIndex๋ฅผ pieceIndex๋กœ ์„ค์ •ํ•œ๋‹ค.

      2. foundSize๋ฅผ 1๋งŒํผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

  6. foundSize๊ฐ€ longestSize๋ณด๋‹ค ํฌ๋ฉด, foundIndex๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

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

0:f:0:0:f:f:0:0์—์„œ๋Š” ๋‘ ๋ฒˆ์งธ 0์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

3.7. ํ˜ธ์ŠคํŠธ ๋™๋“ฑ์„ฑ

์–ด๋–ค ํ˜ธ์ŠคํŠธ A ๊ฐ™์Œ ํ˜ธ์ŠคํŠธ B์ธ์ง€ ํŒ๋‹จํ•˜๋ ค๋ฉด, A์™€ B๊ฐ€ ๊ฐ™์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ธ์ฆ์„œ ๋น„๊ต๋Š” ๋„๋ฉ”์ธ์˜ ๋์  ์ ์„ ๋ฌด์‹œํ•˜๋Š” ํ˜ธ์ŠคํŠธ ๋™๋“ฑ์„ฑ ๋น„๊ต๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ํ˜ธ์ŠคํŠธ๋Š” DNS ๊ธธ์ด ๋“ฑ URL์—์„œ ๊ฐ•์ œํ•˜์ง€ ์•Š๋Š” ๋‹ค์–‘ํ•œ ์ธก๋ฉด๋„ ๊ฐ•์ œ๋ฉ๋‹ˆ๋‹ค. ์ด ๋‘˜์„ ๋” ๊ฐ€๊น๊ฒŒ ๋งŒ๋“ค ๋ฐฉ๋ฒ•์ด๋‚˜ ์ข‹์€ ํ†ตํ•ฉ ๋ชจ๋ธ์— ๊ด€ํ•œ ์˜๊ฒฌ์ด ์žˆ์œผ๋ฉด issue๋ฅผ ๋“ฑ๋กํ•ด์ฃผ์„ธ์š”.

4. URL

์ƒ์œ„ ์ˆ˜์ค€์—์„œ, URL, ์œ ํšจํ•œ URL ๋ฌธ์ž์—ด, URL ํŒŒ์„œ, ๊ทธ๋ฆฌ๊ณ  URL ์ง๋ ฌํ™”๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ด€๋ จ๋œ๋‹ค:

์ž…๋ ฅ ๊ธฐ์ค€ ์œ ํšจ ์—ฌ๋ถ€ ์ถœ๋ ฅ
https:example.org โŒ https://example.org/
https://////example.com/// โŒ https://example.com///
https://example.com/././foo โœ… https://example.com/foo
hello:world https://example.com/ โœ… hello:world
https:example.org https://example.com/ โŒ https://example.com/example.org
\example\..\demo/.\ https://example.com/ โŒ https://example.com/demo/
example https://example.com/demo โœ… https://example.com/example
file:///C|/demo โŒ file:///C:/demo
.. file:///C:/demo โœ… file:///C:/
file://localhost/ โœ… file:///
file://loc%61lhost/ โŒ file:///
https://user:password@example.org/ โŒ https://user:password@example.org/
https://example.org/foo bar โŒ https://example.org/foo%20bar
https://EXAMPLE.com/../x โœ… https://example.com/x
https://ex ample.org/ โŒ ์‹คํŒจ
example โŒ, ๊ธฐ์ค€์ด ์—†๊ธฐ ๋•Œ๋ฌธ ์‹คํŒจ
https://example.com:demo โŒ ์‹คํŒจ
http://[www.example.com]/ โŒ ์‹คํŒจ
https://example.org// โœ… https://example.org//
https://example.com/[]?[]#[] โŒ https://example.com/[]?[]#[]
https://example/%?%#% โŒ https://example/%?%#%
https://example/%25?%25#%25 โœ… https://example/%25?%25#%25

๊ฐ„๊ฒฐํ•จ์„ ์œ„ํ•ด ๊ธฐ์ค€ ๋ฐ ์ถœ๋ ฅ URL์€ ์ง๋ ฌํ™”๋œ ํ˜•์‹์œผ๋กœ ํ‘œ์‹œ๋œ๋‹ค.

4.1. URL ํ‘œํ˜„

ํ•˜๋‚˜์˜ URL์€ ๊ตฌ์กฐ์ฒด๋กœ์„œ ๋ฒ”์šฉ ์‹๋ณ„์ž๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋‹ค์Œ๊ณผ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์œ ํšจํ•œ URL ๋ฌธ์ž์—ด๊ณผ ๋‹ฌ๋ฆฌ ์ด๋ฅผ ๋˜ํ•œ URL ๋ ˆ์ฝ”๋“œ๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

URL์˜ ๋™๋“ฑ์„ฑ์€ URL A์™€ B๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, A๊ฐ€ B์™€ ๊ฐ™์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

URL์˜ ์Šคํ‚ด์€ ASCII ๋ฌธ์ž์—ด์ด๋ฉฐ, URL์˜ ์œ ํ˜•์„ ์‹๋ณ„ํ•˜๊ณ  ์ถ”๊ฐ€ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด URL์„ ํŒŒ์‹ฑํ•œ ํ›„ ๋””์ŠคํŒจ์น˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ดˆ๊ธฐ์—๋Š” ๋นˆ ๋ฌธ์ž์—ด์ด๋‹ค.

URL์˜ ์‚ฌ์šฉ์ž ์ด๋ฆ„์€ ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ์‹๋ณ„ํ•˜๋Š” ASCII ๋ฌธ์ž์—ด์ด๋‹ค. ์ดˆ๊ธฐ์—๋Š” ๋นˆ ๋ฌธ์ž์—ด์ด๋‹ค.

URL์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ASCII ๋ฌธ์ž์—ด์ด๋‹ค. ์ดˆ๊ธฐ์—๋Š” ๋นˆ ๋ฌธ์ž์—ด์ด๋‹ค.

URL์˜ ํ˜ธ์ŠคํŠธ๋Š” null ๋˜๋Š” ํ˜ธ์ŠคํŠธ์ด๋‹ค. ์ดˆ๊ธฐ์—๋Š” null์ด๋‹ค.

๋‹ค์Œ ํ‘œ๋Š” ํ—ˆ์šฉ๋˜๋Š” URL์˜ ์Šคํ‚ด / ํ˜ธ์ŠคํŠธ ์กฐํ•ฉ์„ ๋‚˜์—ดํ•œ๋‹ค.

์Šคํ‚ด ํ˜ธ์ŠคํŠธ
๋„๋ฉ”์ธ IPv4 ์ฃผ์†Œ IPv6 ์ฃผ์†Œ ๋ถˆํˆฌ๋ช… ํ˜ธ์ŠคํŠธ ๋นˆ ํ˜ธ์ŠคํŠธ null
ํŠน์ˆ˜ ์Šคํ‚ด ์ค‘ "file" ์ œ์™ธ โœ… โœ… โœ… โŒ โŒ โŒ
"file" โœ… โœ… โœ… โŒ โœ… โŒ
๊ธฐํƒ€ โŒ โŒ โœ… โœ… โœ… โœ…

URL์˜ ํฌํŠธ๋Š” null ๋˜๋Š” ๋„คํŠธ์›Œํฌ ํฌํŠธ๋ฅผ ์‹๋ณ„ํ•˜๋Š” 16๋น„ํŠธ ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜์ด๋‹ค. ์ด๋Š” ์ดˆ๊ธฐ์—๋Š” null์ด๋‹ค.

URL์˜ ๊ฒฝ๋กœ๋Š” URL ๊ฒฝ๋กœ์ด๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ์œ„์น˜๋ฅผ ์‹๋ณ„ํ•œ๋‹ค. ์ดˆ๊ธฐ์—๋Š” ยซ ยป์ด๋‹ค.

ํŠน์ˆ˜ URL์˜ ๊ฒฝ๋กœ๋Š” ํ•ญ์ƒ ๋ชฉ๋ก์ด๋‹ค. ์ฆ‰, ์ ˆ๋Œ€๋กœ ๋ถˆํˆฌ๋ช…ํ•˜์ง€ ์•Š๋‹ค.

URL์˜ ์ฟผ๋ฆฌ๋Š” null ๋˜๋Š” ASCII ๋ฌธ์ž์—ด์ด๋‹ค. ์ดˆ๊ธฐ์—๋Š” null์ด๋‹ค.

URL์˜ ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” null ๋˜๋Š” ํ•ด๋‹น ๋ฆฌ์†Œ์Šค์—์„œ ์ถ”๊ฐ€ ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ASCII ๋ฌธ์ž์—ด์ด๋ฉฐ, ๊ทธ ๋ฆฌ์†Œ์Šค๋Š” URL์˜ ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์‹๋ณ„ํ•œ๋‹ค. ์ดˆ๊ธฐ์—๋Š” null์ด๋‹ค.

URL์—๋Š” ๋˜ํ•œ ์—ฐ๊ด€๋œ blob URL ํ•ญ๋ชฉ์ด ์žˆ์œผ๋ฉฐ, ์ด๋Š” null ๋˜๋Š” blob URL ํ•ญ๋ชฉ์ด๋‹ค. ์ดˆ๊ธฐ์—๋Š” null์ด๋‹ค.

์ด๋Š” "blob" URL์ด ์ฐธ์กฐํ•˜๋Š” ๊ฐ์ฒด์™€ ํ•จ๊ป˜ ๊ทธ ์ถœ์ฒ˜๋ฅผ ์บ์‹œํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. URL์ด ํŒŒ์‹ฑ๊ณผ ํŽ˜์น˜ ์‚ฌ์ด์— blob URL ์ €์žฅ์†Œ์—์„œ ์ œ๊ฑฐ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ํŽ˜์น˜๋Š” ์—ฌ์ „ํžˆ ์„ฑ๊ณตํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ด๋“ค์„ ์บ์‹œํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

๋‹ค์Œ ํ‘œ๋Š” ์œ ํšจํ•œ URL ๋ฌธ์ž์—ด์ด ํŒŒ์‹ฑ๋  ๋•Œ URL์˜ ๊ตฌ์„ฑ ์š”์†Œ์— ์–ด๋–ป๊ฒŒ ๋Œ€์‘๋˜๋Š”์ง€ ๋‚˜์—ดํ•œ๋‹ค. ์‚ฌ์šฉ์ž ์ด๋ฆ„, ๋น„๋ฐ€๋ฒˆํ˜ธ, ๊ทธ๋ฆฌ๊ณ  blob URL ํ•ญ๋ชฉ์€ ์ƒ๋žต๋˜์–ด ์žˆ์œผ๋ฉฐ, ์•„๋ž˜ ์˜ˆ์—์„œ๋Š” ๊ฐ๊ฐ ๋นˆ ๋ฌธ์ž์—ด, ๋นˆ ๋ฌธ์ž์—ด, null์ด๋‹ค.

์ž…๋ ฅ ์Šคํ‚ด ํ˜ธ์ŠคํŠธ ํฌํŠธ ๊ฒฝ๋กœ ์ฟผ๋ฆฌ ํ”„๋ž˜๊ทธ๋จผํŠธ
https://example.com/ "https" "example.com" null ยซ ๋นˆ ๋ฌธ์ž์—ด ยป null null
https://localhost:8000/search?q=text#hello "https" "localhost" 8000 ยซ "search" ยป "q=text" "hello"
urn:isbn:9780307476463 "urn" null null "isbn:9780307476463" null null
file:///ada/Analytical%20Engine/README.md "file" ๋นˆ ๋ฌธ์ž์—ด null ยซ "ada", "Analytical%20Engine", "README.md" ยป null null

URL ๊ฒฝ๋กœ๋Š” URL ๊ฒฝ๋กœ ์„ธ๊ทธ๋จผํŠธ ๋˜๋Š” 0๊ฐœ ์ด์ƒ์˜ ๋ชฉ๋ก์œผ๋กœ, URL ๊ฒฝ๋กœ ์„ธ๊ทธ๋จผํŠธ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ํ›„์ž์˜ ๊ฒฝ์šฐ URL ๊ฒฝ๋กœ ์„ธ๊ทธ๋จผํŠธ์—๋Š” ์ ˆ๋Œ€๋กœ U+002F (/)๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค.

URL ๊ฒฝ๋กœ ์„ธ๊ทธ๋จผํŠธ๋Š” ASCII ๋ฌธ์ž์—ด์ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋˜๋Š” ํŒŒ์ผ์„ ๊ฐ€๋ฆฌํ‚ค์ง€๋งŒ, ๋ฏธ๋ฆฌ ์ •์˜๋œ ์˜๋ฏธ๋Š” ์—†๋‹ค.

URL ๊ฒฝ๋กœ๊ฐ€ URL ๊ฒฝ๋กœ ์„ธ๊ทธ๋จผํŠธ์ธ ๊ฒฝ์šฐ ๋ถˆํˆฌ๋ช…ํ•˜๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด U+002F (/)๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค. web+demo:a/b. URL ํŒŒ์„œ๋Š” U+002F (/)๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์ง€๋งŒ, URL ํŒจํ„ด์€ ํŒจํ„ด์„ ์ •๊ทœํ™”ํ•˜๋Š” ๋™์•ˆ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ์ด๋Š” ๋ถˆ๋ณ€ ์กฐ๊ฑด์ด ์•„๋‹ˆ๋‹ค. [URLPATTERN]

ํ•˜๋‚˜์˜ ๋‹จ์ผ ์  URL ๊ฒฝ๋กœ ์„ธ๊ทธ๋จผํŠธ๋Š” URL ๊ฒฝ๋กœ ์„ธ๊ทธ๋จผํŠธ์ด๋ฉฐ "." ๋˜๋Š” ASCII ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ "%2e"์™€ ์ผ์น˜ํ•œ๋‹ค.

ํ•˜๋‚˜์˜ ์ด์ค‘ ์  URL ๊ฒฝ๋กœ ์„ธ๊ทธ๋จผํŠธ๋Š” URL ๊ฒฝ๋กœ ์„ธ๊ทธ๋จผํŠธ์ด๋ฉฐ ".." ๋˜๋Š” ASCII ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ ".%2e", "%2e." ๋˜๋Š” "%2e%2e"์™€ ์ผ์น˜ํ•œ๋‹ค.

4.2. URL ๊ธฐํƒ€

ํŠน์ˆ˜ ์Šคํ‚ด์€ ๋‹ค์Œ ํ‘œ์˜ ์ฒซ ๋ฒˆ์งธ ์—ด์— ๋‚˜์—ด๋œ ASCII ๋ฌธ์ž์—ด์ด๋‹ค. ํŠน์ˆ˜ ์Šคํ‚ด์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ํฌํŠธ๋Š” ๊ฐ™์€ ํ–‰์˜ ๋‘ ๋ฒˆ์งธ ์—ด์— ๋‚˜์—ด๋˜์–ด ์žˆ๋‹ค. ๊ทธ ๋ฐ–์˜ ๋ชจ๋“  ASCII ๋ฌธ์ž์—ด์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ํฌํŠธ๋Š” null์ด๋‹ค.

ํŠน์ˆ˜ scheme ๊ธฐ๋ณธ ํฌํŠธ
"ftp" 21
"file" null
"http" 80
"https" 443
"ws" 80
"wss" 443

ํ•˜๋‚˜์˜ URL์€ ํŠน์ˆ˜ํ•˜๋‹ค. ๊ทธ ์Šคํ‚ด์ด ํŠน์ˆ˜ ์Šคํ‚ด์ธ ๊ฒฝ์šฐ์ด๋‹ค. ํ•˜๋‚˜์˜ URL์€ ํŠน์ˆ˜ํ•˜์ง€ ์•Š๋‹ค. ๊ทธ ์Šคํ‚ด์ด ํŠน์ˆ˜ ์Šคํ‚ด์ด ์•„๋‹Œ ๊ฒฝ์šฐ์ด๋‹ค.

ํ•˜๋‚˜์˜ URL์€ ์ž๊ฒฉ ์ฆ๋ช…์„ ํฌํ•จํ•œ๋‹ค. ๊ทธ ์‚ฌ์šฉ์ž ์ด๋ฆ„ ๋˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ๊ฒฝ์šฐ์ด๋‹ค.

ํ•˜๋‚˜์˜ URL์€ ๋ถˆํˆฌ๋ช… ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ง„๋‹ค. ๊ทธ ๊ฒฝ๋กœ๊ฐ€ URL ๊ฒฝ๋กœ ์„ธ๊ทธ๋จผํŠธ์ธ ๊ฒฝ์šฐ์ด๋‹ค.

ํ•˜๋‚˜์˜ URL์€ ์‚ฌ์šฉ์ž ์ด๋ฆ„/๋น„๋ฐ€๋ฒˆํ˜ธ/ํฌํŠธ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค. ๊ทธ ํ˜ธ์ŠคํŠธ๊ฐ€ null ๋˜๋Š” ๋นˆ ๋ฌธ์ž์—ด์ด๊ฑฐ๋‚˜, ๊ทธ ์Šคํ‚ด์ด "file"์ธ ๊ฒฝ์šฐ์ด๋‹ค.

ํ•˜๋‚˜์˜ URL์€ ๊ธฐ์ค€ URL๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ์ค€ URL์€ ์ž…๋ ฅ์ด URL ํŒŒ์„œ์— ์œ ์šฉํ•˜๋‹ค. ์ƒ๋Œ€ URL ๋ฌธ์ž์—ด์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.


Windows ๋“œ๋ผ์ด๋ธŒ ๋ฌธ์ž๋Š” ๋‘ ๊ฐœ์˜ ์ฝ”๋“œ ํฌ์ธํŠธ๋กœ, ์ฒซ ๋ฒˆ์งธ๋Š” ASCII ์•ŒํŒŒ๋ฒณ์ด๊ณ  ๋‘ ๋ฒˆ์งธ๋Š” U+003A(:) ๋˜๋Š” U+007C(|)์ž…๋‹ˆ๋‹ค.

์ •๊ทœํ™”๋œ Windows ๋“œ๋ผ์ด๋ธŒ ๋ฌธ์ž๋Š” ๋‘ ๋ฒˆ์งธ ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ U+003A(:)์ธ Windows ๋“œ๋ผ์ด๋ธŒ ๋ฌธ์ž์ž…๋‹ˆ๋‹ค.

URL ์ž‘์„ฑ ์„น์…˜์— ๋”ฐ๋ผ, ์˜ค์ง ์ •๊ทœํ™”๋œ Windows ๋“œ๋ผ์ด๋ธŒ ๋ฌธ์ž๋งŒ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ž์—ด์ด Windows ๋“œ๋ผ์ด๋ธŒ ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ๋‹ค์Œ ์กฐ๊ฑด์„ ๋ชจ๋‘ ๋งŒ์กฑํ•  ๋•Œ์ž…๋‹ˆ๋‹ค:

๋ฌธ์ž์—ด Windows ๋“œ๋ผ์ด๋ธŒ ๋ฌธ์ž๋กœ ์‹œ์ž‘
"c:" โœ…
"c:/" โœ…
"c:a" โŒ

url์˜ ๊ฒฝ๋กœ๋ฅผ ๋‹จ์ถ•ํ•˜๊ธฐ ์ ˆ์ฐจ:

  1. ๋‹จ์–ธ: url์€ ๋ถˆํˆฌ๋ช… ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š”๋‹ค.

  2. path๋ฅผ url์˜ ๊ฒฝ๋กœ๋กœ ๋‘”๋‹ค.

  3. url์˜ scheme์ด "file"์ด๊ณ  path์˜ ํฌ๊ธฐ๊ฐ€ 1์ด๋ฉฐ, path[0]์ด ์ •๊ทœํ™”๋œ Windows ๋“œ๋ผ์ด๋ธŒ ๋ฌธ์ž์ด๋ฉด ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  4. ์ œ๊ฑฐ path์˜ ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ(์žˆ๋‹ค๋ฉด).

4.3. URL ์ž‘์„ฑ

์œ ํšจํ•œ URL ๋ฌธ์ž์—ด์€ relative-URL-with-fragment ๋ฌธ์ž์—ด ๋˜๋Š” absolute-URL-with-fragment ๋ฌธ์ž์—ด์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

absolute-URL-with-fragment ๋ฌธ์ž์—ด์€ absolute-URL ๋ฌธ์ž์—ด์ด๋ฉฐ, ์„ ํƒ์ ์œผ๋กœ U+0023(#)์™€ URL-fragment ๋ฌธ์ž์—ด์ด ๋’ค๋”ฐ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

absolute-URL ๋ฌธ์ž์—ด์€ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค:

์–ด๋А ๊ฒƒ์ด๋“  ์„ ํƒ์ ์œผ๋กœ ๊ทธ ๋’ค์— U+003F (?)์™€ URL-์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์ด ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

URL-์Šคํ‚ด ๋ฌธ์ž์—ด์€ ํ•˜๋‚˜์˜ ASCII ์•ŒํŒŒ๋ฒณ์ด์–ด์•ผ ํ•˜๋ฉฐ, ๊ทธ ๋’ค์— 0๊ฐœ ์ด์ƒ์˜ ASCII ์˜์ˆซ์ž, U+002B (+), U+002D (-), ๋ฐ U+002E (.)๊ฐ€ ์ด์–ด์ ธ์•ผ ํ•œ๋‹ค. ์Šคํ‚ด์€ IANA URI [sic] Schemes ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋“ฑ๋ก๋˜์–ด์•ผ ํ•œ๋‹ค. [IANA-URI-SCHEMES] [RFC7595]

ํ”„๋ž˜๊ทธ๋จผํŠธ ํฌํ•จ ์ƒ๋Œ€-URL ๋ฌธ์ž์—ด์€ ๊ธฐ์ค€ URL์ด ๋ถˆํˆฌ๋ช… ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ, U+0023 (#) ๋’ค์— URL-ํ”„๋ž˜๊ทธ๋จผํŠธ ๋ฌธ์ž์—ด์ด ์ด์–ด์ง€๋Š” ๊ฒƒ์ด์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ์ƒ๋Œ€-URL ๋ฌธ์ž์—ด์ด์–ด์•ผ ํ•˜๋ฉฐ, ์„ ํƒ์ ์œผ๋กœ ๊ทธ ๋’ค์— U+0023 (#)์™€ URL-ํ”„๋ž˜๊ทธ๋จผํŠธ ๋ฌธ์ž์—ด์ด ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

์ƒ๋Œ€-URL ๋ฌธ์ž์—ด์€ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค:

์–ด๋А ๊ฒƒ์ด๋“  ์„ ํƒ์ ์œผ๋กœ ๊ทธ ๋’ค์— U+003F (?)์™€ URL-์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์ด ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ์ค€ URL์ด null์ด ์•„๋‹ˆ์–ด์•ผ ํŒŒ์‹ฑํ•  ๋•Œ ํ”„๋ž˜๊ทธ๋จผํŠธ ํฌํ•จ ์ƒ๋Œ€-URL ๋ฌธ์ž์—ด์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์Šคํ‚ด-์ƒ๋Œ€-ํŠน์ˆ˜-URL ๋ฌธ์ž์—ด์€ "//"์ด์–ด์•ผ ํ•˜๋ฉฐ, ๊ทธ ๋’ค์— ์œ ํšจํ•œ ํ˜ธ์ŠคํŠธ ๋ฌธ์ž์—ด์ด ์ด์–ด์ง€๊ณ , ์„ ํƒ์ ์œผ๋กœ ๊ทธ ๋’ค์— U+003A (:)์™€ URL-ํฌํŠธ ๋ฌธ์ž์—ด์ด ์ด์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์„ ํƒ์ ์œผ๋กœ ๊ทธ ๋’ค์— ๊ฒฝ๋กœ-์ ˆ๋Œ€-URL ๋ฌธ์ž์—ด์ด ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

URL-ํฌํŠธ ๋ฌธ์ž์—ด์€ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค:

์Šคํ‚ด-์ƒ๋Œ€-URL ๋ฌธ์ž์—ด์€ "//"์ด์–ด์•ผ ํ•˜๋ฉฐ, ๊ทธ ๋’ค์— ๋ถˆํˆฌ๋ช…-ํ˜ธ์ŠคํŠธ-๋ฐ-ํฌํŠธ ๋ฌธ์ž์—ด์ด ์ด์–ด์ง€๊ณ , ์„ ํƒ์ ์œผ๋กœ ๊ทธ ๋’ค์— ๊ฒฝ๋กœ-์ ˆ๋Œ€-URL ๋ฌธ์ž์—ด์ด ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

๋ถˆํˆฌ๋ช…-ํ˜ธ์ŠคํŠธ-๋ฐ-ํฌํŠธ ๋ฌธ์ž์—ด์€ ๋นˆ ๋ฌธ์ž์—ด์ด๊ฑฐ๋‚˜ ๋‹ค์Œ์ด์–ด์•ผ ํ•œ๋‹ค: ์œ ํšจํ•œ ๋ถˆํˆฌ๋ช… ํ˜ธ์ŠคํŠธ ๋ฌธ์ž์—ด, ์„ ํƒ์ ์œผ๋กœ ๊ทธ ๋’ค์— U+003A (:)์™€ URL-ํฌํŠธ ๋ฌธ์ž์—ด์ด ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

์Šคํ‚ด-์ƒ๋Œ€-file-URL ๋ฌธ์ž์—ด์€ "//"์ด์–ด์•ผ ํ•˜๋ฉฐ, ์„ ํƒ์ ์œผ๋กœ ๊ทธ ๋’ค์— ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค:

๊ฒฝ๋กœ-์ ˆ๋Œ€-URL ๋ฌธ์ž์—ด์€ U+002F (/)์ด์–ด์•ผ ํ•˜๋ฉฐ, ๊ทธ ๋’ค์— 0๊ฐœ ์ด์ƒ์˜ URL-๊ฒฝ๋กœ-์„ธ๊ทธ๋จผํŠธ ๋ฌธ์ž์—ด์ด ์ด์–ด์ง€๊ณ , ๊ฐ ํ•ญ๋ชฉ์€ ์„œ๋กœ U+002F (/)๋กœ ๊ตฌ๋ถ„๋˜์–ด์•ผ ํ•œ๋‹ค.

๊ฒฝ๋กœ-์ ˆ๋Œ€-๋น„-๊ถŒํ•œ-URL ๋ฌธ์ž์—ด์€ ๊ฒฝ๋กœ-์ ˆ๋Œ€-URL ๋ฌธ์ž์—ด์ด์–ด์•ผ ํ•˜๋ฉฐ, ๋‘ ๊ฐœ์˜ U+002F (/) ์ฝ”๋“œ ํฌ์ธํŠธ๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.

๊ฒฝ๋กœ-์ƒ๋Œ€-URL ๋ฌธ์ž์—ด์€ 0๊ฐœ ์ด์ƒ์˜ URL-๊ฒฝ๋กœ-์„ธ๊ทธ๋จผํŠธ ๋ฌธ์ž์—ด์ด์–ด์•ผ ํ•˜๋ฉฐ, ๊ฐ ํ•ญ๋ชฉ์€ ์„œ๋กœ U+002F (/)๋กœ ๊ตฌ๋ถ„๋˜๊ณ , U+002F (/)๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.

A ๊ฒฝ๋กœ-์ƒ๋Œ€-์Šคํ‚ด-์—†์Œ-URL ๋ฌธ์ž์—ด์€ ๊ฒฝ๋กœ-์ƒ๋Œ€-URL ๋ฌธ์ž์—ด์ด์–ด์•ผ ํ•˜๋ฉฐ, ๋‹ค์Œ์œผ๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค: URL-์Šคํ‚ด ๋ฌธ์ž์—ด, ๊ทธ ๋’ค์— U+003A (:)๊ฐ€ ์ด์–ด์ง€๋Š” ๊ฒƒ.

๋ถˆํˆฌ๋ช…-๊ฒฝ๋กœ-URL ๋ฌธ์ž์—ด์€ U+003F (?)๋ฅผ ์ œ์™ธํ•œ 0๊ฐœ ์ด์ƒ์˜ URL ๋‹จ์œ„์ด์–ด์•ผ ํ•˜๋ฉฐ, ๊ทธ ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์ด ์žˆ๋‹ค๋ฉด U+002F (/)๊ฐ€ ์•„๋‹ˆ์–ด์•ผ ํ•œ๋‹ค.

URL-๊ฒฝ๋กœ-์„ธ๊ทธ๋จผํŠธ ๋ฌธ์ž์—ด์€ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค:

URL-์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์€ 0๊ฐœ ์ด์ƒ์˜ URL ๋‹จ์œ„์ด์–ด์•ผ ํ•œ๋‹ค.

URL-ํ”„๋ž˜๊ทธ๋จผํŠธ ๋ฌธ์ž์—ด์€ 0๊ฐœ ์ด์ƒ์˜ URL ๋‹จ์œ„์ด์–ด์•ผ ํ•œ๋‹ค.

URL ์ฝ”๋“œ ํฌ์ธํŠธ๋Š” ASCII ์˜์ˆซ์ž, U+0021 (!), U+0024 ($), U+0026 (&), U+0027 ('), U+0028 LEFT PARENTHESIS, U+0029 RIGHT PARENTHESIS, U+002A (*), U+002B (+), U+002C (,), U+002D (-), U+002E (.), U+002F (/), U+003A (:), U+003B (;), U+003D (=), U+003F (?), U+0040 (@), U+005F (_), U+007E (~), ๊ทธ๋ฆฌ๊ณ  U+00A0๋ถ€ํ„ฐ U+10FFFD๊นŒ์ง€์˜ ๋ฒ”์œ„์— ์žˆ๋Š” ์ฝ”๋“œ ํฌ์ธํŠธ์ด๋ฉฐ, ์–‘ ๋์„ ํฌํ•จํ•˜๊ณ  ์„œ๋Ÿฌ๊ฒŒ์ดํŠธ์™€ ๋น„๋ฌธ์ž๋Š” ์ œ์™ธํ•œ๋‹ค.

U+007F DELETE๋ณด๋‹ค ํฐ ์ฝ”๋“œ ํฌ์ธํŠธ๋Š” URL ํŒŒ์„œ์— ์˜ํ•ด ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ๋œ ๋ฐ”์ดํŠธ๋กœ ๋ณ€ํ™˜๋œ๋‹ค.

HTML์—์„œ ๋ฌธ์„œ ์ธ์ฝ”๋”ฉ์ด ๋ ˆ๊ฑฐ์‹œ ์ธ์ฝ”๋”ฉ์ธ ๊ฒฝ์šฐ, URL-query ๋ฌธ์ž์—ด ์•ˆ์˜ U+007F DELETE๋ณด๋‹ค ๋†’์€ ์ฝ”๋“œ ํฌ์ธํŠธ๋Š” ๋ฌธ์„œ์˜ ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ๋œ ๋ฐ”์ดํŠธ๋กœ ๋ณ€ํ™˜๋œ๋‹ค. ์ด๋Š” ํ•œ ๋ฌธ์„œ์—์„œ๋Š” ๋™์ž‘ํ•˜๋Š” URL์„ ๋‹ค๋ฅธ ๋ฌธ์„œ ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๋ฌธ์„œ์— ๋ณต์‚ฌํ•  ๋•Œ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ๋ชจ๋“  ๊ณณ์—์„œ UTF-8 ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ HTML ๋ฌธ์„œ๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์ž.

<!doctype html>
<meta charset="windows-1252">
<a href="?sm&ouml;rg&aring;sbord">ํ…Œ์ŠคํŠธ</a>

๋ฌธ์„œ ์ธ์ฝ”๋”ฉ์ด windows-1252์ด๋ฏ€๋กœ, ๋งํฌ์˜ URL์˜ ์ฟผ๋ฆฌ๋Š” "sm%F6rg%E5sbord"๊ฐ€ ๋œ๋‹ค. ๋ฌธ์„œ ์ธ์ฝ”๋”ฉ์ด UTF-8์ด์—ˆ๋‹ค๋ฉด, ๋Œ€์‹  "sm%C3%B6rg%C3%A5sbord"๊ฐ€ ๋œ๋‹ค.

URL ๋‹จ์œ„๋Š” URL ์ฝ”๋“œ ํฌ์ธํŠธ์™€ ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ๋œ ๋ฐ”์ดํŠธ์ด๋‹ค.

ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ๋œ ๋ฐ”์ดํŠธ๋Š” URL ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ ์•„๋‹ˆ๊ฑฐ๋‚˜ ๊ธฐ๋ก ๋Œ€์ƒ์—์„œ ์ œ์™ธ๋œ ์ฝ”๋“œ ํฌ์ธํŠธ๋ฅผ ์ธ์ฝ”๋”ฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


์‚ฌ์šฉ์ž ์ด๋ฆ„ ๋˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ URL ๋ ˆ์ฝ”๋“œ์˜ ์œ ํšจํ•œ URL ๋ฌธ์ž์—ด ๋‚ด์—์„œ ํ‘œํ˜„ํ•  ๋ฐฉ๋ฒ•์€ ์—†๋‹ค.

4.4. URL ํŒŒ์‹ฑ

URL ํŒŒ์„œ๋Š” ํ•˜๋‚˜์˜ ์Šค์นผ๋ผ ๊ฐ’ ๋ฌธ์ž์—ด input์„ ์ทจํ•˜๋ฉฐ, ์„ ํƒ์ ์œผ๋กœ null ๋˜๋Š” ๊ธฐ์ค€ URL base(๊ธฐ๋ณธ๊ฐ’ null)์™€ ์„ ํƒ์ ์ธ ์ธ์ฝ”๋”ฉ encoding(๊ธฐ๋ณธ๊ฐ’ UTF-8)์„ ์‚ฌ์šฉํ•˜๊ณ , ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์•„๋‹Œ ๊ตฌํ˜„์€ ๊ธฐ๋ณธ URL ํŒŒ์„œ๋งŒ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.

์›น ๋ธŒ๋ผ์šฐ์ €์˜ ์ฃผ์†Œ ํ‘œ์‹œ์ค„์— ์žˆ๋Š” ์‚ฌ์šฉ์ž ์ž…๋ ฅ์ด URL ๋ ˆ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋˜๋Š” ๋ฐฉ์‹์€ ์ด ํ‘œ์ค€์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ๋‹ค. ์ด ํ‘œ์ค€์—๋Š” ์‹ ๋ขฐ ๊ฒฐ์ •๊ณผ ๊ด€๋ จ๋œ URL ๋ Œ๋”๋ง ์š”๊ตฌ ์‚ฌํ•ญ๋„ ํฌํ•จ๋œ๋‹ค.

  1. url์„ input์— ๋Œ€ํ•ด ๊ธฐ๋ณธ URL ํŒŒ์„œ๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•˜๋˜, base์™€ encoding์„ ์‚ฌ์šฉํ•œ๋‹ค.

  2. url์ด ์‹คํŒจ์ด๋ฉด, ์‹คํŒจ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. url์˜ ์Šคํ‚ด์ด "blob"์ด ์•„๋‹ˆ๋ฉด, url์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  4. url์˜ blob URL ํ•ญ๋ชฉ์„ blob URL์„ ํ•ด์„ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•˜๋˜, url์— ๋Œ€ํ•ด ๊ทธ ๊ณผ์ •์ด ์‹คํŒจ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด null๋กœ ์„ค์ •ํ•œ๋‹ค.

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


๊ธฐ๋ณธ URL ํŒŒ์„œ๋Š” ์Šค์นผ๋ผ ๊ฐ’ ๋ฌธ์ž์—ด input์„ ์ทจํ•˜๋ฉฐ, ์„ ํƒ์ ์œผ๋กœ null ๋˜๋Š” ๊ธฐ์ค€ URL base(๊ธฐ๋ณธ๊ฐ’ null), ์„ ํƒ์ ์ธ ์ธ์ฝ”๋”ฉ encoding(๊ธฐ๋ณธ๊ฐ’ UTF-8), ์„ ํƒ์ ์ธ URL url, ๊ทธ๋ฆฌ๊ณ  ์„ ํƒ์ ์ธ ์ƒํƒœ ์žฌ์ •์˜ state override๋ฅผ ์ทจํ•˜๊ณ , ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

encoding ์ธ์ˆ˜๋Š” HTML์—๋งŒ ๊ด€๋ จ๋œ ๋ ˆ๊ฑฐ์‹œ ๊ฐœ๋…์ด๋‹ค. url๊ณผ state override ์ธ์ˆ˜๋Š” ๋‹ค์–‘ํ•œ API์—์„œ๋งŒ ์‚ฌ์šฉ๋œ๋‹ค. [HTML]

url๊ณผ state override ์ธ์ˆ˜๊ฐ€ ์ „๋‹ฌ๋˜์ง€ ์•Š์œผ๋ฉด, ๊ธฐ๋ณธ URL ํŒŒ์„œ๋Š” ์ƒˆ URL ๋˜๋Š” ์‹คํŒจ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋“ค์ด ์ „๋‹ฌ๋˜๋ฉด, ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ „๋‹ฌ๋œ url์„ ์ˆ˜์ •ํ•˜๋ฉฐ ์•„๋ฌด๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. url์ด ์ฃผ์–ด์ง€์ง€ ์•Š์•˜๋‹ค๋ฉด:

    1. url์„ ์ƒˆ URL๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. input์— ์„ ํ–‰ ๋˜๋Š” ํ›„ํ–‰ C0 ์ œ์–ด ๋ฌธ์ž ๋˜๋Š” ๊ณต๋ฐฑ์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด, invalid-URL-unit ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์˜ค๋ฅ˜์ด๋‹ค.

    3. input์—์„œ ๋ชจ๋“  ์„ ํ–‰ ๋ฐ ํ›„ํ–‰ C0 ์ œ์–ด ๋ฌธ์ž ๋˜๋Š” ๊ณต๋ฐฑ์„ ์ œ๊ฑฐํ•œ๋‹ค.

  2. input์ด ASCII ํƒญ ๋˜๋Š” ์ค„๋ฐ”๊ฟˆ์„ ํฌํ•จํ•˜๋ฉด, invalid-URL-unit ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์˜ค๋ฅ˜.

  3. input์—์„œ ๋ชจ๋“  ASCII ํƒญ ๋˜๋Š” ์ค„๋ฐ”๊ฟˆ์„ ์ œ๊ฑฐํ•œ๋‹ค.

  4. state๋ฅผ, state override๊ฐ€ ์ฃผ์–ด์กŒ๋‹ค๋ฉด ๊ทธ๊ฒƒ์œผ๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด scheme start state๋กœ ๋‘”๋‹ค.

  5. encoding์„ encoding์—์„œ ์ถœ๋ ฅ ์ธ์ฝ”๋”ฉ์„ ์–ป์€ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  6. buffer๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ๋‘”๋‹ค.

  7. atSignSeen, insideBrackets, ๋ฐ passwordTokenSeen์„ false๋กœ ๋‘”๋‹ค.

  8. pointer๋ฅผ input์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋กœ ๋‘”๋‹ค.

  9. state์— ๋”ฐ๋ผ ๋ถ„๊ธฐํ•˜์—ฌ ๋‹ค์Œ ์ƒํƒœ ๊ธฐ๊ณ„๋ฅผ ๊ณ„์† ์‹คํ–‰ํ•œ๋‹ค. ์‹คํ–‰ ํ›„ pointer๊ฐ€ EOF ์ฝ”๋“œ ํฌ์ธํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋ฉด, ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๊ฐ„๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด pointer๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚ค๊ณ  ์ƒํƒœ ๊ธฐ๊ณ„๋ฅผ ๊ณ„์†ํ•œ๋‹ค.

    scheme start state
    1. c๊ฐ€ ASCII ์•ŒํŒŒ๋ฒณ์ด๋ฉด, c๋ฅผ ์†Œ๋ฌธ์žํ™”ํ•˜์—ฌ buffer์— ์ถ”๊ฐ€ํ•˜๊ณ , state๋ฅผ scheme state๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , state override๊ฐ€ ์ฃผ์–ด์ง€์ง€ ์•Š์•˜๋‹ค๋ฉด, state๋ฅผ no scheme state๋กœ ์„ค์ •ํ•˜๊ณ  pointer๋ฅผ 1 ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

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

      ์ด failure ํ‘œ์‹œ๋Š” Location ๊ฐ์ฒด์˜ protocol ์„ค์ •์ž์—์„œ๋งŒ ์‚ฌ์šฉ๋œ๋‹ค.

    scheme state
    1. c๊ฐ€ ASCII ์˜์ˆซ์ž, U+002B (+), U+002D (-), ๋˜๋Š” U+002E (.)์ด๋ฉด, c๋ฅผ ์†Œ๋ฌธ์žํ™”ํ•˜์—ฌ buffer์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , c๊ฐ€ U+003A (:)์ด๋ฉด:

      1. state override๊ฐ€ ์ฃผ์–ด์กŒ๋‹ค๋ฉด:

        1. url์˜ ์Šคํ‚ด์ด ํŠน์ˆ˜ ์Šคํ‚ด์ด๊ณ  buffer๊ฐ€ ํŠน์ˆ˜ ์Šคํ‚ด์ด ์•„๋‹ˆ๋ฉด, returnํ•œ๋‹ค.

        2. url์˜ ์Šคํ‚ด์ด ํŠน์ˆ˜ ์Šคํ‚ด์ด ์•„๋‹ˆ๊ณ  buffer๊ฐ€ ํŠน์ˆ˜ ์Šคํ‚ด์ด๋ฉด, returnํ•œ๋‹ค.

        3. url์ด ์ž๊ฒฉ ์ฆ๋ช…์„ ํฌํ•จํ•˜๊ฑฐ๋‚˜ null์ด ์•„๋‹Œ ํฌํŠธ๋ฅผ ๊ฐ€์ง€๋ฉฐ, buffer๊ฐ€ "file"์ด๋ฉด, returnํ•œ๋‹ค.

        4. url์˜ ์Šคํ‚ด์ด "file"์ด๊ณ  ๊ทธ ํ˜ธ์ŠคํŠธ๊ฐ€ ๋นˆ ํ˜ธ์ŠคํŠธ์ด๋ฉด, returnํ•œ๋‹ค.

      2. url์˜ ์Šคํ‚ด์„ buffer๋กœ ์„ค์ •ํ•œ๋‹ค.

      3. state override๊ฐ€ ์ฃผ์–ด์กŒ๋‹ค๋ฉด:

        1. url์˜ ํฌํŠธ๊ฐ€ url์˜ ์Šคํ‚ด์˜ ๊ธฐ๋ณธ ํฌํŠธ์ด๋ฉด, url์˜ ํฌํŠธ๋ฅผ null๋กœ ์„ค์ •ํ•œ๋‹ค.

        2. Returnํ•œ๋‹ค.

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

      5. url์˜ ์Šคํ‚ด์ด "file"์ด๋ฉด:

        1. remaining์ด "//"๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š์œผ๋ฉด, special-scheme-missing-following-solidus ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์˜ค๋ฅ˜.

        2. state๋ฅผ file state๋กœ ์„ค์ •ํ•œ๋‹ค.

      6. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , url์ด ํŠน์ˆ˜์ด๊ณ , base๊ฐ€ null์ด ์•„๋‹ˆ๋ฉฐ, base์˜ ์Šคํ‚ด์ด url์˜ ์Šคํ‚ด์ด๋ฉด:

        1. Assert: base๋Š” ํŠน์ˆ˜์ด๋‹ค(๋”ฐ๋ผ์„œ ๋ถˆํˆฌ๋ช… ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š”๋‹ค).

        2. state๋ฅผ special relative or authority state๋กœ ์„ค์ •ํ•œ๋‹ค.

      7. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , url์ด ํŠน์ˆ˜์ด๋ฉด, state๋ฅผ special authority slashes state๋กœ ์„ค์ •ํ•œ๋‹ค.

      8. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , remaining์ด U+002F (/)๋กœ ์‹œ์ž‘ํ•˜๋ฉด, state๋ฅผ path or authority state๋กœ ์„ค์ •ํ•˜๊ณ  pointer๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

      9. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, url์˜ ๊ฒฝ๋กœ๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•˜๊ณ  state๋ฅผ opaque path state๋กœ ์„ค์ •ํ•œ๋‹ค.

    3. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , state override๊ฐ€ ์ฃผ์–ด์ง€์ง€ ์•Š์•˜๋‹ค๋ฉด, buffer๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•˜๊ณ , state๋ฅผ no scheme state๋กœ ์„ค์ •ํ•œ ๋’ค, (input์˜ ์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ ํฌ์ธํŠธ๋ถ€ํ„ฐ) ๋‹ค์‹œ ์‹œ์ž‘ํ•œ๋‹ค.

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

      ์ด failure ํ‘œ์‹œ๋Š” Location ๊ฐ์ฒด์˜ protocol ์„ค์ •์ž์—์„œ๋งŒ ์‚ฌ์šฉ๋œ๋‹ค. ๋˜ํ•œ, ์ด ์ƒํƒœ์—์„œ ์•ž์„œ ๋ฐœ์ƒํ•˜๋Š” failure๊ฐ€ ์•„๋‹Œ ์ข…๋ฃŒ๋Š” ํ•ด๋‹น ์„ค์ •์ž๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•œ ์˜๋„์ ์ธ ์ฐจ์ด์ด๋‹ค.

    no scheme state
    1. base๊ฐ€ null์ด๊ฑฐ๋‚˜, base๊ฐ€ ๋ถˆํˆฌ๋ช… ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ง€๊ณ  c๊ฐ€ U+0023 (#)์ด ์•„๋‹ˆ๋ฉด, missing-scheme-non-relative-URL ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์˜ค๋ฅ˜, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , base๊ฐ€ ๋ถˆํˆฌ๋ช… ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ง€๋ฉฐ c๊ฐ€ U+0023 (#)์ด๋ฉด, url์˜ ์Šคํ‚ด์„ base์˜ ์Šคํ‚ด์œผ๋กœ, url์˜ ๊ฒฝ๋กœ๋ฅผ base์˜ ๊ฒฝ๋กœ๋กœ, url์˜ ์ฟผ๋ฆฌ๋ฅผ base์˜ ์ฟผ๋ฆฌ๋กœ, url์˜ ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•˜๊ณ , state๋ฅผ fragment state๋กœ ์„ค์ •ํ•œ๋‹ค.

    3. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , base์˜ ์Šคํ‚ด์ด "file"์ด ์•„๋‹ˆ๋ฉด, state๋ฅผ relative state๋กœ ์„ค์ •ํ•˜๊ณ  pointer๋ฅผ 1 ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

    4. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, state๋ฅผ file state๋กœ ์„ค์ •ํ•˜๊ณ  pointer๋ฅผ 1 ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

    special relative or authority state
    1. c๊ฐ€ U+002F (/)์ด๊ณ  remaining์ด U+002F (/)๋กœ ์‹œ์ž‘ํ•˜๋ฉด, state๋ฅผ special authority ignore slashes state๋กœ ์„ค์ •ํ•˜๊ณ  pointer๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, special-scheme-missing-following-solidus ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์˜ค๋ฅ˜, state๋ฅผ relative state๋กœ ์„ค์ •ํ•˜๊ณ  pointer๋ฅผ 1 ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

    path or authority state
    1. c๊ฐ€ U+002F (/)์ด๋ฉด, state๋ฅผ authority state๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, state๋ฅผ path state๋กœ ์„ค์ •ํ•˜๊ณ , pointer๋ฅผ 1 ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

    relative state
    1. Assert: base์˜ ์Šคํ‚ด์€ "file"์ด ์•„๋‹ˆ๋‹ค.

    2. url์˜ ์Šคํ‚ด์„ base์˜ ์Šคํ‚ด์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

    3. c๊ฐ€ U+002F (/)์ด๋ฉด, state๋ฅผ relative slash state๋กœ ์„ค์ •ํ•œ๋‹ค.

    4. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , url์ด ํŠน์ˆ˜์ด๊ณ  c๊ฐ€ U+005C (\)์ด๋ฉด, invalid-reverse-solidus ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์˜ค๋ฅ˜, state๋ฅผ relative slash state๋กœ ์„ค์ •ํ•œ๋‹ค.

    5. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด:

      1. url์˜ ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ base์˜ ์‚ฌ์šฉ์ž ์ด๋ฆ„์œผ๋กœ, url์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ base์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ, url์˜ ํ˜ธ์ŠคํŠธ๋ฅผ base์˜ ํ˜ธ์ŠคํŠธ๋กœ, url์˜ ํฌํŠธ๋ฅผ base์˜ ํฌํŠธ๋กœ, url์˜ ๊ฒฝ๋กœ๋ฅผ base์˜ ๊ฒฝ๋กœ์˜ ๋ณต์ œ๋ณธ์œผ๋กœ, ๊ทธ๋ฆฌ๊ณ  url์˜ ์ฟผ๋ฆฌ๋ฅผ base์˜ ์ฟผ๋ฆฌ๋กœ ์„ค์ •ํ•œ๋‹ค.

      2. c๊ฐ€ U+003F (?)์ด๋ฉด, url์˜ ์ฟผ๋ฆฌ๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•˜๊ณ , state๋ฅผ query state๋กœ ์„ค์ •ํ•œ๋‹ค.

      3. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , c๊ฐ€ U+0023 (#)์ด๋ฉด, url์˜ ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•˜๊ณ  state๋ฅผ fragment state๋กœ ์„ค์ •ํ•œ๋‹ค.

      4. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , c๊ฐ€ EOF ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ ์•„๋‹ˆ๋ฉด:

        1. url์˜ ์ฟผ๋ฆฌ๋ฅผ null๋กœ ์„ค์ •ํ•œ๋‹ค.

        2. url์˜ ๊ฒฝ๋กœ๋ฅผ ์ค„์ธ๋‹ค.

        3. state๋ฅผ path state๋กœ ์„ค์ •ํ•˜๊ณ  pointer๋ฅผ 1 ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

    relative slash state
    1. url์ด ํŠน์ˆ˜์ด๊ณ  c๊ฐ€ U+002F (/) ๋˜๋Š” U+005C (\)์ด๋ฉด:

      1. c๊ฐ€ U+005C (\)์ด๋ฉด, invalid-reverse-solidus ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์˜ค๋ฅ˜.

      2. state๋ฅผ special authority ignore slashes state๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , c๊ฐ€ U+002F (/)์ด๋ฉด, state๋ฅผ authority state๋กœ ์„ค์ •ํ•œ๋‹ค.

    3. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, url์˜ ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ base์˜ ์‚ฌ์šฉ์ž ์ด๋ฆ„์œผ๋กœ, url์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ base์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ, url์˜ ํ˜ธ์ŠคํŠธ๋ฅผ base์˜ ํ˜ธ์ŠคํŠธ๋กœ, url์˜ ํฌํŠธ๋ฅผ base์˜ ํฌํŠธ๋กœ, state๋ฅผ path state๋กœ ์„ค์ •ํ•œ ๋‹ค์Œ, pointer๋ฅผ 1 ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

    special authority slashes state
    1. c๊ฐ€ U+002F (/)์ด๊ณ  remaining์ด U+002F (/)๋กœ ์‹œ์ž‘ํ•˜๋ฉด, state๋ฅผ special authority ignore slashes state๋กœ ์„ค์ •ํ•˜๊ณ  pointer๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, special-scheme-missing-following-solidus ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์˜ค๋ฅ˜, state๋ฅผ special authority ignore slashes state๋กœ ์„ค์ •ํ•˜๊ณ  pointer๋ฅผ 1 ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

    ํŠน์ˆ˜ ๊ถŒํ•œ ์Šฌ๋ž˜์‹œ ๋ฌด์‹œ ์ƒํƒœ
    1. c๊ฐ€ U+002F (/) ๋˜๋Š” U+005C (\)๊ฐ€ ์•„๋‹ˆ๋ฉด, state๋ฅผ ๊ถŒํ•œ ์ƒํƒœ๋กœ ์„ค์ •ํ•˜๊ณ  pointer๋ฅผ 1๋งŒํผ ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, special-scheme-missing-following-solidus ๊ฒ€์ฆ ์˜ค๋ฅ˜.

    ๊ถŒํ•œ ์ƒํƒœ
    1. c๊ฐ€ U+0040 (@)์ด๋ฉด:

      1. Invalid-credentials ๊ฒ€์ฆ ์˜ค๋ฅ˜.

      2. atSignSeen์ด true์ด๋ฉด, "%40"์„ buffer ์•ž์— ์ถ”๊ฐ€ํ•œ๋‹ค.

      3. atSignSeen์„ true๋กœ ์„ค์ •ํ•œ๋‹ค.

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

        1. codePoint๊ฐ€ U+003A (:)์ด๊ณ  passwordTokenSeen์ด false์ด๋ฉด, passwordTokenSeen์„ true๋กœ ์„ค์ •ํ•˜๊ณ  continueํ•œ๋‹ค.

        2. encodedCodePoints๋ฅผ UTF-8 ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ์„ codePoint์— userinfo ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ ์ง‘ํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

        3. passwordTokenSeen์ด true์ด๋ฉด, encodedCodePoints๋ฅผ url์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

        4. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, encodedCodePoints๋ฅผ url์˜ ์‚ฌ์šฉ์ž ์ด๋ฆ„์— ์ถ”๊ฐ€ํ•œ๋‹ค.

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

    2. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๊ฐ€ true์ด๋ฉด:

      ๊ทธ๋Ÿฌ๋ฉด:

      1. atSignSeen์ด true์ด๊ณ  buffer๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด, host-missing ๊ฒ€์ฆ ์˜ค๋ฅ˜, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      2. pointer๋ฅผ buffer์˜ ์ฝ”๋“œ ํฌ์ธํŠธ ๊ธธ์ด + 1๋งŒํผ ๊ฐ์†Œ์‹œํ‚ค๊ณ , buffer๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•œ ๋’ค state๋ฅผ ํ˜ธ์ŠคํŠธ ์ƒํƒœ๋กœ ์„ค์ •ํ•œ๋‹ค.

    3. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, c๋ฅผ buffer์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    ํ˜ธ์ŠคํŠธ ์ƒํƒœ
    ํ˜ธ์ŠคํŠธ๋ช… ์ƒํƒœ
    1. state override๊ฐ€ ์ฃผ์–ด์ง€๊ณ  url์˜ ์Šคํ‚ด์ด "file"์ด๋ฉด, pointer๋ฅผ 1๋งŒํผ ๊ฐ์†Œ์‹œํ‚ค๊ณ  state๋ฅผ ํŒŒ์ผ ํ˜ธ์ŠคํŠธ ์ƒํƒœ๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , c๊ฐ€ U+003A (:)์ด๊ณ  insideBrackets๊ฐ€ false์ด๋ฉด:

      1. buffer๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด, host-missing ๊ฒ€์ฆ ์˜ค๋ฅ˜, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      2. state override๊ฐ€ ์ฃผ์–ด์ง€๊ณ  state override๊ฐ€ ํ˜ธ์ŠคํŠธ๋ช… ์ƒํƒœ์ด๋ฉด, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      3. host๋ฅผ buffer์— ๋Œ€ํ•ด url์ด ํŠน์ˆ˜ํ•˜์ง€ ์•Š์Œ๊ณผ ํ•จ๊ป˜ ํ˜ธ์ŠคํŠธ ๊ตฌ๋ฌธ ๋ถ„์„์„ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

      4. host๊ฐ€ failure์ด๋ฉด, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      5. url์˜ ํ˜ธ์ŠคํŠธ๋ฅผ host๋กœ, buffer๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ, state๋ฅผ ํฌํŠธ ์ƒํƒœ๋กœ ์„ค์ •ํ•œ๋‹ค.

    3. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๊ฐ€ true์ด๋ฉด:

      ๊ทธ๋Ÿฌ๋ฉด pointer๋ฅผ 1๋งŒํผ ๊ฐ์†Œ์‹œํ‚จ ๋‹ค์Œ:

      1. url์ด ํŠน์ˆ˜ํ•˜๊ณ  buffer๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด, host-missing ๊ฒ€์ฆ ์˜ค๋ฅ˜, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      2. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , state override๊ฐ€ ์ฃผ์–ด์ง€๊ณ  buffer๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉฐ, url์ด ์ž๊ฒฉ ์ฆ๋ช…์„ ํฌํ•จํ•˜๊ฑฐ๋‚˜ url์˜ ํฌํŠธ๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      3. host๋ฅผ buffer์— ๋Œ€ํ•ด url์ด ํŠน์ˆ˜ํ•˜์ง€ ์•Š์Œ๊ณผ ํ•จ๊ป˜ ํ˜ธ์ŠคํŠธ ๊ตฌ๋ฌธ ๋ถ„์„์„ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

      4. host๊ฐ€ failure์ด๋ฉด, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      5. url์˜ ํ˜ธ์ŠคํŠธ๋ฅผ host๋กœ, buffer๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ, state๋ฅผ ๊ฒฝ๋กœ ์‹œ์ž‘ ์ƒํƒœ๋กœ ์„ค์ •ํ•œ๋‹ค.

      6. state override๊ฐ€ ์ฃผ์–ด์กŒ์œผ๋ฉด, ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    4. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด:

      1. c๊ฐ€ U+005B ([)์ด๋ฉด, insideBrackets๋ฅผ true๋กœ ์„ค์ •ํ•œ๋‹ค.

      2. c๊ฐ€ U+005D (])์ด๋ฉด, insideBrackets๋ฅผ false๋กœ ์„ค์ •ํ•œ๋‹ค.

      3. c๋ฅผ buffer์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    ํฌํŠธ ์ƒํƒœ
    1. c๊ฐ€ ASCII ์ˆซ์ž์ด๋ฉด, c๋ฅผ buffer์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๊ฐ€ true์ด๋ฉด:

      ๊ทธ๋Ÿฌ๋ฉด:

      1. buffer๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ฉด:

        1. port๋ฅผ buffer๊ฐ€ radix-10์—์„œ ๊ฐ’ 0๋ถ€ํ„ฐ 9๊นŒ์ง€์˜ ์ˆซ์ž์— ASCII ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚˜ํƒ€๋‚ด๋Š” ์ˆ˜ํ•™์  ์ •์ˆ˜ ๊ฐ’์œผ๋กœ ๋‘”๋‹ค.

        2. port๊ฐ€ 16๋น„ํŠธ ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฉด, port-out-of-range ๊ฒ€์ฆ ์˜ค๋ฅ˜, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

        3. port๊ฐ€ url์˜ ์Šคํ‚ด์˜ ๊ธฐ๋ณธ ํฌํŠธ์ด๋ฉด url์˜ ํฌํŠธ๋ฅผ null๋กœ ์„ค์ •ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด port๋กœ ์„ค์ •ํ•œ๋‹ค.

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

        5. state override๊ฐ€ ์ฃผ์–ด์กŒ์œผ๋ฉด, ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      2. state override๊ฐ€ ์ฃผ์–ด์กŒ์œผ๋ฉด, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

      3. state๋ฅผ ๊ฒฝ๋กœ ์‹œ์ž‘ ์ƒํƒœ๋กœ ์„ค์ •ํ•˜๊ณ  pointer๋ฅผ 1๋งŒํผ ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

    3. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, port-invalid ๊ฒ€์ฆ ์˜ค๋ฅ˜, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

    ํŒŒ์ผ ์ƒํƒœ
    1. url์˜ ์Šคํ‚ด์„ "file"๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. url์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•œ๋‹ค.

    3. c๊ฐ€ U+002F (/) ๋˜๋Š” U+005C (\)์ด๋ฉด:

      1. c๊ฐ€ U+005C (\)์ด๋ฉด, invalid-reverse-solidus ๊ฒ€์ฆ ์˜ค๋ฅ˜.

      2. state๋ฅผ ํŒŒ์ผ ์Šฌ๋ž˜์‹œ ์ƒํƒœ๋กœ ์„ค์ •ํ•œ๋‹ค.

    4. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , base๊ฐ€ null์ด ์•„๋‹ˆ๋ฉฐ base์˜ ์Šคํ‚ด์ด "file"์ด๋ฉด:

      1. url์˜ ํ˜ธ์ŠคํŠธ๋ฅผ base์˜ ํ˜ธ์ŠคํŠธ๋กœ, url์˜ ๊ฒฝ๋กœ๋ฅผ base์˜ ๊ฒฝ๋กœ์˜ ๋ณต์ œ๋ณธ์œผ๋กœ, ๊ทธ๋ฆฌ๊ณ  url์˜ ์ฟผ๋ฆฌ๋ฅผ base์˜ ์ฟผ๋ฆฌ๋กœ ์„ค์ •ํ•œ๋‹ค.

      2. c๊ฐ€ U+003F (?)์ด๋ฉด, url์˜ ์ฟผ๋ฆฌ๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•˜๊ณ  state๋ฅผ ์ฟผ๋ฆฌ ์ƒํƒœ๋กœ ์„ค์ •ํ•œ๋‹ค.

      3. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , c๊ฐ€ U+0023 (#)์ด๋ฉด, url์˜ ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•˜๊ณ  state๋ฅผ ํ”„๋ž˜๊ทธ๋จผํŠธ ์ƒํƒœ๋กœ ์„ค์ •ํ•œ๋‹ค.

      4. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , c๊ฐ€ EOF ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ ์•„๋‹ˆ๋ฉด:

        1. url์˜ ์ฟผ๋ฆฌ๋ฅผ null๋กœ ์„ค์ •ํ•œ๋‹ค.

        2. pointer๋ถ€ํ„ฐ input์˜ ๋๊นŒ์ง€์˜ ์ฝ”๋“œ ํฌ์ธํŠธ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์ด Windows ๋“œ๋ผ์ด๋ธŒ ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š์œผ๋ฉด, url์˜ ๊ฒฝ๋กœ๋ฅผ ๋‹จ์ถ•ํ•œ๋‹ค.

        3. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด:

          1. File-invalid-Windows-drive-letter ๊ฒ€์ฆ ์˜ค๋ฅ˜.

          2. url์˜ ๊ฒฝ๋กœ๋ฅผ ยซ ยป๋กœ ์„ค์ •ํ•œ๋‹ค.

          ์ด๋Š” (ํ”Œ๋žซํผ ๋…๋ฆฝ์ ์ธ) Windows ๋“œ๋ผ์ด๋ธŒ ๋ฌธ์ž ํŠน์ด ๋™์ž‘์ด๋‹ค.

        4. state๋ฅผ ๊ฒฝ๋กœ ์ƒํƒœ๋กœ ์„ค์ •ํ•˜๊ณ  pointer๋ฅผ 1๋งŒํผ ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

    5. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, state๋ฅผ ๊ฒฝ๋กœ ์ƒํƒœ๋กœ ์„ค์ •ํ•˜๊ณ , pointer๋ฅผ 1๋งŒํผ ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

    ํŒŒ์ผ ์Šฌ๋ž˜์‹œ ์ƒํƒœ
    1. c๊ฐ€ U+002F (/) ๋˜๋Š” U+005C (\)์ด๋ฉด:

      1. c๊ฐ€ U+005C (\)์ด๋ฉด, invalid-reverse-solidus ๊ฒ€์ฆ ์˜ค๋ฅ˜.

      2. state๋ฅผ ํŒŒ์ผ ํ˜ธ์ŠคํŠธ ์ƒํƒœ๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด:

      1. base๊ฐ€ null์ด ์•„๋‹ˆ๊ณ  base์˜ ์Šคํ‚ด์ด "file"์ด๋ฉด:

        1. url์˜ ํ˜ธ์ŠคํŠธ๋ฅผ base์˜ ํ˜ธ์ŠคํŠธ๋กœ ์„ค์ •ํ•œ๋‹ค.

        2. pointer๋ถ€ํ„ฐ input์˜ ๋๊นŒ์ง€์˜ ์ฝ”๋“œ ํฌ์ธํŠธ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์ด Windows ๋“œ๋ผ์ด๋ธŒ ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š๊ณ  base์˜ ๊ฒฝ๋กœ[0]์ด ์ •๊ทœํ™”๋œ Windows ๋“œ๋ผ์ด๋ธŒ ๋ฌธ์ž์ด๋ฉด, base์˜ ๊ฒฝ๋กœ[0]์„ url์˜ ๊ฒฝ๋กœ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

          ์ด๋Š” (ํ”Œ๋žซํผ ๋…๋ฆฝ์ ์ธ) Windows ๋“œ๋ผ์ด๋ธŒ ๋ฌธ์ž ํŠน์ด ๋™์ž‘์ด๋‹ค.

      2. state๋ฅผ ๊ฒฝ๋กœ ์ƒํƒœ๋กœ ์„ค์ •ํ•˜๊ณ , pointer๋ฅผ 1๋งŒํผ ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

    ํŒŒ์ผ ํ˜ธ์ŠคํŠธ ์ƒํƒœ
    1. c๊ฐ€ EOF ์ฝ”๋“œ ํฌ์ธํŠธ, U+002F (/), U+005C (\), U+003F (?), ๋˜๋Š” U+0023 (#)์ด๋ฉด, pointer๋ฅผ 1๋งŒํผ ๊ฐ์†Œ์‹œํ‚จ ๋‹ค์Œ:

      1. state override๊ฐ€ ์ฃผ์–ด์ง€์ง€ ์•Š์•˜๊ณ  buffer๊ฐ€ Windows ๋“œ๋ผ์ด๋ธŒ ๋ฌธ์ž์ด๋ฉด, file-invalid-Windows-drive-letter-host ๊ฒ€์ฆ ์˜ค๋ฅ˜, state๋ฅผ ๊ฒฝ๋กœ ์ƒํƒœ๋กœ ์„ค์ •ํ•œ๋‹ค.

        ์ด๋Š” (ํ”Œ๋žซํผ ๋…๋ฆฝ์ ์ธ) Windows ๋“œ๋ผ์ด๋ธŒ ๋ฌธ์ž ํŠน์ด ๋™์ž‘์ด๋‹ค. buffer๋Š” ์—ฌ๊ธฐ์„œ ์žฌ์„ค์ •๋˜์ง€ ์•Š๊ณ  ๋Œ€์‹  ๊ฒฝ๋กœ ์ƒํƒœ์—์„œ ์‚ฌ์šฉ๋œ๋‹ค.

      2. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , buffer๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด:

        1. url์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•œ๋‹ค.

        2. state override๊ฐ€ ์ฃผ์–ด์กŒ์œผ๋ฉด, ๋ฐ˜ํ™˜ํ•œ๋‹ค.

        3. state๋ฅผ ๊ฒฝ๋กœ ์‹œ์ž‘ ์ƒํƒœ๋กœ ์„ค์ •ํ•œ๋‹ค.

      3. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค:

        1. host๋ฅผ buffer์— ๋Œ€ํ•ด url์ด ํŠน์ˆ˜ํ•˜์ง€ ์•Š์Œ๊ณผ ํ•จ๊ป˜ ํ˜ธ์ŠคํŠธ ๊ตฌ๋ฌธ ๋ถ„์„์„ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

        2. host๊ฐ€ failure์ด๋ฉด, failure๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

        3. host๊ฐ€ "localhost"์ด๋ฉด, host๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•œ๋‹ค.

        4. url์˜ ํ˜ธ์ŠคํŠธ๋ฅผ host๋กœ ์„ค์ •ํ•œ๋‹ค.

        5. state override๊ฐ€ ์ฃผ์–ด์กŒ์œผ๋ฉด, ๋ฐ˜ํ™˜ํ•œ๋‹ค.

        6. buffer๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•˜๊ณ  state๋ฅผ ๊ฒฝ๋กœ ์‹œ์ž‘ ์ƒํƒœ๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, c๋ฅผ buffer์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    ๊ฒฝ๋กœ ์‹œ์ž‘ ์ƒํƒœ
    1. url์ด ํŠน์ˆ˜ํ•˜๋ฉด:

      1. c๊ฐ€ U+005C (\)์ด๋ฉด, invalid-reverse-solidus ๊ฒ€์ฆ ์˜ค๋ฅ˜.

      2. state๋ฅผ ๊ฒฝ๋กœ ์ƒํƒœ๋กœ ์„ค์ •ํ•œ๋‹ค.

      3. c๊ฐ€ U+002F (/) ๋˜๋Š” U+005C (\)๊ฐ€ ์•„๋‹ˆ๋ฉด, pointer๋ฅผ 1๋งŒํผ ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , state override๊ฐ€ ์ฃผ์–ด์ง€์ง€ ์•Š์•˜์œผ๋ฉฐ c๊ฐ€ U+003F (?)์ด๋ฉด, url์˜ ์ฟผ๋ฆฌ๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•˜๊ณ  state๋ฅผ ์ฟผ๋ฆฌ ์ƒํƒœ๋กœ ์„ค์ •ํ•œ๋‹ค.

    3. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , state override๊ฐ€ ์ฃผ์–ด์ง€์ง€ ์•Š์•˜์œผ๋ฉฐ c๊ฐ€ U+0023 (#)์ด๋ฉด, url์˜ ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•˜๊ณ  state๋ฅผ ํ”„๋ž˜๊ทธ๋จผํŠธ ์ƒํƒœ๋กœ ์„ค์ •ํ•œ๋‹ค.

    4. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , c๊ฐ€ EOF ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ ์•„๋‹ˆ๋ฉด:

      1. state๋ฅผ ๊ฒฝ๋กœ ์ƒํƒœ๋กœ ์„ค์ •ํ•œ๋‹ค.

      2. c๊ฐ€ U+002F (/)๊ฐ€ ์•„๋‹ˆ๋ฉด, pointer๋ฅผ 1๋งŒํผ ๊ฐ์†Œ์‹œํ‚จ๋‹ค.

    5. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , state override๊ฐ€ ์ฃผ์–ด์กŒ์œผ๋ฉฐ url์˜ ํ˜ธ์ŠคํŠธ๊ฐ€ null์ด๋ฉด, ๋นˆ ๋ฌธ์ž์—ด์„ url์˜ ๊ฒฝ๋กœ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    ๊ฒฝ๋กœ ์ƒํƒœ
    1. ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๊ฐ€ true์ด๋ฉด:

      ๊ทธ๋Ÿฌ๋ฉด:

      1. url์ด ํŠน์ˆ˜ํ•˜๊ณ  c๊ฐ€ U+005C (\)์ด๋ฉด, invalid-reverse-solidus ๊ฒ€์ฆ ์˜ค๋ฅ˜.

      2. buffer๊ฐ€ ์ด์ค‘ ์  URL ๊ฒฝ๋กœ ์„ธ๊ทธ๋จผํŠธ์ด๋ฉด:

        1. url์˜ ๊ฒฝ๋กœ๋ฅผ ๋‹จ์ถ•ํ•œ๋‹ค.

        2. c๊ฐ€ U+002F (/)์ธ ๊ฒƒ๋„ ์•„๋‹ˆ๊ณ , url์ด ํŠน์ˆ˜ํ•˜๊ณ  c๊ฐ€ U+005C (\)์ธ ๊ฒƒ๋„ ์•„๋‹ˆ๋ฉด, ๋นˆ ๋ฌธ์ž์—ด์„ url์˜ ๊ฒฝ๋กœ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

          ์ด๋Š” ์ž…๋ ฅ /usr/..์— ๋Œ€ํ•ด ๊ฒฐ๊ณผ๊ฐ€ /์ด๊ณ  ๊ฒฝ๋กœ๊ฐ€ ์—†๋Š” ๊ฒƒ์ด ์•„๋‹˜์„ ์˜๋ฏธํ•œ๋‹ค.

      3. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , buffer๊ฐ€ ๋‹จ์ผ ์  URL ๊ฒฝ๋กœ ์„ธ๊ทธ๋จผํŠธ์ด๋ฉฐ c๊ฐ€ U+002F (/)์ธ ๊ฒƒ๋„ ์•„๋‹ˆ๊ณ , url์ด ํŠน์ˆ˜ํ•˜๊ณ  c๊ฐ€ U+005C (\)์ธ ๊ฒƒ๋„ ์•„๋‹ˆ๋ฉด, ๋นˆ ๋ฌธ์ž์—ด์„ url์˜ ๊ฒฝ๋กœ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

      4. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , buffer๊ฐ€ ๋‹จ์ผ ์  URL ๊ฒฝ๋กœ ์„ธ๊ทธ๋จผํŠธ๊ฐ€ ์•„๋‹ˆ๋ฉด:

        1. url์˜ ์Šคํ‚ด์ด "file"์ด๊ณ , url์˜ ๊ฒฝ๋กœ๊ฐ€ ๋น„์–ด ์žˆ์œผ๋ฉฐ, buffer๊ฐ€ Windows ๋“œ๋ผ์ด๋ธŒ ๋ฌธ์ž์ด๋ฉด, buffer์˜ ๋‘ ๋ฒˆ์งธ ์ฝ”๋“œ ํฌ์ธํŠธ๋ฅผ U+003A (:)๋กœ ๊ต์ฒดํ•œ๋‹ค.

          ์ด๋Š” (ํ”Œ๋žซํผ ๋…๋ฆฝ์ ์ธ) Windows ๋“œ๋ผ์ด๋ธŒ ๋ฌธ์ž ํŠน์ด ๋™์ž‘์ด๋‹ค.

        2. buffer๋ฅผ url์˜ ๊ฒฝ๋กœ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

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

      6. c๊ฐ€ U+003F (?)์ด๋ฉด, url์˜ ์ฟผ๋ฆฌ๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•˜๊ณ  state๋ฅผ ์ฟผ๋ฆฌ ์ƒํƒœ๋กœ ์„ค์ •ํ•œ๋‹ค.

      7. c๊ฐ€ U+0023 (#)์ด๋ฉด, url์˜ ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•˜๊ณ  state๋ฅผ ํ”„๋ž˜๊ทธ๋จผํŠธ ์ƒํƒœ๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค:

      1. c๊ฐ€ URL ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ ์•„๋‹ˆ๊ณ  U+0025 (%)๋„ ์•„๋‹ˆ๋ฉด, invalid-URL-unit ๊ฒ€์ฆ ์˜ค๋ฅ˜.

      2. c๊ฐ€ U+0025 (%)์ด๊ณ  remaining์ด ๋‘ ๊ฐœ์˜ ASCII 16์ง„ ์ˆซ์ž๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š์œผ๋ฉด, invalid-URL-unit ๊ฒ€์ฆ ์˜ค๋ฅ˜.

      3. c๋ฅผ ๊ฒฝ๋กœ ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ ์ง‘ํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ UTF-8 ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ buffer์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    ๋ถˆํˆฌ๋ช… ๊ฒฝ๋กœ ์ƒํƒœ
    1. c๊ฐ€ U+003F (?)์ด๋ฉด, url์˜ ์ฟผ๋ฆฌ๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•˜๊ณ  state๋ฅผ ์ฟผ๋ฆฌ ์ƒํƒœ๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , c๊ฐ€ U+0023 (#)์ด๋ฉด, url์˜ ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•˜๊ณ  state๋ฅผ ํ”„๋ž˜๊ทธ๋จผํŠธ ์ƒํƒœ๋กœ ์„ค์ •ํ•œ๋‹ค.

    3. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , c๊ฐ€ U+0020 SPACE์ด๋ฉด:

      1. Invalid-URL-unit ๊ฒ€์ฆ ์˜ค๋ฅ˜.

      2. remaining์ด U+003F (?) ๋˜๋Š” U+0023 (#)์œผ๋กœ ์‹œ์ž‘ํ•˜๋ฉด, "%20"์„ url์˜ ๊ฒฝ๋กœ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

      3. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, U+0020 SPACE๋ฅผ url์˜ ๊ฒฝ๋กœ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    4. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , c๊ฐ€ EOF ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ ์•„๋‹ˆ๋ฉด:

      1. c๊ฐ€ URL ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ ์•„๋‹ˆ๊ณ  U+0025 (%)๋„ ์•„๋‹ˆ๋ฉด, invalid-URL-unit ๊ฒ€์ฆ ์˜ค๋ฅ˜.

      2. c๊ฐ€ U+0025 (%)์ด๊ณ  remaining์ด ๋‘ ๊ฐœ์˜ ASCII 16์ง„ ์ˆซ์ž๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š์œผ๋ฉด, invalid-URL-unit ๊ฒ€์ฆ ์˜ค๋ฅ˜.

      3. c๋ฅผ C0 ์ œ์–ด ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ ์ง‘ํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ UTF-8 ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ url์˜ ๊ฒฝ๋กœ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    ์ฟผ๋ฆฌ ์ƒํƒœ
    1. encoding์ด UTF-8์ด ์•„๋‹ˆ๊ณ  ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๊ฐ€ true์ด๋ฉด:

      ๊ทธ๋Ÿฌ๋ฉด encoding์„ UTF-8๋กœ ์„ค์ •ํ•œ๋‹ค.

    2. ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๊ฐ€ true์ด๋ฉด:

      ๊ทธ๋Ÿฌ๋ฉด:

      1. queryPercentEncodeSet๋ฅผ url์ด ํŠน์ˆ˜ํ•˜๋ฉด ํŠน์ˆ˜ ์ฟผ๋ฆฌ ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ ์ง‘ํ•ฉ์œผ๋กœ ๋‘๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ฟผ๋ฆฌ ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ ์ง‘ํ•ฉ์œผ๋กœ ๋‘”๋‹ค.

      2. encoding, buffer, ๊ทธ๋ฆฌ๊ณ  queryPercentEncodeSet์œผ๋กœ ์ธ์ฝ”๋”ฉ ํ›„ ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ url์˜ ์ฟผ๋ฆฌ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

        ์ด ์ž‘์—…์€ ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๋Š” ISO-2022-JP ์ธ์ฝ”๋” ๋•Œ๋ฌธ์— ์ฝ”๋“œ ํฌ์ธํŠธ ๋‹จ์œ„๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค.

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

      4. c๊ฐ€ U+0023 (#)์ด๋ฉด, url์˜ ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•˜๊ณ  state๋ฅผ ํ”„๋ž˜๊ทธ๋จผํŠธ ์ƒํƒœ๋กœ ์„ค์ •ํ•œ๋‹ค.

    3. ๊ทธ๋ ‡์ง€ ์•Š๊ณ , c๊ฐ€ EOF ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ ์•„๋‹ˆ๋ฉด:

      1. c๊ฐ€ URL ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ ์•„๋‹ˆ๊ณ  U+0025 (%)๋„ ์•„๋‹ˆ๋ฉด, invalid-URL-unit ๊ฒ€์ฆ ์˜ค๋ฅ˜.

      2. c๊ฐ€ U+0025 (%)์ด๊ณ  remaining์ด ๋‘ ๊ฐœ์˜ ASCII 16์ง„ ์ˆซ์ž๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š์œผ๋ฉด, invalid-URL-unit ๊ฒ€์ฆ ์˜ค๋ฅ˜.

      3. c๋ฅผ buffer์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    ํ”„๋ž˜๊ทธ๋จผํŠธ ์ƒํƒœ
    1. c๊ฐ€ EOF ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ ์•„๋‹ˆ๋ฉด:

      1. c๊ฐ€ URL ์ฝ”๋“œ ํฌ์ธํŠธ๊ฐ€ ์•„๋‹ˆ๊ณ  U+0025 (%)๋„ ์•„๋‹ˆ๋ฉด, invalid-URL-unit ๊ฒ€์ฆ ์˜ค๋ฅ˜.

      2. c๊ฐ€ U+0025 (%)์ด๊ณ  remaining์ด ๋‘ ๊ฐœ์˜ ASCII 16์ง„ ์ˆซ์ž๋กœ ์‹œ์ž‘ํ•˜์ง€ ์•Š์œผ๋ฉด, invalid-URL-unit ๊ฒ€์ฆ ์˜ค๋ฅ˜.

      3. c๋ฅผ ํ”„๋ž˜๊ทธ๋จผํŠธ ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ ์ง‘ํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ UTF-8 ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ url์˜ ํ”„๋ž˜๊ทธ๋จผํŠธ์— ์ถ”๊ฐ€ํ•œ๋‹ค.

  10. url์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


username ์„ค์ •์„ url๊ณผ username์— ๋Œ€ํ•ด ์‹คํ–‰ํ•  ๋•Œ, url์˜ username์„ username์— UTF-8 ํผ์„ผํŠธ ์ธ์ฝ”๋“œ๋ฅผ userinfo percent-encode set์œผ๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

password ์„ค์ •์„ url๊ณผ password์— ๋Œ€ํ•ด ์‹คํ–‰ํ•  ๋•Œ, url์˜ password๋ฅผ password์— UTF-8 ํผ์„ผํŠธ ์ธ์ฝ”๋“œ๋ฅผ userinfo percent-encode set์œผ๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

4.5. URL ์ง๋ ฌํ™”

URL ์ง๋ ฌํ™”๊ธฐ๋Š” URL url์„ ์ทจํ•˜๋ฉฐ, ์„ ํƒ์ ์ธ ๋ถˆ๋ฆฌ์–ธ exclude fragment(๊ธฐ๋ณธ๊ฐ’ false)๋ฅผ ์‚ฌ์šฉํ•œ ๋‹ค์Œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ด ๋‹จ๊ณ„๋“ค์€ ASCII ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  1. output์„ url์˜ ์Šคํ‚ด๊ณผ U+003A (:)๋ฅผ ์—ฐ๊ฒฐํ•œ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. url์˜ ํ˜ธ์ŠคํŠธ๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด:

    1. output์— "//"๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

    2. url์ด ์ž๊ฒฉ ์ฆ๋ช…์„ ํฌํ•จํ•œ๋‹ค๋ฉด:

      1. url์˜ ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ output์— ์ถ”๊ฐ€ํ•œ๋‹ค.

      2. url์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ฉด, U+003A (:)์™€ ๊ทธ ๋’ค์— url์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ output์— ์ถ”๊ฐ€ํ•œ๋‹ค.

      3. output์— U+0040 (@)์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

    3. url์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ง๋ ฌํ™”ํ•˜์—ฌ output์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    4. url์˜ ํฌํŠธ๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, U+003A (:)์™€ ๊ทธ ๋’ค์— url์˜ ํฌํŠธ๋ฅผ ์ง๋ ฌํ™”ํ•˜์—ฌ output์— ์ถ”๊ฐ€ํ•œ๋‹ค.

  3. url์˜ ํ˜ธ์ŠคํŠธ๊ฐ€ null์ด๊ณ , url์— ๋ถˆํˆฌ๋ช… ๊ฒฝ๋กœ๊ฐ€ ์—†๊ณ , url์˜ ๊ฒฝ๋กœ์˜ ํฌ๊ธฐ๊ฐ€ 1๋ณด๋‹ค ํฌ๊ณ , url์˜ ๊ฒฝ๋กœ[0]์ด ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด, output์— U+002F (/) ๋’ค์— U+002E (.)๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

    ์ด๋Š” web+demo:/.//not-a-host/ ๋˜๋Š” web+demo:/path/..//not-a-host/๊ฐ€ ํŒŒ์‹ฑ๋œ ๋‹ค์Œ ์ง๋ ฌํ™”๋  ๋•Œ web+demo://not-a-host/๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค(์ด๋“ค์€ ๊ฒฐ๊ตญ web+demo:/.//not-a-host/๊ฐ€ ๋œ๋‹ค).

  4. URL ๊ฒฝ๋กœ ์ง๋ ฌํ™”๋ฅผ url์— ์ˆ˜ํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ output์— ์ถ”๊ฐ€ํ•œ๋‹ค.

  5. url์˜ ์ฟผ๋ฆฌ๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, U+003F (?)์™€ ๊ทธ ๋’ค์— url์˜ ์ฟผ๋ฆฌ๋ฅผ output์— ์ถ”๊ฐ€ํ•œ๋‹ค.

  6. exclude fragment๊ฐ€ false์ด๊ณ  url์˜ ํ”„๋ž˜๊ทธ๋จผํŠธ๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด, U+0023 (#)๊ณผ ๊ทธ ๋’ค์— url์˜ ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ output์— ์ถ”๊ฐ€ํ•œ๋‹ค.

  7. output์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

URL ๊ฒฝ๋กœ ์ง๋ ฌํ™”๊ธฐ๋Š” URL ๋˜๋Š” URL ๊ฒฝ๋กœ urlOrPath๋ฅผ ์ทจํ•˜๊ณ  ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ด ๋‹จ๊ณ„๋“ค์€ ASCII ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  1. urlOrPath๊ฐ€ URL์ด๋ฉด path๋ฅผ urlOrPath์˜ ๊ฒฝ๋กœ๋กœ ์„ค์ •ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด urlOrPath๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. path๊ฐ€ URL ๊ฒฝ๋กœ ์„ธ๊ทธ๋จผํŠธ์ด๋ฉด, path๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. output์„ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•œ๋‹ค.

  4. path์˜ ๊ฐ segment์— ๋Œ€ํ•ด ๊ฐ๊ฐ: U+002F (/)์™€ ๊ทธ ๋’ค์— segment๋ฅผ output์— ์ถ”๊ฐ€ํ•œ๋‹ค.

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

4.6. URL ๋™๋“ฑ์„ฑ

URL A๊ฐ€ ๊ฐ™์€์ง€ URL B์™€ ๋น„๊ตํ•˜๋ ค๋ฉด, ์„ ํƒ์  ๋ถˆ๋ฆฌ์–ธ exclude fragments(๊ธฐ๋ณธ๊ฐ’ false)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

  1. serializedA๋ฅผ ์ง๋ ฌํ™”ํ•œ A์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•˜๋˜, exclude fragment๋ฅผ exclude fragments๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. serializedB๋ฅผ ์ง๋ ฌํ™”ํ•œ B์˜ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•˜๋˜, exclude fragment๋ฅผ exclude fragments๋กœ ์„ค์ •ํ•œ๋‹ค.

  3. serializedA๊ฐ€ serializedB์ด๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

URL ๊ฒฝ๋กœ A๊ฐ€ ๊ฐ™์€์ง€ URL ๊ฒฝ๋กœ B์™€ ๋น„๊ตํ•˜๋ ค๋ฉด, A์™€ B๊ฐ€ ๊ฐ™์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ง๋ ฌํ™” ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹ˆ๋ผ URL ๊ฒฝ๋กœ ์„ธ๊ทธ๋จผํŠธ๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•  ์ˆ˜ ์žˆ๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ URL ๊ฒฝ๋กœ๊ฐ€ ๋™์ผํ•˜๊ฒŒ ์ง๋ ฌํ™”๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, web+demo:์˜ ๊ฒฝ๋กœ๋Š” ๋นˆ ๋ฌธ์ž์—ด์ธ ๋ฐ˜๋ฉด, web+demo://host์˜ ๊ฒฝ๋กœ๋Š” ยซ ยป์ด๋ฉฐ, ๋‘˜ ๋‹ค ๋นˆ ๋ฌธ์ž์—ด๋กœ ์ง๋ ฌํ™”๋œ๋‹ค.

URL ๊ฒฝ๋กœ A๊ฐ€ ๋‹ค์Œ์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š”์ง€ URL ๊ฒฝ๋กœ B์™€ ๋น„๊ตํ•˜๋ ค๋ฉด, ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ด ๋‹จ๊ณ„๋“ค์€ ๋ถˆ๋ฆฌ์–ธ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  1. A๊ฐ€ URL ๊ฒฝ๋กœ ์„ธ๊ทธ๋จผํŠธ์ด๊ฑฐ๋‚˜ B๊ฐ€ URL ๊ฒฝ๋กœ ์„ธ๊ทธ๋จผํŠธ์ด๋ฉด, false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. B์˜ ํฌ๊ธฐ๊ฐ€ A์˜ ํฌ๊ธฐ๋ณด๋‹ค ํฌ๋ฉด, false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. B์˜ ๊ฐ index์— ๋Œ€ํ•ด, B์˜ ์ธ๋ฑ์Šค ์ค‘: A[index]๊ฐ€ B[index]๊ฐ€ ์•„๋‹ˆ๋ฉด, false๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

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

URL ๊ฒฝ๋กœ ์„ธ๊ทธ๋จผํŠธ๋Š” ๋ชฉ๋ก ์•ˆ์—์„œ ์ ˆ๋Œ€๋กœ U+002F (/)๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, A๋Š” B๊ฐ€ A์˜ ์ „์ฒด ์„ธ๊ทธ๋จผํŠธ๋ฅผ ํฌํ•จํ•  ๋•Œ๋งŒ B๋กœ ์‹œ์ž‘ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Š” ํ•˜๋‚˜์˜ URL ๊ฒฝ๋กœ๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ๋กœ์— "ํฌํ•จ"๋˜๋Š”์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•˜๋‹ค. ์ง๋ ฌํ™” ๊ฒฐ๊ณผ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ๋น„๊ตํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค. ๋‹ค์Œ ์ง๋ ฌํ™” ๊ฒฐ๊ณผ๋Š” ยซ "foobar" ยป์˜ ๊ฒƒ์ด ๋‹ค์Œ์œผ๋กœ ์‹œ์ž‘ํ•œ๋‹ค. ยซ "foo" ยป์˜ ์ง๋ ฌํ™” ๊ฒฐ๊ณผ๋กœ ์‹œ์ž‘ํ•˜์ง€๋งŒ, ํ›„์ž์˜ URL์—์„œ ํ•ด๋‹น ๊ฒฝ๋กœ๋Š” ์ „์ž์˜ URL์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.

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

4.7. ์˜ค๋ฆฌ์ง„

HTML์— ์žˆ๋Š” ์˜ค๋ฆฌ์ง„์˜ ์ •์˜์—์„œ ํ•„์š”ํ•œ ๋ฐฐ๊ฒฝ ์ •๋ณด๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. [HTML]

URL url์˜ ์ถœ์ฒ˜๋Š” ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ฐ˜ํ™˜๋˜๋Š” ์ถœ์ฒ˜์ด๋ฉฐ, ๋‹ค์Œ์— ๋”ฐ๋ผ ๋ถ„๊ธฐํ•œ๋‹ค. url์˜ ์Šคํ‚ด:

"blob"
  1. url์˜ blob URL ํ•ญ๋ชฉ์ด null์ด ์•„๋‹ˆ๋ฉด, url์˜ blob URL ํ•ญ๋ชฉ์˜ ํ™˜๊ฒฝ์˜ ์ถœ์ฒ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. pathURL์„ ํŒŒ์‹ฑํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค. ๋‹ค์Œ ๊ฒฐ๊ณผ๋ฅผ URL ๊ฒฝ๋กœ ์ง๋ ฌํ™”ํ•œ url.

  3. pathURL์ด ์‹คํŒจ์ด๋ฉด, ์ƒˆ ๋ถˆํˆฌ๋ช… ์ถœ์ฒ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  4. pathURL์˜ ์Šคํ‚ด์ด "http", "https" ๋˜๋Š” "file"์ด๋ฉด, pathURL์˜ ์ถœ์ฒ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  5. ์ƒˆ ๋ถˆํˆฌ๋ช… ์ถœ์ฒ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ถœ์ฒ˜๋Š” blob:https://whatwg.org/d0360e2f-caee-469f-9a2f-87d5b0456f6f์˜ ๊ฒฝ์šฐ ํŠœํ”Œ ์ถœ์ฒ˜ ("https", "whatwg.org", null, null)์ด๋‹ค.

"ftp"
"http"
"https"
"ws"
"wss"

ํŠœํ”Œ ์ถœ์ฒ˜ (url์˜ ์Šคํ‚ด, url์˜ ํ˜ธ์ŠคํŠธ, url์˜ ํฌํŠธ, null)์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

"file"

์œ ๊ฐ์Šค๋Ÿฝ์ง€๋งŒ, ์ด๋Š” ๋…์ž์—๊ฒŒ ์—ฐ์Šต ๋ฌธ์ œ๋กœ ๋‚จ๊ฒจ ๋‘”๋‹ค. ํ™•์‹ ์ด ์—†๋‹ค๋ฉด, ์ƒˆ ๋ถˆํˆฌ๋ช… ์ถœ์ฒ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ

์ƒˆ ๋ถˆํˆฌ๋ช… ์ถœ์ฒ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ด๋Š” ์‹ค์ œ๋กœ ์ด๋Ÿฌํ•œ URL์ด ์ž๊ธฐ ์ž์‹ ๊ณผ ๋™์ผ ์ถœ์ฒ˜์ผ ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•œ๋‹ค.

4.8. URL ๋ Œ๋”๋ง

URL์€ URL ํ‘œ์‹œ์˜ ์ฃผ๋œ ๋ชฉ์ ์ด ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด์•ˆ ๋˜๋Š” ์‹ ๋ขฐ์— ๊ด€ํ•œ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ธ ๊ฒฝ์šฐ, ์•„๋ž˜์— ์„ค๋ช…๋œ ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ ์šฉํ•˜์—ฌ ์ง๋ ฌํ™”๋œ ํ˜•์‹์œผ๋กœ ๋ Œ๋”๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž๋Š” ๋ธŒ๋ผ์šฐ์ € ์ฃผ์†Œ ํ‘œ์‹œ์ค„์— ๋ Œ๋”๋ง๋œ URL์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹ ๋ขฐ์— ๊ด€ํ•œ ๊ฒฐ์ •์„ ๋‚ด๋ฆด ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.

4.8.1. ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ์–ด๋ ค์šด ๋˜๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๊ตฌ์„ฑ์š”์†Œ ๋‹จ์ˆœํ™”

์Šคํ‘ธํ•‘์˜ ๊ธฐํšŒ๋ฅผ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ ๋ณด์•ˆ ๊ด€๋ จ ์ •๋ณด๋กœ๋ถ€ํ„ฐ ์ฃผ์˜๋ฅผ ๋ถ„์‚ฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค:

4.8.2. ์ƒ๋žต(Elision)

๊ณต๊ฐ„์ด ์ œํ•œ๋œ ํ‘œ์‹œ์—์„œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด์•ˆ ๊ฒฐ์ •์„ ๋‚ด๋ฆด ๋•Œ ์˜คํ•ดํ•˜์ง€ ์•Š๋„๋ก URL์„ ์‹ ์ค‘ํ•˜๊ฒŒ ์ƒ๋žตํ•ด์•ผ ํ•œ๋‹ค:

4.8.3. ๊ตญ์ œํ™” ๋ฐ ํŠน์ˆ˜ ๋ฌธ์ž

๊ตญ์ œํ™” ๋„๋ฉ”์ธ ์ด๋ฆ„(IDN), ํŠน์ˆ˜ ๋ฌธ์ž ๋ฐ ์–‘๋ฐฉํ–ฅ ํ…์ŠคํŠธ๋Š” ์Šคํ‘ธํ•‘์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ฃผ์˜ํ•ด์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค:

5. application/x-www-form-urlencoded

application/x-www-form-urlencoded ํฌ๋งท์€ ๋ชฉ๋ก์— ์žˆ๋Š” ํŠœํ”Œ ๊ฐ๊ฐ์„ name๊ณผ value๋กœ ๊ตฌ์„ฑ๋œ ์Œ์œผ๋กœ ์ธ์ฝ”๋”ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.

application/x-www-form-urlencoded ํฌ๋งท์€ ์—ฌ๋Ÿฌ ๋ฉด์—์„œ ์ด์ƒํ•˜๊ณ  ๊ธฐํ˜•์ ์ธ ๊ฒฐ๊ณผ๋ฌผ์ด๋ฉฐ, ์ˆ˜๋…„๊ฐ„ ๊ตฌํ˜„ ์‚ฌ๊ณ ์™€ ํƒ€ํ˜‘์˜ ๊ฒฐ๊ณผ๋กœ ์ƒํ˜ธ์šด์šฉ์„ฑ์„ ์œ„ํ•ด ํ•„์š”ํ•œ ์š”๊ตฌ์‚ฌํ•ญ ์ง‘ํ•ฉ์œผ๋กœ ์ด์–ด์กŒ์ง€๋งŒ, ๊ฒฐ์ฝ” ์ข‹์€ ์„ค๊ณ„ ๊ด€ํ–‰์„ ๋‚˜ํƒ€๋‚ด์ง€๋Š” ์•Š๋Š”๋‹ค. ํŠนํžˆ, ๋ฐ˜๋ณต์ (๋•Œ๋กœ๋Š” ์ค‘์ฒฉ๋œ) ๋ฌธ์ž ์ธ์ฝ”๋”ฉ๊ณผ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค ๊ฐ„ ๋ณ€ํ™˜์˜ ๊ผฌ์ธ ์„ธ๋ถ€์‚ฌํ•ญ์„ ์ฃผ์˜ ๊นŠ๊ฒŒ ์‚ดํŽด์•ผ ํ•œ๋‹ค. ์•ˆํƒ€๊น๊ฒŒ๋„ HTML ํผ์˜ ๋ณดํŽธ์  ์‚ฌ์šฉ์œผ๋กœ ์ธํ•ด ์ด ํฌ๋งท์€ ๋„๋ฆฌ ์“ฐ์ด๊ณ  ์žˆ๋‹ค. [HTML]

5.1. application/x-www-form-urlencoded ํŒŒ์‹ฑ

๋ ˆ๊ฑฐ์‹œ ์„œ๋ฒ„ ์ค‘์‹ฌ ๊ตฌํ˜„์€ ์ธ์ฝ”๋”ฉ์ด UTF-8์ด ์•„๋‹Œ ๊ฒฝ์šฐ๋‚˜ name์ด `_charset`์ธ ํŠœํ”Œ์— ๋Œ€ํ•ด ํŠน๋ณ„ํ•œ ์ฒ˜๋ฆฌ ๋กœ์ง์„ ์ง€์›ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋กœ์ง์€ ์—ฌ๊ธฐ์„œ ๊ธฐ์ˆ ํ•˜์ง€ ์•Š์œผ๋ฉฐ, UTF-8๋งŒ์ด ์ค€์ˆ˜ํ•˜๋Š” ์ธ์ฝ”๋”ฉ์ด๋‹ค.

application/x-www-form-urlencoded ํŒŒ์„œ๋Š” ๋ฐ”์ดํŠธ ์‹œํ€€์Šค input์„ ๋ฐ›์•„ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค:

  1. sequences๋ฅผ input์„ 0x26(&)์œผ๋กœ ๋ถ„ํ• ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. output์„ name๊ณผ value๊ฐ€ ๋ฌธ์ž์—ด์„ ๋‹ด๋Š” ํŠœํ”Œ๋กœ ๊ตฌ์„ฑ๋œ, ์ดˆ๊ธฐ์—๋Š” ๋นˆ ๋ชฉ๋ก์œผ๋กœ ๋‘”๋‹ค.

  3. ๊ฐ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค bytes์— ๋Œ€ํ•ด sequences์—์„œ:

    1. bytes๊ฐ€ ๋นˆ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค์ด๋ฉด ๊ณ„์†.

    2. bytes์— 0x3D(=)๊ฐ€ ์žˆ์œผ๋ฉด, name์„ bytes์˜ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ฒซ ๋ฒˆ์งธ 0x3D(=) ์ง์ „๊นŒ์ง€์˜ ๋ฐ”์ดํŠธ๋กœ, value๋ฅผ ์ฒซ ๋ฒˆ์งธ 0x3D(=) ์ดํ›„๋ถ€ํ„ฐ ๋๊นŒ์ง€์˜ ๋ฐ”์ดํŠธ๋กœ ๋‘”๋‹ค. 0x3D(=)๊ฐ€ ์ฒซ ๋ฒˆ์งธ ๋ฐ”์ดํŠธ๋ฉด name์€ ๋นˆ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๊ฐ€ ๋˜๊ณ , ๋งˆ์ง€๋ง‰์ด๋ฉด value๋Š” ๋นˆ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๊ฐ€ ๋œ๋‹ค.

    3. ๊ทธ ์™ธ์—๋Š” name์„ bytes ๊ฐ’์œผ๋กœ, value๋ฅผ ๋นˆ ๋ฐ”์ดํŠธ ์‹œํ€€์Šค๋กœ ๋‘”๋‹ค.

    4. name๊ณผ value์˜ ๋ชจ๋“  0x2B(+)๋ฅผ 0x20(SP)๋กœ ์น˜ํ™˜ํ•œ๋‹ค.

    5. nameString๊ณผ valueString์„ ๊ฐ๊ฐ BOM ์—†๋Š” UTF-8 ๋””์ฝ”๋“œ๋ฅผ ํผ์„ผํŠธ ๋””์ฝ”๋”ฉ๋œ name๊ณผ value์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

    6. append (nameString, valueString)๋ฅผ output์— ์ถ”๊ฐ€.

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

5.2. application/x-www-form-urlencoded ์ง๋ ฌํ™”

application/x-www-form-urlencoded ์ง๋ ฌํ™”๊ธฐ๋Š” name-value ํŠœํ”Œ tuples ๋ชฉ๋ก๊ณผ ์„ ํƒ์  ์ธ์ฝ”๋”ฉ encoding(๊ธฐ๋ณธ UTF-8)์„ ๋ฐ›์•„ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ๋ฐ˜ํ™˜๊ฐ’์€ ASCII ๋ฌธ์ž์—ด์ด๋‹ค.

  1. encoding์„ output encoding์„ ์–ป๊ธฐ๋ฅผ encoding์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  2. output์„ ๋นˆ ๋ฌธ์ž์—ด๋กœ ํ•œ๋‹ค.

  3. ๊ฐ tuple์— ๋Œ€ํ•ด tuples์—์„œ ๋ฐ˜๋ณตํ•œ๋‹ค:

    1. ๋‹จ์–ธ: tuple์˜ name๊ณผ tuple์˜ value๋Š” ์Šค์นผ๋ผ ๊ฐ’ ๋ฌธ์ž์—ด์ด๋‹ค.

    2. name์„ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ํ•œ๋‹ค: percent-encode after encoding์„ encoding, tuple์˜ name, ๊ทธ๋ฆฌ๊ณ  application/x-www-form-urlencoded percent-encode set์œผ๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ.

    3. value๋ฅผ ๋‹ค์Œ์˜ ๊ฒฐ๊ณผ๋กœ ํ•œ๋‹ค: percent-encode after encoding์„ encoding, tuple์˜ value, ๊ทธ๋ฆฌ๊ณ  application/x-www-form-urlencoded percent-encode set์œผ๋กœ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ.

    4. output์ด ๋นˆ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ผ๋ฉด U+0026 (&)๋ฅผ output์— ์ถ”๊ฐ€ํ•œ๋‹ค.

    5. name์„ ์ถ”๊ฐ€ํ•˜๊ณ  U+003D (=)๋ฅผ ์ถ”๊ฐ€ํ•œ ๋’ค value๋ฅผ output์— ์ถ”๊ฐ€ํ•œ๋‹ค.
  4. output์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

5.3. ํ›„ํฌ(Hooks)

application/x-www-form-urlencoded ๋ฌธ์ž์—ด ํŒŒ์„œ๋Š” ์Šค์นผ๋ผ ๊ฐ’ ๋ฌธ์ž์—ด input์„ ๋ฐ›์•„ UTF-8๋กœ ์ธ์ฝ”๋“œํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ application/x-www-form-urlencoded ํŒŒ์‹ฑ์— ๋„˜๊ธด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

6. API

์ด ์ ˆ์—์„œ๋Š” Web IDL์˜ ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋ธŒ๋ผ์šฐ์ € ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋Š” ์ด API๋ฅผ ๋ฐ˜๋“œ์‹œ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค. JavaScript ๊ตฌํ˜„๋„ ์ด API๋ฅผ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค. ๊ธฐํƒ€ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๋‚˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” ์ž์‹ ๋“ค์˜ ํ•„์š”์— ๋งž๋Š” ์ ์ ˆํ•œ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋˜๋ฉฐ, ๋ฐ˜๋“œ์‹œ ์ด API์ผ ํ•„์š”๋Š” ์—†๋‹ค. [WEBIDL]

6.1. URL ํด๋ž˜์Šค

[Exposed=*,
 LegacyWindowAlias=webkitURL]
interface URL {
  constructor(USVString url, optional USVString base);

  static URL? parse(USVString url, optional USVString base);
  static boolean canParse(USVString url, optional USVString base);

  stringifier attribute USVString href;
  readonly attribute USVString origin;
           attribute USVString protocol;
           attribute USVString username;
           attribute USVString password;
           attribute USVString host;
           attribute USVString hostname;
           attribute USVString port;
           attribute USVString pathname;
           attribute USVString search;
  [SameObject] readonly attribute URLSearchParams searchParams;
           attribute USVString hash;

  USVString toJSON();
};

URL ๊ฐ์ฒด์—๋Š” ๋‹ค์Œ์ด ์—ฐ๊ด€๋˜์–ด ์žˆ๋‹ค:

API URL ํŒŒ์„œ๋Š” ์Šค์นผ๋ผ ๊ฐ’ ๋ฌธ์ž์—ด url๊ณผ ์„ ํƒ์  null ๋˜๋Š” ์Šค์นผ๋ผ ๊ฐ’ ๋ฌธ์ž์—ด base(๊ธฐ๋ณธ๊ฐ’ null)์„ ๋ฐ›์•„ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์‹คํ–‰ํ•œ๋‹ค:

  1. parsedBase๋ฅผ null๋กœ ๋‘”๋‹ค.

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

    1. parsedBase๋ฅผ ๊ธฐ๋ณธ URL ํŒŒ์„œ๋ฅผ base์— ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •.

    2. parsedBase๊ฐ€ ์‹คํŒจ๋ฉด ์‹คํŒจ๋ฅผ ๋ฐ˜ํ™˜.

  3. ๊ธฐ๋ณธ URL ํŒŒ์„œ๋ฅผ url์— parsedBase์™€ ํ•จ๊ป˜ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜.

initialize๋ฅผ URL ๊ฐ์ฒด url์™€ URL urlRecord์— ์‹คํ–‰ํ•  ๋•Œ:

  1. query๋ฅผ urlRecord์˜ query ๊ฐ’(๊ฐ’์ด null์ด ์•„๋‹ˆ๋ฉด ๊ทธ ๊ฐ’, ์•„๋‹ˆ๋ฉด ๋นˆ ๋ฌธ์ž์—ด)์œผ๋กœ ๋‘”๋‹ค.

  2. url์˜ URL์„ urlRecord๋กœ ์„ค์ •.

  3. url์˜ query ๊ฐ์ฒด๋ฅผ ์ƒˆ URLSearchParams ๊ฐ์ฒด๋กœ ์„ค์ •.

  4. ์ดˆ๊ธฐํ™”๋ฅผ url์˜ query ๊ฐ์ฒด์™€ query์— ์‹คํ–‰.

  5. url์˜ query ๊ฐ์ฒด์˜ URL ๊ฐ์ฒด๋ฅผ url๋กœ ์„ค์ •.

URL ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด์˜ extract an origin ๋‹จ๊ณ„๋Š” this์˜ URL์˜ origin์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. [HTML]


new URL(url, base) ์ƒ์„ฑ์ž ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. parsedURL์„ API URL ํŒŒ์„œ๋ฅผ url์— base(์žˆ์œผ๋ฉด)์™€ ํ•จ๊ป˜ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. parsedURL์ด ์‹คํŒจ๋ฉด TypeError ์˜ˆ์™ธ๋ฅผ ๋˜์ง„๋‹ค.

  3. initialize๋ฅผ this์™€ parsedURL์— ์‹คํ–‰.

๊ธฐ๋ณธ URL์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฌธ์ž์—ด์„ URL๋กœ ํŒŒ์‹ฑํ•˜๋ ค๋ฉด, ๋‹จ์ผ ์ธ์ž๋กœ URL ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค:

var input = "https://example.org/๐Ÿ’ฉ",
    url = new URL(input)
url.pathname // "/%F0%9F%92%A9"

์ž…๋ ฅ์ด relative-URL ๋ฌธ์ž์—ด์ด๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค:

try {
  var url = new URL("/๐Ÿฃ๐Ÿบ")
} catch(e) {
  // that happened
}

๊ทธ๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋Š” ๊ธฐ๋ณธ URL์ด ํ•„์š”ํ•˜๋‹ค:

var input = "/๐Ÿฃ๐Ÿบ",
    url = new URL(input, document.baseURI)
url.href // "https://url.spec.whatwg.org/%F0%9F%8D%A3%F0%9F%8D%BA"

URL ๊ฐ์ฒด๋Š” ๊ธฐ๋ณธ URL๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค (IDL์€ ์ธ์ž๋กœ ๋ฌธ์ž์—ด์„ ์š”๊ตฌํ•˜๋ฏ€๋กœ, URL ๊ฐ์ฒด๋Š” ์ž์‹ ์˜ href getter ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ๋ฌธ์ž์—ดํ™”๋œ๋‹ค):

var url = new URL("๐Ÿณ๏ธโ€๐ŸŒˆ", new URL("https://pride.example/hello-world"))
url.pathname // "/%F0%9F%8F%B3%EF%B8%8F%E2%80%8D%F0%9F%8C%88"

static parse(url, base) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„:

  1. parsedURL์„ API URL ํŒŒ์„œ๋ฅผ url์— base(์žˆ์œผ๋ฉด)์™€ ํ•จ๊ป˜ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  2. parsedURL์ด ์‹คํŒจ๋ฉด null์„ ๋ฐ˜ํ™˜.

  3. url์„ ์ƒˆ URL ๊ฐ์ฒด๋กœ ๋‘”๋‹ค.

  4. initialize๋ฅผ url๊ณผ parsedURL์— ์‹คํ–‰.

  5. url์„ ๋ฐ˜ํ™˜.

์ •์  canParse(url, base) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„:

  1. parsedURL์— API URL ํŒŒ์„œ๋ฅผ url๊ณผ base๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

  2. parsedURL์ด ์‹คํŒจ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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


href getter ๋‹จ๊ณ„์™€ toJSON() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ์‹œ๋ฆฌ์–ผ๋ผ์ด์ฆˆ๋œ this์˜ URL์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

href setter ๋‹จ๊ณ„:

  1. parsedURL์— basic URL ํŒŒ์„œ๋ฅผ ์ž…๋ ฅ๊ฐ’์— ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

  2. parsedURL์ด ์‹คํŒจํ•˜๋ฉด throw TypeError.

  3. this์˜ URL์— parsedURL์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  4. this์˜ query object์˜ list๋ฅผ ๋น„์›๋‹ˆ๋‹ค.

  5. query์— this์˜ URL์˜ query๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

  6. query๊ฐ€ null์ด ์•„๋‹ˆ๋ฉด this์˜ query object์˜ list์— ํŒŒ์‹ฑ query ๊ฒฐ๊ณผ๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

origin getter ๋‹จ๊ณ„๋Š” ์‹œ๋ฆฌ์–ผ๋ผ์ด์ฆˆ๋œ this์˜ URL์˜ origin์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. [HTML]

protocol getter ๋‹จ๊ณ„๋Š” this์˜ URL์˜ scheme ๋‹ค์Œ์— U+003A (:)๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

protocol setter ๋‹จ๊ณ„๋Š” basic URL ํŒŒ์‹ฑ์„ ์ž…๋ ฅ๊ฐ’๊ณผ U+003A (:)๊ฐ€ ๋’ค๋”ฐ๋ฅด๋„๋ก ํ•œ ํ›„ this์˜ URL์„ url๋กœ ํ•˜๊ณ  scheme start state๋ฅผ state override๋กœ ์ง€์ •ํ•˜์—ฌ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

username getter ๋‹จ๊ณ„๋Š” this์˜ URL์˜ username์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

username setter ๋‹จ๊ณ„:

  1. this์˜ URL์ด username/password/port๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์œผ๋ฉด return.

  2. set the username์„ this์˜ URL๊ณผ ์ž…๋ ฅ๊ฐ’์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

password getter ๋‹จ๊ณ„๋Š” this์˜ URL์˜ password๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

password setter ๋‹จ๊ณ„:

  1. this์˜ URL์ด username/password/port๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์œผ๋ฉด return.

  2. set the password๋ฅผ this์˜ URL๊ณผ ์ž…๋ ฅ๊ฐ’์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

host getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. url์„ this์˜ URL๋กœ ๋‘”๋‹ค.

  2. url์˜ ํ˜ธ์ŠคํŠธ๊ฐ€ null์ด๋ฉด, ๋นˆ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  3. url์˜ ํฌํŠธ๊ฐ€ null์ด๋ฉด, url์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ง๋ ฌํ™”ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  4. url์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ง๋ ฌํ™”ํ•œ ๊ฒƒ์—, U+003A (:)์™€ url์˜ ํฌํŠธ๋ฅผ ์ง๋ ฌํ™”ํ•œ ๊ฒƒ์„ ์ด์–ด์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

host setter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. this์˜ URL์ด ๋ถˆํˆฌ๋ช… ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ง€๋ฉด, returnํ•œ๋‹ค.

  2. ์ฃผ์–ด์ง„ ๊ฐ’์„ ๊ธฐ๋ณธ URL ํŒŒ์‹ฑํ•œ๋‹ค. ์ด๋•Œ this์˜ URL์„ url๋กœ, host state๋ฅผ state override๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

host setter์— ์ฃผ์–ด์ง„ ๊ฐ’์— ํฌํŠธ๊ฐ€ ์—†์œผ๋ฉด, this์˜ URL์˜ ํฌํŠธ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค. host getter๊ฐ€ URL-port ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ setter๊ฐ€ ํ•ญ์ƒ ๋‘˜ ๋‹ค "์žฌ์„ค์ •"ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์„ ์ˆ˜ ์žˆ์–ด, ์ด๋Š” ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค.

hostname getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. this์˜ URL์˜ ํ˜ธ์ŠคํŠธ๊ฐ€ null์ด๋ฉด, ๋นˆ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. this์˜ URL์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์ง๋ ฌํ™”ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

hostname ์„ค์ •์ž ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. this์˜ URL์ด ๋ถˆํˆฌ๋ช… ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ง€๋ฉด returnํ•œ๋‹ค.

  2. ์ฃผ์–ด์ง„ ๊ฐ’์„ this์˜ URL์„ url๋กœ, ํ˜ธ์ŠคํŠธ๋ช… ์ƒํƒœ๋ฅผ state override๋กœ ํ•˜์—ฌ ๊ธฐ๋ณธ URL ํŒŒ์‹ฑํ•œ๋‹ค.

port getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. this์˜ URL์˜ ํฌํŠธ๊ฐ€ null์ด๋ฉด ๋นˆ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. this์˜ URL์˜ ํฌํŠธ๋ฅผ ์ง๋ ฌํ™”ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

port ์„ค์ •์ž ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. this์˜ URL์ด ์‚ฌ์šฉ์ž ์ด๋ฆ„/๋น„๋ฐ€๋ฒˆํ˜ธ/ํฌํŠธ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†์œผ๋ฉด, returnํ•œ๋‹ค.

  2. ์ฃผ์–ด์ง„ ๊ฐ’์ด ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด, this์˜ URL์˜ ํฌํŠธ๋ฅผ null๋กœ ์„ค์ •ํ•œ๋‹ค.

  3. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ์ฃผ์–ด์ง„ ๊ฐ’์„ this์˜ URL์„ url๋กœ, ๊ทธ๋ฆฌ๊ณ  ํฌํŠธ ์ƒํƒœ๋ฅผ state override๋กœ ํ•˜์—ฌ ๊ธฐ๋ณธ URL ํŒŒ์‹ฑํ•œ๋‹ค.

pathname getter ๋‹จ๊ณ„๋Š” URL ๊ฒฝ๋กœ ์ง๋ ฌํ™”๋ฅผ this์˜ URL์— ๋Œ€ํ•ด ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

pathname ์„ค์ •์ž ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. this์˜ URL์ด ๋ถˆํˆฌ๋ช… ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ง€๋ฉด returnํ•œ๋‹ค.

  2. this์˜ URL์˜ ๊ฒฝ๋กœ๋ฅผ ๋น„์šด๋‹ค.

  3. ์ฃผ์–ด์ง„ ๊ฐ’์„ this์˜ URL์„ url๋กœ, ๊ฒฝ๋กœ ์‹œ์ž‘ ์ƒํƒœ๋ฅผ state override๋กœ ํ•˜์—ฌ ๊ธฐ๋ณธ URL ํŒŒ์‹ฑํ•œ๋‹ค.

search getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. this์˜ URL์˜ ์ฟผ๋ฆฌ๊ฐ€ null ๋˜๋Š” ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด ๋นˆ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. U+003F (?) ๋’ค์— this์˜ URL์˜ ์ฟผ๋ฆฌ๋ฅผ ๋ถ™์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

search ์„ค์ •์ž ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. url์„ this์˜ URL๋กœ ๋‘”๋‹ค.

  2. ์ฃผ์–ด์ง„ ๊ฐ’์ด ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด, url์˜ ์ฟผ๋ฆฌ๋ฅผ null๋กœ ์„ค์ •ํ•˜๊ณ , this์˜ ์ฟผ๋ฆฌ ๊ฐ์ฒด์˜ ๋ชฉ๋ก์„ ๋น„์šฐ๊ณ , returnํ•œ๋‹ค.

  3. input์„, ์ฃผ์–ด์ง„ ๊ฐ’์—์„œ ์„ ํ–‰ U+003F (?) ํ•˜๋‚˜๋ฅผ ์ œ๊ฑฐํ•œ ๊ฐ’์œผ๋กœ ๋‘”๋‹ค(์žˆ๋Š” ๊ฒฝ์šฐ).

  4. url์˜ ์ฟผ๋ฆฌ๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•œ๋‹ค.

  5. input์„ url์„ url๋กœ, ์ฟผ๋ฆฌ ์ƒํƒœ๋ฅผ state override๋กœ ํ•˜์—ฌ ๊ธฐ๋ณธ URL ํŒŒ์‹ฑํ•œ๋‹ค.

  6. ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: this์˜ ์ฟผ๋ฆฌ ๊ฐ์ฒด์˜ ๋ชฉ๋ก์„ ๋‹ค์Œ ๊ตฌ๋ฌธ ๋ถ„์„ํ•œ url์˜ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋กœ.

searchParams getter ๋‹จ๊ณ„๋Š” this์˜ ์ฟผ๋ฆฌ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

hash getter ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. this์˜ URL์˜ ํ”„๋ž˜๊ทธ๋จผํŠธ๊ฐ€ null ๋˜๋Š” ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด ๋นˆ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  2. U+0023 (#) ๋’ค์— this์˜ URL์˜ ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ๋ถ™์—ฌ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

hash ์„ค์ •์ž ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. ์ฃผ์–ด์ง„ ๊ฐ’์ด ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด, this์˜ URL์˜ ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ null๋กœ ์„ค์ •ํ•˜๊ณ  returnํ•œ๋‹ค.

  2. input์„, ์ฃผ์–ด์ง„ ๊ฐ’์—์„œ ์„ ํ–‰ U+0023 (#) ํ•˜๋‚˜๋ฅผ ์ œ๊ฑฐํ•œ ๊ฐ’์œผ๋กœ ๋‘”๋‹ค(์žˆ๋Š” ๊ฒฝ์šฐ).

  3. this์˜ URL์˜ ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•œ๋‹ค.

  4. input์„ this์˜ URL์„ url๋กœ, ํ”„๋ž˜๊ทธ๋จผํŠธ ์ƒํƒœ๋ฅผ state override๋กœ ํ•˜์—ฌ ๊ธฐ๋ณธ URL ํŒŒ์‹ฑํ•œ๋‹ค.

6.2. URLSearchParams ํด๋ž˜์Šค

[Exposed=*]
interface URLSearchParams {
  constructor(optional (sequence<sequence<USVString>> or record<USVString, USVString> or USVString) init = "");

  readonly attribute unsigned long size;

  undefined append(USVString name, USVString value);
  undefined delete(USVString name, optional USVString value);
  USVString? get(USVString name);
  sequence<USVString> getAll(USVString name);
  boolean has(USVString name, optional USVString value);
  undefined set(USVString name, USVString value);

  undefined sort();

  iterable<USVString, USVString>;
  stringifier;
};

URLSearchParams ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฌธ์ž์—ดํ™”ํ•˜๋Š” ๊ฒƒ์€ ๊ฝค ๊ฐ„๋‹จํ•˜๋‹ค:

let params = new URLSearchParams({key: "730d67"})
params.toString() // "key=730d67"

URLSearchParams ๊ฐ์ฒด๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ application/x-www-form-urlencoded ํฌ๋งท์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ํŠน์ • ์ฝ”๋“œ ํฌ์ธํŠธ์˜ ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์ด URL ๊ฐ์ฒด(์˜ˆ๋ฅผ ๋“ค๋ฉด href ๋ฐ search) ์™€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ searchParams ๋ฅผ ์‚ฌ์šฉํ•ด URL์˜ query๋ฅผ ์กฐ์ž‘ํ•  ๋•Œ ์ด๋Ÿฐ ์ฐจ์ด๋กœ ์ธํ•ด ๋†€๋ž„ ์ˆ˜ ์žˆ๋‹ค.

const url = new URL('https://example.com/?a=b ~');
console.log(url.href);   // "https://example.com/?a=b%20~"
url.searchParams.sort();
console.log(url.href);   // "https://example.com/?a=b+%7E"
const url = new URL('https://example.com/?a=~&b=%7E');
console.log(url.search);                // "?a=~&b=%7E"
console.log(url.searchParams.get('a')); // "~"
console.log(url.searchParams.get('b')); // "~"

URLSearchParams ๊ฐ์ฒด๋Š” application/x-www-form-urlencoded percent-encode set์— ํฌํ•จ๋œ ๋ชจ๋“  ๊ฒƒ์„ percent-encodeํ•˜๋ฉฐ, U+0020 SPACE๋Š” U+002B(+)๋กœ ์ธ์ฝ”๋”ฉํ•œ๋‹ค.

์ธ์ฝ”๋”ฉ์€ ๋ฌด์‹œํ•˜๊ณ (UTF-8 ์‚ฌ์šฉ), search ๋Š” query percent-encode set์ด๋‚˜ special-query percent-encode set์— ํฌํ•จ๋œ ๋ชจ๋“  ๊ฒƒ์„ percent-encodeํ•œ๋‹ค(ํ•ด๋‹น URL์ด special์ธ์ง€์— ๋”ฐ๋ผ ๋‹ค๋ฆ„).

URLSearchParams ๊ฐ์ฒด์—๋Š” ๋‹ค์Œ์ด ์—ฐ๊ด€๋˜์–ด ์žˆ๋‹ค:

initialize๋ฅผ URLSearchParams ๊ฐ์ฒด query์— init์œผ๋กœ ์‹คํ–‰ํ•  ๋•Œ:

  1. init์ด ์‹œํ€€์Šค์ด๋ฉด, init์˜ ๊ฐ innerSequence์— ๋Œ€ํ•ด ๊ฐ๊ฐ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    1. innerSequence์˜ ํฌ๊ธฐ๊ฐ€ 2๊ฐ€ ์•„๋‹ˆ๋ฉด, ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. TypeError.

    2. (innerSequence[0], innerSequence[1])์„ query์˜ ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  2. ๊ทธ๋ ‡์ง€ ์•Š๊ณ  init์ด ๋ ˆ์ฝ”๋“œ์ด๋ฉด, init์˜ ๊ฐ name โ†’ value์— ๋Œ€ํ•ด ๊ฐ๊ฐ (name, value)์„ query์˜ ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  3. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด:

    1. ๋‹จ์–ธ: init์€ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

    2. query์˜ ๋ชฉ๋ก์„ init์„ ํŒŒ์‹ฑํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

update๋ฅผ URLSearchParams ๊ฐ์ฒด query์— ์‹คํ–‰ํ•  ๋•Œ:

  1. query์˜ URL ๊ฐ์ฒด๊ฐ€ null์ด๋ฉด ๋ฐ˜ํ™˜.

  2. serializedQuery๋ฅผ ์ง๋ ฌํ™”๋ฅผ query์˜ list์— ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋‘”๋‹ค.

  3. serializedQuery๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด๋ฉด serializedQuery๋ฅผ null๋กœ ์„ค์ •ํ•œ๋‹ค.

  4. query์˜ URL ๊ฐ์ฒด์˜ URL์˜ query๋ฅผ serializedQuery๋กœ ์„ค์ •ํ•œ๋‹ค.

new URLSearchParams(init) ์ƒ์„ฑ์ž ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. init์ด ๋ฌธ์ž์—ด์ด๊ณ  ์•ž์— U+003F(?)๊ฐ€ ์žˆ์œผ๋ฉด ์ฒ˜์Œ ์ฝ”๋“œ ํฌ์ธํŠธ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

  2. initialize๋ฅผ this์™€ init์— ์‹คํ–‰ํ•œ๋‹ค.

size getter ๋‹จ๊ณ„๋Š” this์˜ list์˜ ํฌ๊ธฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

append(name, value) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. append (name, value)๋ฅผ this์˜ list์— ์ถ”๊ฐ€ํ•œ๋‹ค.

  2. update๋ฅผ this์— ์‹คํ–‰ํ•œ๋‹ค.

delete(name, value) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

  1. value๊ฐ€ ์ฃผ์–ด์ง€๋ฉด removeํ•˜์—ฌ tuples ์ค‘ name์ด name์ด๊ณ  value๊ฐ€ value์ธ ๋ชจ๋“  ํ•ญ๋ชฉ์„ this์˜ list์—์„œ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

  2. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด removeํ•˜์—ฌ tuples ์ค‘ name์ด name์ธ ๋ชจ๋“  ํ•ญ๋ชฉ์„ this์˜ list์—์„œ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

  3. Updateํ•˜์—ฌ this๋ฅผ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.

get(name) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” this์˜ list์—์„œ name์ด name์ธ ์ฒซ ๋ฒˆ์งธ tuple์˜ value๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ๊ทธ๋Ÿฐ ํŠœํ”Œ์ด ์—†๋‹ค๋ฉด null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

getAll(name) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„๋Š” this์˜ list์—์„œ name์ด name์ธ ๋ชจ๋“  tuple์˜ value๋ฅผ ๋ฆฌ์ŠคํŠธ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, ์—†์œผ๋ฉด ๋นˆ sequence๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

has(name, value) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„:

  1. value๊ฐ€ ์ฃผ์–ด์ง€๊ณ , this์˜ list์— name์ด name์ด๊ณ  value๊ฐ€ value์ธ tuple์ด ์žˆ์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  2. value๊ฐ€ ์ฃผ์–ด์ง€์ง€ ์•Š๊ณ , this์˜ list์— name์ด name์ธ tuple์ด ์žˆ์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

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

set(name, value) ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„:

  1. this์˜ list๊ฐ€ name์ด name์ธ tuples์„ containsํ•˜๋ฉด, ์ฒซ ๋ฒˆ์งธ tuple์˜ value๋ฅผ value๋กœ ์„ค์ •ํ•˜๊ณ , ๋‚˜๋จธ์ง€๋ฅผ removeํ•ฉ๋‹ˆ๋‹ค.

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

  3. Updateํ•ด์„œ this๋ฅผ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.


URLSearchParams ๊ฐ์ฒด์—์„œ name-value ํŠœํ”Œ์„ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์€ ์บ์‹œ ์ ์ค‘๋ฅ ์„ ๋†’์ด๋Š” ๋“ฑ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ sort() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

const url = new URL("https://example.org/?q=๐Ÿณ๏ธโ€๐ŸŒˆ&key=e1f7bc78");
url.searchParams.sort();
url.search; // "?key=e1f7bc78&q=%F0%9F%8F%B3%EF%B8%8F%E2%80%8D%F0%9F%8C%88"

์ž…๋ ฅ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์˜ˆ๋ฅผ ๋“ค์–ด ๋น„๊ต ๋ชฉ์ ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ƒˆ URLSearchParams ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”:

const sorted = new URLSearchParams(url.search)
sorted.sort()

sort() ๋ฉ”์„œ๋“œ ๋‹จ๊ณ„:

  1. this ์˜ ๋ฆฌ์ŠคํŠธ ๋ฅผ this ์˜ ๋ฆฌ์ŠคํŠธ ๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ ํ•œ ๊ฒฐ๊ณผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ a ์˜ name์ด b ์˜ name๋ณด๋‹ค ์ฝ”๋“œ ๋‹จ์œ„ ์ˆœ์„œ์ƒ ์ž‘์œผ๋ฉด a ๊ฐ€ b ๋ณด๋‹ค ์ž‘์€ ๊ฒƒ์œผ๋กœ ๋ด…๋‹ˆ๋‹ค.

  2. Updateํ•ด์„œ this๋ฅผ ๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค.


๋ฐ˜๋ณต์— ์‚ฌ์šฉํ•  value pair๋Š” this์˜ list์˜ tuples์ด๋ฉฐ, key๋Š” name์ด๊ณ  value๋Š” value์ž…๋‹ˆ๋‹ค.

๋ฌธ์ž์—ดํ™” ๋™์ž‘ ๋‹จ๊ณ„๋Š” ์‹œ๋ฆฌ์–ผ๋ผ์ด์ง•๋œ this์˜ list๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

6.3. ๋‹ค๋ฅธ ๊ณณ์˜ URL API

URL์„ ๋…ธ์ถœํ•˜๋Š” ํ‘œ์ค€์€, ํ•ด๋‹น URL์„ ๋ฌธ์ž์—ด๋กœ ๋…ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค (๋‚ด๋ถ€ ์ง๋ ฌํ™”ํ•˜์—ฌ URL์„). ํ‘œ์ค€์€ URL ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ URL์„ ๋…ธ์ถœํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. URL ๊ฐ์ฒด๋Š” URL ์กฐ์ž‘์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. IDL์—์„œ๋Š” USVString ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋” ๋†’์€ ์ˆ˜์ค€์˜ ๊ฐœ๋…์€ ๊ฐ’๋“ค์ด ๋ถˆ๋ณ€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ ๋…ธ์ถœ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

ํ‘œ์ค€์ด ์ž์‹ ์ด ์ •์˜ํ•˜๋Š” ๊ธฐ๋Šฅ์— "URL"์ด๋ผ๋Š” ์ด๋ฆ„์˜ ๋ณ€ํ˜•์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ•œ๋‹ค๋ฉด, ํ•ด๋‹น ๊ธฐ๋Šฅ์˜ ์ด๋ฆ„์„ "url"(์†Œ๋ฌธ์ž, ๋์— "l" ํฌํ•จ)๋กœ ์ง€์–ด์•ผ ํ•œ๋‹ค. "URL", "URI", "IRI"์™€ ๊ฐ™์€ ์ด๋ฆ„์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค. ๋‹ค๋งŒ, ์ด๋ฆ„์ด ๋ณตํ•ฉ์–ด์ผ ๊ฒฝ์šฐ "URL"(๋Œ€๋ฌธ์ž)์ด ์„ ํ˜ธ๋œ๋‹ค. ์˜ˆ: "newURL", "oldURL".

HTML์˜ EventSource ๋ฐ HashChangeEvent ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ ์ ˆํ•œ ๋ช…๋ช… ์˜ˆ์‹œ์ด๋‹ค. [HTML]

๊ฐ์‚ฌ์˜ ๊ธ€

์ˆ˜๋…„๊ฐ„ URL์„ ๋” ์ƒํ˜ธ์šด์šฉ์„ฑ ์žˆ๊ฒŒ ๋งŒ๋“œ๋Š”๋ฐ ๋งŽ์€ ๋ถ„๋“ค์ด ๋„์›€์„ ์ฃผ์—ˆ์œผ๋ฉฐ, ์ด ํ‘œ์ค€์˜ ๋ชฉํ‘œ๋ฅผ ๋”์šฑ ๋ฐœ์ „์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋งŽ์€ ๋ถ„๋“ค์ด ์ด ํ‘œ์ค€์ด ์˜ค๋Š˜๋‚ ์˜ ๋ชจ์Šต์ด ๋˜๋„๋ก ๋„์™”์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•ด, 100ใฎไบบ, Adam Barth, Addison Phillips, Adriรกn Chaves, Adrien Ricciardi, Albert Wiersch, Alex Christensen, Alexandre Morgaut, Alexis Hunt, Alwin Blok, Andrew Sullivan, Arkadiusz Michalski, Behnam Esfahbod, Bobby Holley, Boris Zbarsky, Brad Hill, Brandon Ross, Cailyn Hansen, Chris Dumez, Chris Rebert, Corey Farwell, Dan Appelquist, Daniel Bratell, Daniel Stenberg, David Burns, David Hรฅsรคther, David Sheets, David Singer, David Walp, Domenic Denicola, Emily Schechter, Emily Stark, Eric Lawrence, Erik Arvidsson, Gavin Carothers, Geoff Richards, Glenn Maynard, Gordon P. Hemsley, hemanth, Henri Sivonen, Ian Hickson, Ilya Grigorik, Italo A. Casas, Jakub Gieryluk, James C. Wise, James Graham, James Manger, James Ross, Jeff Hodges, Jeffrey Posnick, Jeffrey Yasskin, Joe Duarte, Joshua Bell, Jxck, Karl Wagner, Kemal Zebari, ็”ฐๆ‘ๅฅไบบ (Kent TAMURA), Kevin Grandon, Kornel Lesiล„ski, Larry Masinter, Leif Halvard Silli, Mark Amery, Mark Davis, Marcos Cรกceres, Marijn Kruisselbrink, Martin Dรผrst, Mathias Bynens, Matt Falkenhagen, Matt Giuca, Michael Peick, Michaelโ„ข Smith, Michal Bukovskรฝ, Michel Suignard, Mikaรซl Geljiฤ‡, Nikita Skovoroda, Noah Levitt, Peter Occil, Philip Jรคgenstedt, Philippe Ombredanne, Prayag Verma, Rimas Miseviฤius, Robert Kieffer, Rodney Rehm, Roy Fielding, Ryan Sleevi, Sam Ruby, Sam Sneddon, Santiago M. Mola, Sebastian Mayr, Shannon Booth, Simon Pieters, Simon Sapin, Steven Vachon, Stuart Cook, Sven Uhlig, Tab Atkins, ๅ‰้‡Žๅ‰›ๅฒ (Takeshi Yoshino), Tantek ร‡elik, Tiancheng "Timothy" Gu, Tim Berners-Lee, ็ฐกๅ† ๅบญ (Tim Guan-tin Chien), Titi_Alone, Tomek Wytrฤ™bowicz, Trevor Rowbotham, Tristan Seligmann, Valentin Gosu, Vyacheslav Matva, Wei Wang, Wolf Lammen, ๅฑฑๅฒธๅ’Œๅˆฉ (Yamagishi Kazutoshi), Yongsheng Zhang, ๆˆ็€ฌใ‚†ใ„ (Yui Naruse), ๊ทธ๋ฆฌ๊ณ  zealousidealroll ์—ฌ๋Ÿฌ๋ถ„๊ป˜ ์ง„์‹ฌ์œผ๋กœ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

์ด ํ‘œ์ค€์€ Anne van Kesteren (Apple, annevk@annevk.nl)์ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์ง€์  ์žฌ์‚ฐ๊ถŒ

Copyright ยฉ WHATWG (Apple, Google, Mozilla, Microsoft). ์ด ์ €์ž‘๋ฌผ์€ ํฌ๋ฆฌ์—์ดํ‹ฐ๋ธŒ ์ปค๋จผ์ฆˆ ์ €์ž‘์ž ํ‘œ์‹œ 4.0 ๊ตญ์ œ ๋ผ์ด์„ ์Šค์— ๋”ฐ๋ผ ๋ผ์ด์„ ์Šค๊ฐ€ ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค. ์†Œ์Šค ์ฝ”๋“œ์— ํฌํ•จ๋œ ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ๋Š”, ํ•ด๋‹น ๋ถ€๋ถ„์€ BSD 3-Clause ๋ผ์ด์„ ์Šค์— ๋”ฐ๋ผ ์†Œ์Šค ์ฝ”๋“œ์— ๋ผ์ด์„ ์Šค๊ฐ€ ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์„œ๋Š” ํ˜„ํ–‰ ํ‘œ์ค€(Living Standard)์ž…๋‹ˆ๋‹ค. ํŠนํ—ˆ ์‹ฌ์‚ฌ ๋ฒ„์ „์— ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด ํ˜„ํ–‰ ํ‘œ์ค€ ์‹ฌ์‚ฌ ์ดˆ์•ˆ์„ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค.

์ƒ‰์ธ

์ด ๊ทœ๊ฒฉ์—์„œ ์ •์˜ํ•œ ์šฉ์–ด

์ฐธ์กฐ๋กœ ์ •์˜๋œ ์šฉ์–ด

์ฐธ๊ณ  ๋ฌธํ—Œ

๊ทœ๋ฒ”์  ์ฐธ๊ณ  ๋ฌธํ—Œ

[BIDI]
Manish Goregaokar เคฎเคจเฅ€เคท เค—เฅ‹เคฐเฅ‡เค—เคพเค‚เคตเค•เคฐ; Robin Leroy. ์œ ๋‹ˆ์ฝ”๋“œ ์–‘๋ฐฉํ–ฅ ์•Œ๊ณ ๋ฆฌ์ฆ˜. 2026๋…„ 9์›” 1์ผ. ์œ ๋‹ˆ์ฝ”๋“œ ํ‘œ์ค€ ๋ถ€๋ก #9. URL: https://www.unicode.org/reports/tr9/tr9-52.html
[ENCODING]
Anne van Kesteren. ์ธ์ฝ”๋”ฉ ํ‘œ์ค€. ํ˜„ํ–‰ ํ‘œ์ค€. URL: https://encoding.spec.whatwg.org/
[FILEAPI]
Marijn Kruisselbrink. ํŒŒ์ผ API. URL: https://w3c.github.io/FileAPI/
[HTML]
Anne van Kesteren; ์™ธ. HTML ํ‘œ์ค€. ํ˜„ํ–‰ ํ‘œ์ค€. URL: https://html.spec.whatwg.org/multipage/
[IANA-URI-SCHEMES]
ํ†ตํ•ฉ ์ž์› ์‹๋ณ„์ž (URI) ์Šคํ‚ด. URL: https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra ํ‘œ์ค€. ํ˜„ํ–‰ ํ‘œ์ค€. URL: https://infra.spec.whatwg.org/
[PSL]
๊ณต๊ฐœ ์ ‘๋ฏธ์‚ฌ ๋ชฉ๋ก. URL: https://publicsuffix.org/
[UTS46]
Mark Davis; Markus Scherer. ์œ ๋‹ˆ์ฝ”๋“œ IDNA ํ˜ธํ™˜์„ฑ ์ฒ˜๋ฆฌ. 2026๋…„ 8์›” 31์ผ. ์œ ๋‹ˆ์ฝ”๋“œ ๊ธฐ์ˆ  ํ‘œ์ค€ #46. URL: https://www.unicode.org/reports/tr46/tr46-36.html
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL ํ‘œ์ค€. ํ˜„ํ–‰ ํ‘œ์ค€. URL: https://webidl.spec.whatwg.org/

์„ค๋ช…์  ์ฐธ๊ณ  ๋ฌธํ—Œ

[ECMA-262]
ECMAScript ์–ธ์–ด ๋ช…์„ธ. URL: https://tc39.es/ecma262/multipage/
[IDNFAQ]
๊ตญ์ œํ™” ๋„๋ฉ”์ธ ์ด๋ฆ„(IDN) FAQ. URL: https://unicode.org/faq/idn.html
[RFC1034]
P. Mockapetris. ๋„๋ฉ”์ธ ์ด๋ฆ„ - ๊ฐœ๋… ๋ฐ ๊ธฐ๋Šฅ. 1987๋…„ 11์›”. ์ธํ„ฐ๋„ท ํ‘œ์ค€. URL: https://www.rfc-editor.org/info/rfc1034/
[RFC3986]
T. Berners-Lee; R. Fielding; L. Masinter. ํ†ตํ•ฉ ์ž์› ์‹๋ณ„์ž(URI): ์ผ๋ฐ˜ ๊ตฌ๋ฌธ. 2005๋…„ 1์›”. ์ธํ„ฐ๋„ท ํ‘œ์ค€. URL: https://www.rfc-editor.org/info/rfc3986/
[RFC3987]
M. Duerst; M. Suignard. ๊ตญ์ œํ™” ์ž์› ์‹๋ณ„์ž(IRI). 2005๋…„ 1์›”. ์ œ์•ˆ ํ‘œ์ค€. URL: https://www.rfc-editor.org/info/rfc3987/
[RFC4291]
R. Hinden; S. Deering. IP ๋ฒ„์ „ 6 ์ฃผ์†Œ ์ง€์ • ์•„ํ‚คํ…์ฒ˜. 2006๋…„ 2์›”. ์ดˆ์•ˆ ํ‘œ์ค€. URL: https://www.rfc-editor.org/info/rfc4291/
[RFC5890]
J. Klensin. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ๊ตญ์ œํ™” ๋„๋ฉ”์ธ ์ด๋ฆ„ (IDNA): ์ •์˜ ๋ฐ ๋ฌธ์„œ ํ”„๋ ˆ์ž„์›Œํฌ. 2010๋…„ 8์›”. ์ œ์•ˆ ํ‘œ์ค€. URL: https://www.rfc-editor.org/info/rfc5890/
[RFC5952]
S. Kawamura; M. Kawashima. IPv6 ์ฃผ์†Œ ํ…์ŠคํŠธ ํ‘œํ˜„์— ๋Œ€ํ•œ ๊ถŒ๊ณ . 2010๋…„ 8์›”. ์ œ์•ˆ ํ‘œ์ค€. URL: https://www.rfc-editor.org/info/rfc5952/
[RFC6454]
A. Barth. ์›น ์˜ค๋ฆฌ์ง„ ๊ฐœ๋…. 2011๋…„ 12์›”. ์ œ์•ˆ ํ‘œ์ค€. URL: https://www.rfc-editor.org/info/rfc6454/
[RFC7595]
D. Thaler, ํŽธ์ง‘์ž; T. Hansen; T. Hardie. URI ์Šคํ‚ด์„ ์œ„ํ•œ ์ง€์นจ ๋ฐ ๋“ฑ๋ก ์ ˆ์ฐจ. 2015๋…„ 6์›”. ํ˜„์žฌ ์ตœ์„  ๊ด€ํ–‰. URL: https://www.rfc-editor.org/info/rfc7595/
[RFC791]
J. Postel. ์ธํ„ฐ๋„ท ํ”„๋กœํ† ์ฝœ. 1981๋…„ 9์›”. ์ธํ„ฐ๋„ท ํ‘œ์ค€. URL: https://www.rfc-editor.org/info/rfc791/
[URLPATTERN]
Ben Kelly; Jeremy Roman; ๅฎๆˆธไฟŠๅ“‰ (Shunya Shishido). URL ํŒจํ„ด ํ‘œ์ค€. ํ˜„ํ–‰ ํ‘œ์ค€. URL: https://urlpattern.spec.whatwg.org/
[UTR36]
Mark Davis; Michel Suignard. Unicode ๋ณด์•ˆ ๊ณ ๋ ค ์‚ฌํ•ญ. 2014๋…„ 9์›” 19์ผ. Unicode ๊ธฐ์ˆ  ๋ณด๊ณ ์„œ #36. URL: https://www.unicode.org/reports/tr36/tr36-15.html
[UTS39]
Josh Hadley; Roozbeh Pournader. Unicode ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜. 2026๋…„ 8์›” 27์ผ. Unicode ๊ธฐ์ˆ  ํ‘œ์ค€ #39. URL: https://www.unicode.org/reports/tr39/tr39-34.html

IDL ์ƒ‰์ธ

[Exposed=*,
 LegacyWindowAlias=webkitURL]
interface URL {
  constructor(USVString url, optional USVString base);

  static URL? parse(USVString url, optional USVString base);
  static boolean canParse(USVString url, optional USVString base);

  stringifier attribute USVString href;
  readonly attribute USVString origin;
           attribute USVString protocol;
           attribute USVString username;
           attribute USVString password;
           attribute USVString host;
           attribute USVString hostname;
           attribute USVString port;
           attribute USVString pathname;
           attribute USVString search;
  [SameObject] readonly attribute URLSearchParams searchParams;
           attribute USVString hash;

  USVString toJSON();
};

[Exposed=*]
interface URLSearchParams {
  constructor(optional (sequence<sequence<USVString>> or record<USVString, USVString> or USVString) init = "");

  readonly attribute unsigned long size;

  undefined append(USVString name, USVString value);
  undefined delete(USVString name, optional USVString value);
  USVString? get(USVString name);
  sequence<USVString> getAll(USVString name);
  boolean has(USVString name, optional USVString value);
  undefined set(USVString name, USVString value);

  undefined sort();

  iterable<USVString, USVString>;
  stringifier;
};

โœ”MDN

URL/URL

In all current engines.

Firefox26+Safari14.1+Chrome19+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js10.0.0+
MDN

URL/canParse_static

Firefox115+Safari17+ChromeNone
Opera?EdgeNone
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js20.0.0+
โœ”MDN

URL/hash

In all current engines.

Firefox22+Safari7+Chrome32+
Opera?Edge79+
Edge (Legacy)13+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.0.0+
โœ”MDN

URL/host

In all current engines.

Firefox22+Safari7+Chrome32+
Opera?Edge79+
Edge (Legacy)13+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.0.0+
โœ”MDN

URL/hostname

In all current engines.

Firefox22+Safari10+Chrome32+
Opera?Edge79+
Edge (Legacy)13+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.0.0+
โœ”MDN

URL/href

In all current engines.

Firefox22+Safari10+Chrome32+
Opera?Edge79+
Edge (Legacy)13+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.0.0+
โœ”MDN

URL/origin

In all current engines.

Firefox26+Safari10+Chrome32+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet6.0+Opera Mobile?
Node.js7.0.0+
โœ”MDN

URL/password

In all current engines.

Firefox26+Safari10+Chrome32+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet6.0+Opera Mobile?
Node.js7.0.0+
โœ”MDN

URL/pathname

In all current engines.

Firefox22+Safari10+Chrome32+
Opera?Edge79+
Edge (Legacy)13+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.0.0+
โœ”MDN

URL/port

In all current engines.

Firefox22+Safari10+Chrome32+
Opera?Edge79+
Edge (Legacy)13+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.0.0+
โœ”MDN

URL/protocol

In all current engines.

Firefox22+Safari10+Chrome32+
Opera?Edge79+
Edge (Legacy)13+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.0.0+
โœ”MDN

URL/search

In all current engines.

Firefox22+Safari10+Chrome32+
Opera?Edge79+
Edge (Legacy)13+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.0.0+
โœ”MDN

URL/searchParams

In all current engines.

Firefox29+Safari10.1+Chrome51+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.5.0+
โœ”MDN

URL/toJSON

In all current engines.

Firefox54+Safari11+Chrome71+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.7.0+
โœ”MDN

URL/toString

In all current engines.

Firefox54+Safari7+Chrome19+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet6.0+Opera Mobile?
Node.js7.0.0+
โœ”MDN

URL/username

In all current engines.

Firefox26+Safari10+Chrome32+
Opera?Edge79+
Edge (Legacy)12+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet6.0+Opera Mobile?
Node.js7.0.0+
โœ”MDN

URL

In all current engines.

Firefox19+Safari7+Chrome32+
Opera?Edge79+
Edge (Legacy)12+IE10+
Firefox for Android?iOS Safari?Chrome for Android?Android WebView4.4+Samsung Internet?Opera Mobile?
Node.js10.0.0+
โœ”MDN

URLSearchParams/URLSearchParams

In all current engines.

Firefox29+Safari10.1+Chrome49+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.5.0+

URLSearchParams/entries

In all current engines.

Firefox44+Safari10.1+Chrome49+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.5.0+

URLSearchParams/forEach

In all current engines.

Firefox44+Safari10.1+Chrome49+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.5.0+

URLSearchParams/keys

In all current engines.

Firefox44+Safari10.1+Chrome49+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.5.0+

URLSearchParams/values

In all current engines.

Firefox44+Safari10.1+Chrome49+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.5.0+
โœ”MDN

URLSearchParams/append

In all current engines.

Firefox29+Safari10.1+Chrome49+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.5.0+
โœ”MDN

URLSearchParams/delete

In all current engines.

Firefox29+Safari14+Chrome49+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.5.0+
โœ”MDN

URLSearchParams/get

In all current engines.

Firefox29+Safari10.1+Chrome49+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.5.0+
โœ”MDN

URLSearchParams/getAll

In all current engines.

Firefox29+Safari10.1+Chrome49+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.5.0+
โœ”MDN

URLSearchParams/has

In all current engines.

Firefox29+Safari10.1+Chrome49+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.5.0+
โœ”MDN

URLSearchParams/set

In all current engines.

Firefox29+Safari10.1+Chrome49+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.5.0+
โœ”MDN

URLSearchParams/size

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.0.0+
โœ”MDN

URLSearchParams/sort

In all current engines.

Firefox54+Safari11+Chrome61+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.7.0+
โœ”MDN

URLSearchParams/toString

In all current engines.

Firefox29+Safari10.1+Chrome49+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js7.5.0+
โœ”MDN

URLSearchParams

In all current engines.

Firefox29+Safari10.1+Chrome49+
Opera?Edge79+
Edge (Legacy)17+IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Node.js10.0.0+