βοΈ λ€μμμ μ μνλ μ κ·μμ΄ λͺ¨λ URL νμμ λμλμ§λ μλ κ²μ μ μν΄μ£ΌμΈμ.
βοΈ ipv4, ipv6 νμμ ip address νμμ μ§μνμ§ μμ΅λλ€.
URL(Uniform Resource Locator) μ μΉ μμ 리μμ€λ₯Ό κ°λ¦¬ν€λ κ³ μ ν μ£Όμμ λλ€.
HTML νμ΄μ§, CSS λ° μ΄λ―Έμ§ 리μμ€ λ± κ·Έ μ΄λ€ κ²μ κ°λ¦¬ν¬ μ μμ΅λλ€.
μ΄μ μ ν μ€νΈ λ΄μμ URL νμμ λ¬Έμμ΄ νμ±μ΄ νμν΄μ URL κ·κ²©μ λν΄ μ°Ύμλ³Έ λ΄μ©μ μ 리νκ² μ΅λλ€.
π RFC λ¬Έμ μ°Έμ‘°
μ΄λ² ν¬μ€νΈμμ μ°Έκ³ ν RFC λ¬Έμλ€μ λ€μκ³Ό κ°μ΅λλ€.
- RFC 952 - https://datatracker.ietf.org/doc/html/rfc952
- RFC 1034 - https://datatracker.ietf.org/doc/html/rfc1034
- RFC 1123 - https://datatracker.ietf.org/doc/html/rfc1123
- RFC 1738 - https://datatracker.ietf.org/doc/html/rfc1738
- RFC 3986 - https://datatracker.ietf.org/doc/html/rfc3986
π URL νμ λ―μ΄λ³΄κΈ°
1οΈβ£ URL ꡬμ±μμ
RFC 1738 chapter 3.3 μ 보면 URL
μ λ€μ νμμΌλ‘ μ μλμ΄μμ΅λλ€.
http://<host>:<port>/<path>?<searchpart>
2οΈβ£ URL κΈΈμ΄
RFC-1123
μ 보면 hostname μ΅λ κΈΈμ΄λ₯Ό 63μ (κΆμ₯μ 255μ)κΉμ§ μ ννλλ‘ κΆμ₯νκ³ μμ΅λλ€.
λν RFC-952
μ λ€λ₯΄κ² hostnameμ 첫 κΈμλ‘ digitμ νμ©ν©λλ€.
Host software MUST handle host names of up to 63 characters and SHOULD handle host names of up to 255 characters.
μ΄λ² ν¬μ€νΈμμλ 63μλ‘ μ ννκ² μ΅λλ€.
3οΈβ£ Host νμ
host νμμ RFC 1034
λ₯Ό μ΄ν΄λ³΄λ©΄ μ μ μμ΅λλ€.
<domain> ::= <subdomain> | " "
<subdomain> ::= <label> | <subdomain> "." <label>
<label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]
<ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
<let-dig-hyp> ::= <let-dig> | "-"
<let-dig> ::= <letter> | <digit>
<letter> ::= A-Z a-z μ€ νλμ λ¬Έμ
<digit> ::= 0-9 μ€ νλμ μ«μ
μ μμ¬ ννμμ νμ΄μ μ€λͺ
ν΄ λ³΄κ² μ΅λλ€.domain
μ subdomain
νΉμ λΉ λ¬Έμμ΄λ‘ μ μλ©λλ€.
κ·Έλ¦¬κ³ subdomainμ νλ μ΄μμ label μ΄ .
μΌλ‘ μ°κ²°λ ννκ° λλ κ²μ΄μ£ .
μ¬κΈ°μ label
μ νλ μ΄μμ μνλ²³μΌλ‘ μμνλ©° -
ꡬλΆμμ μλ¬Έμ(λ, μ)μ μ«μλ‘ κ΅¬μ±λ©λλ€.
μ΄λ labelμ λ§μ§λ§μλ -
ꡬλΆμκ° μ‘΄μ¬νλ©΄ μ λκ² μ΅λλ€.
μ λ΄μ©μ λ°νμΌλ‘ label
μ λν μ κ·μμ λ€μκ³Ό κ°μ΄ μ μν μ μμ΅λλ€.
μ΅λ 63μκΉμ§ κ°λ₯νλλ‘ ν κ²μ μ μνμΈμ.
label: [a-z\d]([a-z\d-]{0,61}[a-z\d])?
labelμ νμ©ν΄μ host
μ κ·μμ μ μνλ©΄ λ€μκ³Ό κ°μ΅λλ€.
host: ([a-z\d]([a-z\d-]{0,61}[a-z\d])?)(\.[a-z\d]([a-z\d-]{0,61}[a-z\d])?)*
4οΈβ£ Port νμ
ν¬νΈλ²νΈλ μλ΅ κ°λ₯νλ©°, μ΄ κ²½μ° HTTP ν¬νΈ λ²νΈμΈ 80λ²μ΄ κΈ°λ³Έ ν λΉλ©λλ€.
port: (:\d*)?
5οΈβ£ pathμ searchpartμ νμ
pathμ searchpartμ λν λ΄μ©μ RFC3986 3.3μμ μμΈν μ΄ν΄λ³Ό μ μμ΅λλ€.
𧩠path νμ μμ보기
path = path-abempty ; begins with "/" or is empty
/ path-absolute ; begins with "/" but not "//"
/ path-noscheme ; begins with a non-colon segment
/ path-rootless ; begins with a segment
/ path-empty ; zero characters
path-abempty = *( "/" segment )
path-absolute = "/" [ segment-nz *( "/" segment ) ]
path-noscheme = segment-nz-nc *( "/" segment )
path-rootless = segment-nz *( "/" segment )
path-empty = 0<pchar>
segment = *pchar
segment-nz = 1*pchar
segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
μ μμ¬ ννμμ ν΅ν΄μ pathλ /
λ‘ κ΅¬λΆλ μΌλ ¨μ segment λμ΄λ‘ μ μν μ μμ΅λλ€.
μΈλΆμ μΌλ‘λ μ λκ²½λ‘, μλκ²½λ‘, scheme μ 무μ λ°λΌ pathμ ꡬμ±λ°©μμ μ½κ°μ μ°¨μ΄κ° μ‘΄μ¬ν©λλ€.
μ΄μ segmentλ₯Ό ꡬμ±νλ pchar
μ μμ¬ ννμμ μ΄ν΄λ΄
μλ€.
pchar : unreserved / pct-encoded / sub-delims / ":" / "@"
// pchar ꡬμ±μμλ€. RFC3986 Appendixλ₯Ό μ°Έκ³ ν΄λ³΄μΈμ.
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded = "%" HEXDIG HEXDIG
sub-delims = "$" / "&" / "+" / "," / ";" / "="
/ "!" / "'" / "(" / ")" / "*"
sub-delims
μμ !, (, ), *, '
λ€μ― λ¬Έμλ μ€μ λ‘ νμνλ μ¬μ©μ²λ λ°νμ§μ§ μμμ§λ§, μ격ν λ°©μμΌλ‘ μ ννλ €λ©΄ μ΄ λ¬Έμλ€κΉμ§ μ ν¨ν λ¬Έμλ‘ ν¬ν¨ν΄μ€μΌ ν©λλ€.
𧩠search part (query & fragment) νμ μμ보기
search part
λ query parameterμ anchorλ‘ κ΅¬μ±λ©λλ€.
parameter λ ?
λ‘ μμλλ©° key=value
νμμ μ§μ 리μ€νΈλ‘ ꡬμ±λ©λλ€.
// search parameter μμ
?key1=value&key2=value
anchorλ 리μμ€μ νΉμ λΆλΆμ κ°λ¦¬ν€λ μΌμ’
μ λΆλ§ν¬μ
λλ€.
ννfragement identifier
λΌλ μ©μ΄λ‘ μλ €μ Έ μμ΅λλ€.
RFC 3986μ section 3.4, 3.5 λ₯Ό μ΄ν΄λ³΄λ©΄, λ URI μ»΄ν¬λνΈκ° μꡬνλ νμμ λ€μκ³Ό κ°μ΅λλ€.
μμ pathμ λμΌν pchar
νμμ 곡μ νλ€μ!
query = *(pchar / "/" / "?")
fragment = *(pchar / "/" / "?")
𧩠path, query μ κ·μ ꡬννκΈ°
μμμ μ 리ν λ΄μ©μ λ°νμΌλ‘ path
μ query
μ λμνλ μ κ·μμ μμ±ν©λλ€.
path: ([a-zA-Z0-9@;:%.,_+~#=/?&-]*)
query: λμΌν©λλ€.
μ κ·μμ λ¬Έμ ν΄λμ€
λ₯Ό μ΄μ©ν΄μ κ°μννλ©΄ λ€μκ³Ό κ°μ΄ ννν μ μμ΅λλ€.
path: ([\w@;:%.,+~#=/?&-]*)
query: λμΌν©λλ€.
π μ’ ν©νλ©΄
(http|https):\/\/([a-z\d]([a-z\d-]{0,61}[a-z\d])?)(\.[a-z\d]([a-z\d-]{0,61}[a-z\d])?)*(:\d*)?\b([\w@;:%.,+~#=/?&-]*)
π URL ν΄λμ€ μ¬μ©νλ λ°©λ²
νΉμ λ¬Έμμ΄μ΄ μ ν¨ν μ£Όμ νμμΈμ§ νλ¨νλ μμ£Ό κ°λ¨ν λ°©λ²μ΄ μλλ°, λ°λ‘ URL
ν΄λμ€λ₯Ό μ΄μ©νλ κ²μ
λλ€.
λ€λ§ URL
μμ±μκ° safari 14.1λΆν° μ§μνκΈ° λλ¬Έμ μ΄μ λ²μ κΉμ§ λμμ΄ νμνλ€λ©΄ core-jsλ₯Ό ν΅ν polyfill μ£Όμ
μ΄ νμν©λλ€.
function checkUrl(url) {
try {
new URL(url);
} catch (error) {
return false;
}
return true;
}
λ€λ§ μ μ κ²½μ°μλ νΉμ λ¬Έμλ‘ λ¬Έμμ΄μ΄ ꡬλΆλμ§ μμ μν©μμ(ex. 곡백문μ) URLμ μλ³ν΄μΌ νκΈ° λλ¬Έμ
μ΄ λ°©λ²μ μ¬μ©ν μ μμ΄μ μ κ·μμ μ΄μ©νλ λ°©μμΌλ‘ μ κ·Όνμ΅λλ€.
π μ°Έκ³ μλ£
URL: URL() constructor - Web APIs | MDN
encodeURIComponent() - JavaScript | MDN
What is a URL? - Learn web development | MDN
What's valid and what's not in a URI query?
Regular expression to match DNS hostname or IP Address?
Regular Expression for Checking if a String Is a Valid URL | Baeldung on Computer Science
'π¨βπ» web.dev > fe' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
TRIPLE μΉ μΌμ ν νΈλ¬λΈ μν νκ³ λ‘ (0) | 2024.03.11 |
---|---|
Server Sent Events μ μ©ν΄λ³΄κΈ° (0) | 2024.03.10 |
Chrome κ°λ°μλꡬλ₯Ό μ΄μ©ν΄μ μμΉμ 보 μ€μ νκΈ° (0) | 2024.03.01 |
storybook middleware proxy λ‘ CORS μ°ννκΈ° (0) | 2024.03.01 |
μ κ·μμΌλ‘ camel-case νμ±νκΈ° (1) | 2024.02.24 |
π¬ λκΈ