MCP๋กœ ์—ฐ๊ฒฐ โ†’

๊ณ„์‚ฐ ์ž…๋ ฅ

๊ณต์‹

๊ด‘๊ณ 

๊ฒฐ๊ณผ

๊ฒฐ๊ณผ
hello%20world%21
์ž…๋ ฅ ๊ธธ์ด (๊ธ€์ž ์ˆ˜) 12
์ถœ๋ ฅ ๊ธธ์ด (๊ธ€์ž ์ˆ˜) 16

URL ์ธ์ฝ”๋”ฉ์ด๋ž€?

URL ์ธ์ฝ”๋”ฉ์€ ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ(percent-encoding)์ด๋ผ๊ณ ๋„ ๋ถˆ๋ฆฌ๋ฉฐ, RFC 3986์—์„œ ์ •์˜ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž„์˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ URI(Uniform Resource Identifier) ์•ˆ์— ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ๊ทœ์น™์ž…๋‹ˆ๋‹ค. ๊ณต๋ฐฑ, ์Šฌ๋ž˜์‹œ(/), ๋ฌผ์Œํ‘œ(?), ์•ฐํผ์ƒŒ๋“œ(&), ๊ทธ๋ฆฌ๊ณ  ASCII๊ฐ€ ์•„๋‹Œ ๋ฌธ์ž ๋“ฑ ๋งŽ์€ ๋ฌธ์ž๋“ค์€ URL ์•ˆ์—์„œ ํŠน๋ณ„ํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ–๊ฑฐ๋‚˜ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ์— ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ์€ ์ด๋Ÿฌํ•œ ๊ฐ ๋ฐ”์ดํŠธ๋ฅผ ํผ์„ผํŠธ ๊ธฐํ˜ธ(%)์™€ ๊ทธ ๋ฐ”์ดํŠธ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋‘ ์ž๋ฆฌ 16์ง„์ˆ˜๋กœ ๋ฐ”๊ฟ” ์ค๋‹ˆ๋‹ค.

๊ณต๋ฐฑ ๋ฌธ์ž๊ฐ€ ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ๋œ ๋ฐ”์ดํŠธ๋กœ ๋งคํ•‘๋˜๋Š” ๋‹ค์ด์–ด๊ทธ๋žจ
URL ์ธ์ฝ”๋”ฉ ์‹œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ฌธ์ž๋Š” %XX ํ˜•์‹์˜ 16์ง„์ˆ˜ ๋ฐ”์ดํŠธ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

๊ณ„์‚ฐ๊ธฐ ์‚ฌ์šฉ๋ฒ•

์ผ๋ฐ˜ ํ…์ŠคํŠธ๋ฅผ URL์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พธ๋ ค๋ฉด ์ธ์ฝ”๋”ฉ(Encode)์„, ํผ์„ผํŠธ ์ธ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด์„ ๋‹ค์‹œ ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํ…์ŠคํŠธ๋กœ ๋˜๋Œ๋ฆฌ๋ ค๋ฉด ๋””์ฝ”๋”ฉ(Decode)์„ ์„ ํƒํ•˜์„ธ์š”. ํ…์ŠคํŠธ๋ฅผ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ๋ถ™์—ฌ๋„ฃ์€ ๋’ค ์‹คํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋Š” ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์˜ ๋ฌธ์ž ๊ธธ์ด๋„ ํ•จ๊ป˜ ๋ณด์—ฌ ์ฃผ๋ฏ€๋กœ, ์ธ์ฝ”๋”ฉ์œผ๋กœ ์ธํ•ด ๋ฌธ์ž์—ด์ด ์–ผ๋งˆ๋‚˜ ๊ธธ์–ด์กŒ๋Š”์ง€ ํ•œ๋ˆˆ์— ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณ€ํ™˜ ์›๋ฆฌ

๋น„์˜ˆ์•ฝ(unreserved) ๋ฌธ์ž ์ง‘ํ•ฉ์€ Aโ€“Z aโ€“z 0โ€“9 - _ . ~ ์ž…๋‹ˆ๋‹ค. ์ด ์ง‘ํ•ฉ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š” ๋ฐ”์ดํŠธ๋Š” ๋ชจ๋‘ ์ธ์ฝ”๋”ฉ๋ฉ๋‹ˆ๋‹ค. ์ธ์ฝ”๋”ฉ ๊ทœ์น™์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

$$\text{Output} = \operatorname{encode}\!\left(\text{Text}\right) = \text{each byte} \to \begin{cases} \text{char}, & \text{if unreserved } (A\text{-}Z,\,a\text{-}z,\,0\text{-}9,\,\text{-}\_.\sim) \\ \text{\%XX}, & \text{otherwise (UTF-8 hex)} \end{cases}$$

์˜ˆ๋ฅผ ๋“ค์–ด ๊ณต๋ฐฑ ๋ฌธ์ž๋Š” ๋ฐ”์ดํŠธ ๊ฐ’์ด 32์ด๊ณ  16์ง„์ˆ˜๋กœ๋Š” 0x20์ด๋ฏ€๋กœ %20์œผ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ํ…์ŠคํŠธ๋Š” ๋จผ์ € UTF-8๋กœ ๋ฐ”์ดํŠธํ™”๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ชจ์ง€๋‚˜ ์•…์„ผํŠธ๊ฐ€ ๋ถ™์€ ๋ฌธ์ž์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ๋ฐ”์ดํŠธ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž๋Š” ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ํ•˜๋‚˜์”ฉ ์ธ์ฝ”๋”ฉ๋ฉ๋‹ˆ๋‹ค. ๋””์ฝ”๋”ฉ์€ ์ด ๊ณผ์ •์„ ๊ฑฐ๊พธ๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ %XX ๋ฌถ์Œ์„ 16์ง„์ˆ˜ ๋ฐ”์ดํŠธ๋กœ ํ•ด์„ํ•˜๊ณ , ๋ชจ์ธ ๋ฐ”์ดํŠธ๋“ค์„ ๋‹ค์‹œ UTF-8๋กœ ์ฝ์–ด ๋“ค์ž…๋‹ˆ๋‹ค.

$$\text{Output} = \operatorname{decode}\!\left(\text{Text}\right) = \text{scan} \to \begin{cases} \text{byte}(XX), & \text{for each } \text{\%XX} \\ \text{space}, & \text{for } + \\ \text{char}, & \text{otherwise} \end{cases}\ \text{as UTF-8}$$
๋ฐ”์ดํŠธ๊ฐ€ ๋‘ ๊ฐœ์˜ 16์ง„์ˆ˜๋กœ ๋‚˜๋‰˜์–ด ํผ์„ผํŠธ ์ฝ”๋“œ๋ฅผ ์ด๋ฃจ๋Š” ๋ชจ์Šต
์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ฐ ๋ฐ”์ดํŠธ๋Š” ํผ์„ผํŠธ ๊ธฐํ˜ธ์™€ ๋‘ ์ž๋ฆฌ 16์ง„์ˆ˜ ๊ฐ’์œผ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค.

์˜ˆ์ œ๋กœ ๋ณด๊ธฐ

hello world!๋ฅผ ์ธ์ฝ”๋”ฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. h-e-l-l-o ๊ฐ™์€ ์•ŒํŒŒ๋ฒณ์€ ๋น„์˜ˆ์•ฝ ๋ฌธ์ž๋ผ์„œ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๊ณต๋ฐฑ์€ %20์ด ๋˜๊ณ , ๋А๋‚Œํ‘œ(๋ฐ”์ดํŠธ 33 = 0x21)๋Š” %21์ด ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฒฐ๊ณผ๋Š” \(\text{hello}\%20\text{world}\%21\)์ด ๋ฉ๋‹ˆ๋‹ค.

์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ

ํ”Œ๋Ÿฌ์Šค ๊ธฐํ˜ธ(+)๋ฅผ ๊ณต๋ฐฑ์œผ๋กœ ์ธ์ฝ”๋”ฉํ•˜๋‚˜์š”? ์ธ์ฝ”๋”ฉํ•  ๋•Œ ๊ณต๋ฐฑ์€ RFC 3986 ๋ฐฉ์‹์— ๋”ฐ๋ผ %20์œผ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ๋””์ฝ”๋”ฉํ•  ๋•Œ๋Š” ํผ ๋ฐ์ดํ„ฐ์™€์˜ ํ˜ธํ™˜์„ ์œ„ํ•ด ๊ทธ๋Œ€๋กœ ์ž…๋ ฅ๋œ +๋ฅผ ๊ณต๋ฐฑ์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ๋ฌธ์ž๋Š” ์™œ ๊ทธ๋Œ€๋กœ ๋‚จ๋‚˜์š”? ์˜๋ฌธ์ž, ์ˆซ์ž, ๊ทธ๋ฆฌ๊ณ  ๋„ค ๊ฐ€์ง€ ๋น„์˜ˆ์•ฝ ๊ธฐํ˜ธ - _ . ~๋Š” RFC 3986์—์„œ ์ธ์ฝ”๋”ฉ์ด ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์œ ๋‹ˆ์ฝ”๋“œ๋„ ์ง€์›ํ•˜๋‚˜์š”? ๋„ค. ํ…์ŠคํŠธ๋Š” UTF-8๋กœ ์ฒ˜๋ฆฌ๋˜๋ฏ€๋กœ ASCII ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ๋ฌธ์ž๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ %XX ๋ฐ”์ดํŠธ๋กœ ์ธ์ฝ”๋”ฉ๋˜๊ณ , ๋‹ค์‹œ ์ •ํ™•ํ•˜๊ฒŒ ๋””์ฝ”๋”ฉ๋ฉ๋‹ˆ๋‹ค.

์ตœ์ข… ์—…๋ฐ์ดํŠธ: