์น์ฌ์ดํธ๊ฐ ์ ์ด๋ฆด ๋: HTTP 403ยท404ยท429ยท500ยท503์ ๊ตฌ๋ถํ๋ ์ค์ต ๊ฐ์ด๋
์น์ฌ์ดํธ ์ด์ ยท ์ค๋ฅ ์ง๋จ ยท ๋ก์ปฌ ์ค์ต
๊ฐ์ โ์ ์ ๋ถ๊ฐโ๋ผ๋ ์ ๊ทผ ์ฐจ๋จ, ์๋ ์ฃผ์, ์์ฒญ ์ ํ, ํ๋ก๊ทธ๋จ ์ค๋ฅ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ๋ค๋ฆ ๋๋ค. ์ค์ ์ ๋ฐ๊พธ๊ธฐ ์ ์ ์๋ต์ ์ฝ๋ ์์๋ฅผ ์ตํ ๋ณด์ธ์.
์์ฑยท์ค์ต ๊ฒ์ฆ: AI ๋ณด์กฐ ์์ฑ ๋ฐ ๋ก์ปฌ ์คํ ํ์ธ ยท 2026๋
10์ 5์ผ
๋์: ์น์ฌ์ดํธ๋ฅผ ์ง์ ์ด์ํ๋ ์ด๋ณด์ ยท ์ค๋น๋ฌผ: Windows ๋ช
๋ น ํ๋กฌํํธ, ๋ก์ปฌ ์ค์ต์ฉ Python 3
์ฌ์ดํธ๊ฐ ๋๋ฆฌ๊ฑฐ๋ ๊ธ์ด ์ด๋ฆฌ์ง ์์ผ๋ฉด ์๋ฒ ์ฉ๋๋ถํฐ ๋๋ฆฌ๊ณ ์ถ์ ์๊ฐ์ด ๋ญ๋๋ค. ํ์ง๋ง ์๋ฒ๊ฐ ๋ฉ์ฉกํด๋ ๋ณด์ ์๋น์ค๊ฐ ์์ฒญ์ ๋ง์ ์ ์๊ณ , ํน์ ์ฃผ์๋ง ์๋ชป ์ฐ๊ฒฐ๋ผ ์์ ์๋ ์์ต๋๋ค. ์์ธ์ด ํ์ธ๋์ง ์์ ์ํ์์ ์บ์์ ๋ฐฉํ๋ฒฝ์ ๋์์ ๋ฐ๊พธ๋ฉด ํ๋ฉด์ด ์ ๊น ์ ์์ผ๋ก ๋ณด์ฌ๋ ๋ฌด์์ด ๋ฌธ์ ์๋์ง ์๊ธฐ ์ด๋ ต์ต๋๋ค.
์ด ๊ธ์ ์ํ ์ฝ๋ ์๊ธฐ๋ณด๋ค ํ์ธ ์์์ ์ง์คํฉ๋๋ค. ๋จผ์ ๋ธ๋ผ์ฐ์ ์ ๋ช ๋ น์ค์์ ๊ฐ์ ์ฃผ์์ ์๋ต์ ๋น๊ตํ๊ณ , ๊ทธ๋ค์ ์์ ์ ์ปดํจํฐ์์ ์ค๋ฅ ์๋ต์ ๋ง๋ค์ด ๋ด ๋๋ค. ์ค์ต์ ์ด์ ์ฌ์ดํธ์ ์ค์ ์ ๋ฐ๊พธ์ง ์๊ณ ์งํํฉ๋๋ค. ๊ธ์ ํฌํจ๋ ๊ฒฐ๊ณผ๋ ์๋ ์์ ์๋ฒ๋ฅผ ๊ฒฉ๋ฆฌ๋ ๋ก์ปฌ ํ๊ฒฝ์์ ์คํํด ํ์ธํ ๊ฒ์ด๋ฉฐ, ํน์ ์๋น์ค์ ์ฅ์ ๋ฅผ ๊ฒฝํํ๋ค๊ณ ๊ฐ์ ํ ์ฌ๋ก๋ ์๋๋๋ค.
- ์๋ต์ด ์ค๋ ์์น๋ถํฐ ํ์ธํ๊ธฐ
- ์์ฃผ ๋ง๋๋ ์ํ ์ฝ๋
- Windows์ ๋ธ๋ผ์ฐ์ ์์ ํ์ธํ๊ธฐ
- Python์ผ๋ก ์ค๋ฅ ์๋ต ์ฌํํ๊ธฐ
- ์ค์ ์ค์ต ๊ฒฐ๊ณผ์ ํด์
- ์ด์ ์ฌ์ดํธ์ ์ ๊ฒ ์์
- ์์ฃผ ๋ฌป๋ ์ง๋ฌธ
- ์ฐธ๊ณ ์๋ฃ
1. ์ค๋ฅ ํ๋ฉด์ ์ด๋์์ ๋ง๋ค์ด์ก์๊น์?
์ฌ์ฉ์๋ ๋ธ๋ผ์ฐ์ ์์ ์ฃผ์ ํ๋๋ฅผ ์ด์ง๋ง ์์ฒญ์ ์ฌ๋ฌ ๋จ๊ณ๋ฅผ ๊ฑฐ์นฉ๋๋ค. CDN์ด๋ ์ญ๋ฐฉํฅ ํ๋ก์๋ฅผ ์ฐ๋ ์ฌ์ดํธ๋ผ๋ฉด ์์ฒญ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์ฐฉํ๊ธฐ ์ ์ ์๋ต์ด ๋๋ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ํ๋ฉด์ ์ค๋ฅ๊ฐ ๋ณด์ธ๋ค๋ ์ด์ ๋ง์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๊ณ ์ฅ ๋ฌ๋ค๊ณ ๊ฒฐ๋ก ๋ด๋ฆด ์ ์์ต๋๋ค.
์ง์ ์ ์ํ ์์ฒญ ํ๋ฆ๋์ ๋๋ค. ์ค๊ฐ ์๋น์ค๊ฐ ์๋ตํ๋ฉด ์๋ณธ ์๋ฒ์ ๊ฐ์ ์์ฒญ์ ๊ธฐ๋ก์ด ์์ ์ ์์ต๋๋ค.์๋ต์ ์ฝ์ ๋๋ ์ธ ๊ฐ์ง๋ฅผ ๋ฌถ์ด์ ๋ด ๋๋ค. ์ํ ์ฝ๋๋ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ์ ๋ถ๋ฅ, ํค๋๋ ์ด๋ ์ฃผ์์ ์ฌ์๋ ๊ฐ๊ฒฉ ๊ฐ์ ๋ถ๊ฐ ์ ๋ณด, ๋ณธ๋ฌธ์ ํ๋ฉด์ด๋ ๋ฐ์ดํฐ์ ๋๋ค. ๋ณธ๋ฌธ์ โ์คํจโ๋ผ๋ ๋จ์ด์ ์ค์ HTTP ์ํ ์ฝ๋๊ฐ ์๋ก ๋ค๋ฅผ ์๋ ์์ผ๋ฏ๋ก ๋ณธ๋ฌธ๋ง ๋ณด๊ณ ํ๋จํ์ง ๋ง์ธ์.
์๋ณธ ์๋ฒ ๋ก๊ทธ์ ์์ฒญ์ด ๋ณด์ด์ง ์์ผ๋ฉด ๋จผ์ ์ค๊ฐ ์๋น์ค์ ๋ณด์ ์ด๋ฒคํธ์ ๋ผ์ฐํ ์ ํ์ธํฉ๋๋ค. ๋ก๊ทธ์ ๋จ์ ์๋ค๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ๋ก๊ทธ๋ฅผ ์ด์ด์ ํ์ธํฉ๋๋ค. ๋จ, ๋ก๊ทธ ์์ง ์ง์ฐ์ด๋ ๊ธฐ๋ก ๋์ ์ ์ธ๋ ์์ ์ ์์ผ๋ฏ๋ก ๋ก๊ทธ๊ฐ ์๋ค๋ ์ฌ์ค ํ๋๋ง์ผ๋ก ์ฐจ๋จ ์์น๋ฅผ ํ์ ํ์ง๋ ์์ต๋๋ค.
2. ์์ฃผ ๋ง๋๋ ์ํ ์ฝ๋์ ์ฒซ ํ์ธ ํญ๋ชฉ
HTTP ์ํ ์ฝ๋๋ ์์๋ฆฌ๋ก ํฐ ๋ฒ์ฃผ๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. 2xx๋ ์ฑ๊ณต, 3xx๋ ์ด๋ยท์บ์ ๊ด๋ จ ์๋ต, 4xx๋ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋ ๊ฒฝ์ฐ, 5xx๋ ์๋ฒ ์ธก ์คํจ ๋ฒ์ฃผ์ ๋๋ค. ๋ฒ์ฃผ๋ ์ ๊ฒ ๋ฐฉํฅ์ ์ขํ๋ ์ถ๋ฐ์ ์ด๋ฉฐ, 4xx๋ผ๊ณ ํด์ ์ฌ์ฉ์ ์ค์๋ผ๋ ๋ป์ ์๋๋๋ค. ์๋ ์๋ฏธ๋ HTTP ํ์ค์ ์ํ ์ฝ๋ ์ ์๋ฅผ ๋ฐํ์ผ๋ก ์ ๋ฆฌํ์ต๋๋ค.
| ์ฝ๋ | ์๋ฏธ | ์ฒซ ํ์ธ ํญ๋ชฉ |
|---|---|---|
| 200 | ์์ฒญ ์ฑ๊ณต | ๋ณธ๋ฌธ๋ ์๋ํ ๋ด์ฉ์ธ์ง ํ์ธ |
| 302 | ์์๋ก ๋ค๋ฅธ ์ฃผ์ ์๋ด | Location๊ณผ ์ต์ข
๋์ฐฉ ์ฃผ์ |
| 403 | ์์ฒญ ์ดํ ๊ฑฐ๋ถ | ๊ถํยท์ ๊ทผ ์ ์ฑ ยท๋ณด์ ์ด๋ฒคํธ |
| 404 | ์์ฒญํ ๋ฆฌ์์ค๋ฅผ ์ฐพ์ง ๋ชปํจ | ์ฃผ์ยท๊ฒ์๊ธ ์กด์ฌ ์ฌ๋ถยท๋ผ์ฐํ |
| 429 | ์์ฒญ ํ์ ์ ํ | ํธ์ถ ์ฃผ๊ธฐยท์ฌ์๋ ์ ์ฑ ยท์ ํ ๋จ์ |
| 500 | ์ฒ๋ฆฌ๋ฅผ ๋ง๋ ์์ํ์ง ๋ชปํ ๋ด๋ถ ์ํฉ | ํด๋น ์๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ค๋ฅ ๋ก๊ทธ |
| 503 | ์ผ์์ ์ผ๋ก ์์ฒญ ์ฒ๋ฆฌ ๋ถ๊ฐ | ์ ์ง๋ณด์ยท๊ณผ๋ถํยท์ฐ๊ฒฐ ๊ฐ๋ฅํ ์์กด ์๋น์ค |
403๊ณผ 404์ ์ฝ๋๋ฅผ ๋ณด๋ ๊ฒ๋ง์ผ๋ก ์ด๋ ์ค์ ์ ๋ฐ๊ฟ์ง ๊ฒฐ์ ํ ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๊ฐ์ ๊ฒ์๊ธ์ด ์ผ๋ฐ ๋ธ๋ผ์ฐ์ ์์๋ ์ด๋ฆฌ๊ณ ๋ช ๋ น์ค์์๋ ๋งํ ์ ์์ต๋๋ค. ์ฃผ์๋ ๊ฐ์๋ ์ฟ ํค, ์์ฒญ ํค๋, ์ ์ ์์น๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋์ ์ฐจ์ด๋ฅผ ์ ์ด ๋๋ฉด ์์ธ ํ๋ณด๋ฅผ ์ขํ ์ ์์ต๋๋ค.
429์ ์๋ฏธ๋ RFC 6585์ ๋ณ๋ ์ ์๋ฅผ ์ฐธ๊ณ ํ ์ ์์ต๋๋ค. ์ ํ์ ๋์์ด IP์ธ์ง ๊ณ์ ์ธ์ง, ๋ชจ๋ ์ฃผ์์ธ์ง ํน์ API์ธ์ง๋ ์๋น์ค๊ฐ ์ ํฉ๋๋ค. ์ฝ๋๋ง์ผ๋ก ์ ํ ๋ฒ์๋ฅผ ์ถ์ธกํ๊ฑฐ๋ IP๋ฅผ ๋ฐ๊ฟ ์ฐํํ๊ธฐ๋ณด๋ค ์ค์ ์ ์ฉ ๊ท์น๊ณผ ์ ์ ํธ์ถ๋์ ๋์กฐํด์ผ ํฉ๋๋ค.
3. Windows์์ ์๋ต ํค๋๋ง ํ์ธํ๊ธฐ
Windows ๋ช ๋ น ํ๋กฌํํธ ๋๋ PowerShell์์ ๋ค์ ๋ช ๋ น์ ์คํํฉ๋๋ค. ๋ช ๋ น์ ์น์ฌ์ดํธ ์ฝ๋์ ์ฝ์ ํ๋ ๊ฒ์ด ์๋๋ผ ์์ ์ ์ปดํจํฐ์์ ์ง๋จํ ๋ ์ฌ์ฉํฉ๋๋ค. ๋ก์ปฌ ์๋ฒ๋ฅผ ์์ง ์คํํ์ง ์์๋ค๋ฉด ์๋ ๋ช ๋ น์ ์ฐ๊ฒฐ ์คํจ๋ก ๋๋ฉ๋๋ค. ์๋ฒ ์คํ ๋ฐฉ๋ฒ์ ๋ค์ ์ ์ ์์ต๋๋ค.
curl.exe -sS -D - -o NUL "http://127.0.0.1:8765/ok"
-sS๋ ์งํ ํ์๋ฅผ ์ค์ด๋ฉด์ ์ฐ๊ฒฐ ์คํจ ๋ฉ์์ง๋ ๋ณด์ฌ ์ค๋๋ค. -D -๋ ์๋ต ํค๋๋ฅผ ํฐ๋ฏธ๋์ ์ถ๋ ฅํ๊ณ , -o NUL์ ๋ณธ๋ฌธ์ ๋ฒ๋ฆฝ๋๋ค. Linux์ macOS์์๋ curl๊ณผ /dev/null์ ์ฌ์ฉํฉ๋๋ค. ์ด ๋ช
๋ น์ GET ์์ฒญ์ด๋ฉฐ, -I๋ก ๋ง๋๋ HEAD ์์ฒญ๊ณผ๋ ๋ค๋ฆ
๋๋ค. ์๋ฒ๊ฐ GET๊ณผ HEAD๋ฅผ ๋ค๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ฉด ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค.
์ค์ ์ฌ์ดํธ๋ฅผ ํ์ธํ ๋๋ ๋ก์ปฌ ์ฃผ์ ๋์ ๋ณธ์ธ์ด ์ด์ํ๋ ์ ์ URL์ ๋ฃ์ต๋๋ค. ๋ช ๋ฒ์ ๋น๊ต ์์ฒญ์ด๋ฉด ์ถฉ๋ถํฉ๋๋ค. ์ฅ์ ํ์ธ์ ์ํด ๋ฐ๋ณต ํธ์ถ ๋ฃจํ๋ฅผ ๋ง๋ค๋ฉด ๊ธฐ์กด ๋ถํ์ ์ง๋จ ์์ฒญ์ด ์์ฌ ๊ธฐ๋ก์ด ๋ ๋ณต์กํด์ง๋๋ค. ์ธ์ ์ฟ ํค๋ ์ธ์ฆ ํ ํฐ์ ๊ฒฐ๊ณผ์ ํจ๊ป ๊ณต๊ฐํ์ง ์๋ ๊ฒ๋ ์ค์ํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ์์๋ Network์ ๋ฌธ์ ์์ฒญ์ ์ ํํฉ๋๋ค
Chrome์์ F12๋ฅผ ๋๋ฌ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ด๊ณ Network ํญ์ผ๋ก ์ด๋ํ ๋ค์ ํ์ด์ง๋ฅผ ๋ค์ ์ฝ๋๋ค. ๋ฌธ์ ์์ฒญ์ ์ ํํด Status Code์ Response Headers๋ฅผ ํ์ธํ์ธ์. ์ด๋ฏธ์ง๋ ๊ด๊ณ ์์ฒญ์ ์ค๋ฅ๊ฐ ํ์ด์ง ๋ณธ๋ฌธ ์ค๋ฅ์ฒ๋ผ ๋ณด์ผ ์ ์์ผ๋ฏ๋ก ์์ฒญ ์ฃผ์์ ์ ํ์ ํจ๊ป ํ์ธํฉ๋๋ค. ์ด๋ ๊ณผ์ ์ ๋ณด๊ณ ์ถ๋ค๋ฉด Preserve log๋ฅผ ์ผญ๋๋ค.
๋ฉ์ธ ๋ฌธ์๋ 200์ธ๋ฐ ์ฌ์ง ํ ์ฅ๋ง 404๋ผ๋ฉด ์ ์ฒด ์๋ฒ ์ฅ์ ๋ก ์ฒ๋ฆฌํ ์ด์ ๊ฐ ์์ต๋๋ค. ๋ฐ๋๋ก ํ๋ฉด์ ์ด๋ ค๋ ๋ฐ์ดํฐ ์กฐํ API๊ฐ 500์ด๋ฉด ์ผ๋ถ ๊ธฐ๋ฅ์ด ์คํจํ ์ ์์ต๋๋ค. ์ ์ ํ์ด์ง์ ๋ฌธ์ ๊ฐ ์๊ธด ๊ธฐ๋ฅ์ ์์ฒญ์ ๋น๊ตํ๋ฉด ํ์ธํด์ผ ํ ๋ฒ์๋ฅผ ์๊ฒ ์ ์งํ ์ ์์ต๋๋ค.
4. ์์ ์ ์ปดํจํฐ์์ ์ค๋ฅ ์๋ต 7๊ฐ์ง ๋ง๋ค๊ธฐ
๋น ํด๋์ http_status_demo.py ํ์ผ์ ๋ง๋ค๊ณ ์๋ ์ฝ๋๋ฅผ ์ ์ฅํฉ๋๋ค. ์ถ๊ฐ ํจํค์ง ์์ด Python ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ์ฌ์ฉํฉ๋๋ค. ์๋ฒ๋ 127.0.0.1์๋ง ์ฐ๊ฒฐํด ์ธ๋ถ ๊ณต๊ฐ๋ฅผ ์๋ํ์ง ์์ต๋๋ค. ํ์ต์ฉ ์์ ์ด๋ฏ๋ก ์ด์ ์๋ฒ๋ก ๋ฐฐํฌํ์ง ๋ง์ธ์.
from http.server import BaseHTTPRequestHandler, HTTPServer
from urllib.parse import urlsplit
class DemoHandler(BaseHTTPRequestHandler):
def do_GET(self):
path = urlsplit(self.path).path
routes = {
'/ok': (200, '์ ์ ์๋ต', {}),
'/missing': (404, '์์ฒญํ ํ์ด์ง๊ฐ ์์ต๋๋ค', {}),
'/forbidden': (403, '์ ๊ทผ์ด ๊ฑฐ๋ถ๋์์ต๋๋ค', {}),
'/limited': (429, '์์ฒญ ํ์ ์ ํ ์์', {'Retry-After': '30'}),
'/error': (500, '๋ด๋ถ ์ค๋ฅ ์์', {}),
'/busy': (503, '์ผ์์ ์ด์ฉ ๋ถ๊ฐ ์์', {'Retry-After': '60'}),
'/redirect': (302, '๋ค๋ฅธ ์ฃผ์๋ก ์ด๋ํฉ๋๋ค', {'Location': '/ok'}),
}
status, message, headers = routes.get(
path, (404, '๋ฑ๋กํ์ง ์์ ๊ฒฝ๋ก์
๋๋ค', {})
)
body = (message + '\n').encode('utf-8')
self.send_response(status)
self.send_header('Content-Type', 'text/plain; charset=utf-8')
self.send_header('Content-Length', str(len(body)))
self.send_header('Cache-Control', 'no-store')
for name, value in headers.items():
self.send_header(name, value)
self.end_headers()
self.wfile.write(body)
def log_message(self, format, *args):
pass
if __name__ == '__main__':
print('์ค์ต ์๋ฒ: http://127.0.0.1:8765/ok')
print('์ข
๋ฃํ๋ ค๋ฉด Ctrl+C๋ฅผ ๋๋ฅด์ธ์.')
server = HTTPServer(('127.0.0.1', 8765), DemoHandler)
try:
server.serve_forever()
except KeyboardInterrupt:
pass
finally:
server.server_close()
๋ช
๋ น ํ๋กฌํํธ์์ ํ์ผ์ด ์๋ ํด๋๋ก ์ด๋ํ ๋ค ์คํํฉ๋๋ค. Windows Python Launcher๊ฐ ์๋ค๋ฉด ์ค์น ํ๊ฒฝ์ ๋ง๋ python ๋ช
๋ น์ ์ฌ์ฉํ์ธ์. ์คํ ์ฐฝ์ ๊ทธ๋๋ก ๋๊ณ ๋ณ๋ ํฐ๋ฏธ๋์์ curl ๋ช
๋ น์ ์
๋ ฅํฉ๋๋ค.
py -3 http_status_demo.py
# ๋ค๋ฅธ ํฐ๋ฏธ๋์์ ์คํ
curl.exe -sS -D - -o NUL "http://127.0.0.1:8765/limited"
curl.exe -sS -D - -o NUL "http://127.0.0.1:8765/busy"
์ค์ ๋ก ๋ถ์ฌ ๋ฃ์ ๋ # ๋ค๋ฅธ ํฐ๋ฏธ๋์์ ์คํ์ ์ค๋ช
์ด๋ฏ๋ก Windows ๋ช
๋ น ํ๋กฌํํธ์ ์
๋ ฅํ์ง ์์๋ ๋ฉ๋๋ค. ์๋ฒ๋ฅผ ์ข
๋ฃํ๋ ค๋ฉด ์คํ ์ฐฝ์์ Ctrl+C๋ฅผ ๋๋ฆ
๋๋ค. ์ด๋ฏธ ์ฌ์ฉ ์ค์ธ ํฌํธ๋ผ๋ ๋ฉ์์ง๊ฐ ๋์ค๋ฉด ๊ธฐ์กด ์ค์ต ์๋ฒ๊ฐ ๋จ์ ์๋์ง ํ์ธํ์ธ์. ํ์ํ ๊ฒฝ์ฐ ์ฝ๋์ 8765์ ํ์ธ ๋ช
๋ น์ ํฌํธ ๋ฒํธ๋ฅผ ๊ฐ์ ๊ฐ์ผ๋ก ๋ฐ๊ฟ๋๋ค.
์ด ์๋ฒ๋ ์์ฒญ๋์ ์ธก์ ํด์ ์ ํํ๋ ํ๋ก๊ทธ๋จ์ด ์๋๋๋ค. /limited์ ์ ๊ทผํ๋ฉด ํญ์ 429๋ฅผ ๋ณด๋ด๋๋ก ๋ง๋ ๊ต์ก์ฉ ์์ ์
๋๋ค. /error๋ ์์ธ๋ฅผ ๋ฐ์์ํค๋ ๋์ 500 ์๋ต์ ์ง์ ๋ณด๋
๋๋ค. ์์ธ ์ฌํ๊ณผ ์๋ต ํ์ ์ฌํ์ ๋ค๋ฅด๋ค๋ ์ ์ ๊ตฌ๋ถํด์ผ ํฉ๋๋ค.
5. ์ค์ ์ค์ต ๊ฒฐ๊ณผ: ์ฃผ์๊ฐ ๋ฐ๋๋ฉด ๋ฌด์์ด ๋ฌ๋ผ์ง๊น?
์์ ์ฒ๋ฆฌ๊ธฐ๋ฅผ ๋ก์ปฌ HTTP ์๋ฒ๋ก ์คํํ๊ณ ์๋ ์ผ๊ณฑ ์ฃผ์๋ฅผ GET์ผ๋ก ํธ์ถํ์ต๋๋ค. ๋ฆฌ๋๋ ์
์ ์๋์ผ๋ก ๋ฐ๋ผ๊ฐ์ง ์๋ ํด๋ผ์ด์ธํธ๋ก ์ํ ์ฝ๋์ ํค๋๋ฅผ ํ์ธํ์ต๋๋ค. ๋ณ๋ ํ์ธ์์๋ /redirect๋ฅผ ๋ฐ๋ผ๊ฐ ์ต์ข
์๋ต์ด 200์ธ ๊ฒ๋ ๊ฒ์ฆํ์ต๋๋ค. ๋ณธ๋ฌธ ๋ฐ์ดํธ ์์ Content-Length์ ์ผ์น๋ ํ์ธํ์ต๋๋ค.
| ์ค์ต ๊ฒฝ๋ก | ํ์ธํ ์ฝ๋ | ์ถ๊ฐ ํ์ธ |
|---|---|---|
/ok | 200 | ์ ์ ๋ฉ์์ง |
/missing | 404 | ์๋ ํ์ด์ง ์๋ด |
/forbidden | 403 | ๊ฑฐ๋ถ ๋ฉ์์ง |
/limited | 429 | Retry-After: 30 |
/error | 500 | ๋ด๋ถ ์ค๋ฅ ์์ ๋ฉ์์ง |
/busy | 503 | Retry-After: 60 |
/redirect | 302 | Location: /ok ยท ๋ฐ๋ผ๊ฐ๋ฉด 200 |
์ค์ต A: ์ด๋์ ๋ฐ๋ผ๊ฐ๊ธฐ ์ ๊ณผ ํ ๋น๊ต
curl.exe -sS -D - -o NUL "http://127.0.0.1:8765/redirect"
curl.exe -sS -L -D - -o NUL "http://127.0.0.1:8765/redirect"์ฒซ ๋ช
๋ น์ 302์ ์ด๋ ์ฃผ์๋ฅผ ๋ณด์ฌ ์ค๋๋ค. ๋ ๋ฒ์งธ ๋ช
๋ น์ -L ๋๋ฌธ์ ์ด๋์ ๋ฐ๋ผ๊ฐ๋ฉฐ, ์ด ์์ ์์๋ 302์ ์ต์ข
200 ์๋ต ํค๋๋ฅผ ์ฐจ๋ก๋ก ๋ณผ ์ ์์ต๋๋ค. ์ต์ข
๊ฒฐ๊ณผ๋ง ์ ์ฅํ๋ ๋ชจ๋ํฐ๋ง์์๋ ์ค๊ฐ ์ด๋์ด ์ ์ ๋ณด์ผ ์ ์์ต๋๋ค. ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋ํ ๋ค 200์ด ๋์จ ์ํฉ์ ๊ฒ์๊ธ ์กฐํ ์ฑ๊ณต์ผ๋ก ์คํดํ์ง ์๋๋ก ์ต์ข
์ฃผ์์ ๋ณธ๋ฌธ๊น์ง ํ์ธํด์ผ ํฉ๋๋ค.
์ค์ต B: ์ฌ์๋ ์๋ด๋ฅผ ์ฝ์ด ๋ณด๊ธฐ
/limited์๋ 30, /busy์๋ 60์ด ํ์๋ฉ๋๋ค. ์ด ์์ ์ ์ซ์๋ ๊ฐ๊ฐ ๊ธฐ๋ค๋ฆด ์ด๋ฅผ ๋ปํฉ๋๋ค. ์ค์ ์๋น์ค์ Retry-After๋ ์ด ๋๋ HTTP ๋ ์ง ํํ์ผ ์ ์์ผ๋ฉฐ, ํค๋๊ฐ ์๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค. Retry-After ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด ํ์์ ํ์ธํ์ธ์.
์ค์ํ ์ฐจ์ด๋ curl์ด ์ด ํค๋๋ฅผ ์ถ๋ ฅํ๋ค๊ณ ํด์ ํ์ฌ ๋ช ๋ น์ด ์๋์ผ๋ก ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋ ์ฌ์๋ํ์ง๋ ์๋๋ค๋ ์ ์ ๋๋ค. ๋ฐ๋ณต ์์ ํ๋ก๊ทธ๋จ์๋ ๋ณ๋์ ์ฌ์๋ ํ์์ ๋๊ธฐ ์ ์ฑ ์ด ํ์ํฉ๋๋ค. ์์ฒญ ์ ํ์์ ์ฆ์ ์ฌ์๋ํ๋ฉด ์ ํ์ด ๊ณ์๋ ์ ์๊ณ , ์ํ ๋ณ๊ฒฝ ์์ฒญ์ ๋ฌด์กฐ๊ฑด ์ฌ์๋ํ๋ฉด ์ค๋ณต ์์ ์ด ์๊ธธ ์๋ ์์ต๋๋ค. ์๋ต ์ฝ๋์ ์์ฒญ์ ์ฑ๊ฒฉ์ ํจ๊ป ๊ณ ๋ คํ์ธ์.
6. ์ด์ ์ฌ์ดํธ์์๋ ํ ๋ฒ์ ํ๋์ฉ ํ์ธํฉ๋๋ค
์ค์ต์ด ๋๋ฌ๋ค๋ฉด ์ค์ ์ฌ์ดํธ์์๋ ์ ์ ์ฃผ์ ํ๋์ ๋ฌธ์ ์ฃผ์ ํ๋๋ฅผ ๊ณจ๋ผ ๋น๊ตํฉ๋๋ค. ๊ฐ์ ์๊ฐ, ๊ฐ์ ์ ์ ํ๊ฒฝ์์ ํ์ธํ๋ฉด ์ฐจ์ด๋ฅผ ํด์ํ๊ธฐ ์ฝ์ต๋๋ค. ์ฌ์ง ์ค๋ฅ๋ผ๋ฉด ์ด๋ฏธ์ง URL, ๋๊ธ ์ค๋ฅ๋ผ๋ฉด ๋๊ธ ์์ฒญ์ ์ ํํ์ธ์. ๋ชจ๋ ํ์ด์ง์ ๊ฐ์ ์ค์ ์ ์ ์ฉํ๊ธฐ ์ ์ ์ํฅ ๋ฒ์๋ฅผ ์ ๋ ๊ฒ์ด ์ฐ์ ์ ๋๋ค.
- ๊ธฐ๋ก: ๋ฐ์ ์๊ฐ๊ณผ ์๊ฐ๋, ์์ฒญ ๊ฒฝ๋ก, ๋ฉ์๋, ์ฝ๋, ๋ก๊ทธ์ธ ์ฌ๋ถ๋ฅผ ๋จ๊น๋๋ค.
- ์์น ํ์ธ: ํ๋ก์ยทCDN์ ์ด๋ฒคํธ์ ์๋ณธ ์๋ฒ ๋ก๊ทธ๋ฅผ ๋์กฐํฉ๋๋ค. ์์ฒญ ์๋ณ์๊ฐ ์์ผ๋ฉด ํจ๊ป ์ฌ์ฉํฉ๋๋ค.
- ๋น๊ต: ์ ์ ์์ฒญ๊ณผ ๋ค๋ฅธ ์ฟ ํคยทํค๋ยท์ฃผ์ ์กฐ๊ฑด์ ์ฐพ์๋ด ๋๋ค. ๋ฏผ๊ฐํ ๊ฐ์ ๊ณต์ ํ์ง ์์ต๋๋ค.
- ์์ : ๊ฐ์ฅ ๊ทผ๊ฑฐ๊ฐ ์๋ ์ค์ ํ๋๋ฅผ ๋ฐ๊ฟ๋๋ค. ๋ณ๊ฒฝ ์ ๊ฐ๊ณผ ๋๋๋ฆด ๋ฐฉ๋ฒ์ ๊ธฐ๋กํฉ๋๋ค.
- ์ฌํ์ธ: ๋ฌธ์ ๊ธฐ๋ฅ๋ฟ ์๋๋ผ ๋ก๊ทธ์ธ, ๊ธ์ฐ๊ธฐ, ์ด๋ฏธ์ง ํ์ ๊ฐ์ ์ธ์ ๊ธฐ๋ฅ๋ ํ์ธํฉ๋๋ค.
์๋ฅผ ๋ค์ด 403์ ๋ดค๋ค๊ณ ๋ฐฉํ๋ฒฝ ์ ์ฒด๋ฅผ ๋๊ฑฐ๋, 503์ ๋ดค๋ค๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ฐ๋ก ์ฆ์คํ์ง ๋ง์ธ์. ์์ ์์ ๋ ๊ฐ์ ์์ ํ๋ก๊ทธ๋จ์ด ๋ชจ๋ ๋ค๋ฅธ ์ฝ๋๋ฅผ ๋ณด๋ผ ์ ์์์ ๋ณด์ฌ ์ค๋๋ค. ์ค์ ์์ธ์ ๊ด๋ จ ๋ก๊ทธ์ ์ ์ฉ๋ ๊ท์น์ด ์ค๋ช ํด์ผ ํฉ๋๋ค. ์ฝ๋ ์์ฒด๋ ์์ธ ๋ณด๊ณ ์๊ฐ ์๋๋๋ค.
์ด์ ๊ธฐ๋ก์ ๊ธธ ํ์๊ฐ ์์ต๋๋ค. โ์ค์ 10์ ํ๊ตญ ์๊ฐ, ๋นํ์ ๊ฒ์๊ธ GET 403, ์ผ๋ฐ ๋ธ๋ผ์ฐ์ ๋ ์ ์, ๋ช ๋ น์ค๋ง ์คํจ, ์๋ณธ ๋ก๊ทธ ๋ฏธํ์ธโ์ฒ๋ผ ๊ด์ฐฐ๊ณผ ๋ฏธํ์ธ ์ฌํญ์ ๊ตฌ๋ถํ๋ฉด ๋ฉ๋๋ค. ์ด ๊ธฐ๋ก์ ๋จ๊ธฐ๋ฉด ๋ค๋ฅธ ๊ฐ๋ฐ์์๊ฒ ๋์์ ์์ฒญํ ๋๋ ์ถ์ธก ๋์ ์ฌํ ๊ฐ๋ฅํ ์กฐ๊ฑด์ ์ ๋ฌํ ์ ์์ต๋๋ค.
์ฌ์ฉ์์๊ฒ ๋ณด์ด๋ ์ค๋ฅ ์๋ด๋ ์ ๊ฒํ์ธ์. โ์ ์ ํ ๋ค์ ์๋ํ์ธ์โ๋ผ๋ ํ๋ฉด์ ํ์ํ์ง๋ง ์๋ต ์ํ๊น์ง 200์ผ๋ก ๋ฐ๊พธ๋ฉด ์ธ๋ถ ์ ๊ฒ ๋๊ตฌ๊ฐ ์ฑ๊ณต์ผ๋ก ์ฝ์ ์ ์์ต๋๋ค. ์ค๋ฅ ํ๋ฉด์ ์น์ ํจ๊ณผ ์ํ ์ฝ๋์ ์ ํํจ์ ํจ๊ป ์ ์งํ๋ ํธ์ด ์ด์ํ๊ธฐ ์ฝ์ต๋๋ค. ๋จ, ๊ธฐ์กด API ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ค ์๋ต์ ๊ธฐ๋ํ๋์ง๋ ์์ ์ ์ ํ์ธํด์ผ ํฉ๋๋ค.
7. ์์ฃผ ๋ฌป๋ ์ง๋ฌธ
200์ด๋ฉด ์ฌ์ดํธ๊ฐ ์์ ํ ์ ์์ธ๊ฐ์?
์๋๋๋ค. ์ฌ๊ธฐ์๋ ํด๋น ์์ฒญ์ด ์ฑ๊ณต ์๋ต์ ๋ฐ์ ๊ฒ๋ง ํ์ธํฉ๋๋ค. ํ๋ฉด ์์ ๋ค๋ฅธ API, ์ด๋ฏธ์ง, JavaScript ์คํ์ ๋ฐ๋ก ์คํจํ ์ ์์ต๋๋ค. ๋ก๊ทธ์ธ ์๋ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํจ ๋ฉ์์ง๊ฐ 200 ๋ณธ๋ฌธ์ ๋ค์ด์ค๋ ๊ฒฝ์ฐ๋ ์์ผ๋ฏ๋ก ์ค์ ๋ด์ฉ๊ณผ ๊ธฐ๋ฅ์ ์ ๊ฒํ์ธ์.
๋ธ๋ผ์ฐ์ ๋ ๋๋๋ฐ curl๋ง 403์ด๋ฉด ์๋ฒ ์ค๋ฅ์ธ๊ฐ์?
๊ทธ ๊ฒฐ๊ณผ๋ง์ผ๋ก๋ ํ์ ํ ์ ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ์ ์ฟ ํค, ๋ณด์ ํ์ธ ๊ณผ์ , ํค๋, ์ ์ ์์น๊ฐ ๋ค๋ฅธ์ง ํ์ธํฉ๋๋ค. ๋ก์ปฌ ์ค์ต์ 403์ ์์ ์๋ฒ๊ฐ ์ง์ ๋ฐํํ์ง๋ง ์ค์ ์ฌ์ดํธ์ 403์ ์ค๊ฐ ์๋น์ค๊ฐ ๋ณด๋์ ์๋ ์์ต๋๋ค.
์ด ์์ ์์ 429๋ 30์ด ๋ค 200์ผ๋ก ๋ฐ๋๋์?
์๋๋๋ค. ๊ฒฝ๋ก๋ณ๋ก ๊ณ ์ ์๋ต์ ๋ณด๋ด๋ฏ๋ก ๊ณ์ 429์ ๋๋ค. ํค๋๋ฅผ ์ฝ๋ ์ฐ์ต์ ์ํ ๊ตฌ์กฐ์ ๋๋ค. ์ค์ ์ ํ ํด์ ๋ฅผ ์ํํ๋ ค๋ฉด ์๊ฐ๊ณผ ํธ์ถ ํ์๋ฅผ ๊ด๋ฆฌํ๋ ๋ณ๋์ ๋ก์ง์ด ํ์ํฉ๋๋ค.
503์ด๋ฉด ์ฌ์ฉ์๊ฐ ๋ง๋ค๋ ๋ป์ธ๊ฐ์?
๊ทธ๋ด ์ ์์ง๋ง ์ฝ๋๋ง์ผ๋ก ์ ์์ ์๋ฅผ ์ ์๋ ์์ต๋๋ค. ์ ์ง๋ณด์, ๋ด๋ถ ์์กด ์๋น์ค ์ฐ๊ฒฐ ์คํจ ๋ฑ ์ค์ ํ๋ก๊ทธ๋จ์ ์ฒ๋ฆฌ ๋ฐฉ์๋ ์ดํด๋ด์ผ ํฉ๋๋ค. ์๋ต ๋ณธ๋ฌธ๊ณผ ๋ก๊ทธ๊ฐ ์๋ ์ํ์์ ๋ฐฉ๋ฌธ์ ์ฆ๊ฐ๋ก ๋จ์ ํ์ง ๋ง์ธ์.
curl ๋ช ๋ น์ ์ฌ์ดํธ HTML์ ๋ฃ์ด์ผ ํ๋์?
์๋๋๋ค. ๋ณธ๋ฌธ์ ๋ณด์ด๋ ๋ช ๋ น์ ๋ ์๊ฐ ํฐ๋ฏธ๋์์ ์คํํ๋ ์ง๋จ ์์ ์ ๋๋ค. HTML ํ์ผ์ ์ด์ด๋ ์๋ฒ๊ฐ ์๋์ผ๋ก ์คํ๋๊ฑฐ๋ ์ธ๋ถ ์ฌ์ดํธ์ ์์ฒญ์ ๋ณด๋ด์ง ์์ต๋๋ค.
์ฐธ๊ณ ์๋ฃ์ ๊ฒ์ฆ ๋ฒ์
๋ณธ๋ฌธ์ ํ์ค ์ ์๋ฅผ ๊ทธ๋๋ก ๋ฒ์ญํด ์ฎ๊ธด ๋ฌธ์๊ฐ ์๋๋ผ, ๋ ๋ฆฝ์ ์ผ๋ก ๊ตฌ์ฑํ ์ ๊ฒ ์ ์ฐจ์ ๋ก์ปฌ ์ค์ต์ ์ค์ฌ์ผ๋ก ์์ฑํ์ต๋๋ค. ์ํ ์ฝ๋ ์๋ฏธ์ ๋๊ตฌ ์ต์ ์ ํ์ธํ ๋ ์ฌ์ฉํ ์๋ฃ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- IETF RFC 9110 โ HTTP ์ํ ์ฝ๋
- IETF RFC 6585 โ 429 Too Many Requests
- MDN โ HTTP ์๋ต ์ํ ์ฝ๋ ๊ฐ์
- MDN โ Retry-After
- curl ๊ณต์ ๋งค๋ด์ผ โ ๋ช ๋ น ์ต์
- Python ๊ณต์ ๋ฌธ์ โ http.server
๊ฒ์ฆํ ๋ฒ์๋ ๋ก์ปฌ ์์ ์ GET ์๋ต 7๊ฐ์ง, ๋ ์ฌ์๋ ํค๋, ์ด๋ ์ฃผ์์ ์ต์ข 200, ๋ณธ๋ฌธ ๊ธธ์ด์ ๋๋ค. ์ค์ ์ฌ์ดํธ์ ์ธ์ฆยท๋ฐฉํ๋ฒฝยท๋ถํ ์ ํยทCDN ๋์์ ์ด ์ค์ต์ผ๋ก ๊ฒ์ฆํ์ง ์์์ต๋๋ค. Windows ๋ช ๋ น์ ๊ณต์ curl ์ต์ ์ ๋ง์ถฐ ์์ฑํ์ผ๋ฉฐ ์ด๋ฒ ์คํ ํ๊ฒฝ์์ Windows ์์ฒด๋ฅผ ์ํํ ๊ฒ์ ์๋๋๋ค.
์ด ๋ฌธ์์ ๋์๊ณผ ์์ ์ฝ๋๋ ๋ณธ๋ฌธ์ ์ํด ์ง์ ๊ตฌ์ฑํ์ต๋๋ค. ์ธ๋ถ ์ด๋ฏธ์งยทํฐํธยท๊ด๊ณ ยท์ถ์ ์คํฌ๋ฆฝํธ ์์ด ์ด๋ฆฌ๋ ๋จ์ผ HTML ๋ฌธ์์ ๋๋ค.
๐ฌ ๋๊ธ 0๊ฐ