ํ๋ก์์ Starlette๊ฐ ๊ฐ์ ์์ฒญ์ ๋ค๋ฅด๊ฒ ์ฝ์ ๋ — ๊ฒฝ๊ณ๋ฉด์์ ๊ฐ๋ผ์ง๋ ํ ๊ฑด์ HTTP
์ฌ๋ด API ๊ฒ์ดํธ์จ์ด ๋ก๊ทธ๋ฅผ ๋ณด๋ค๊ฐ ์ด์ํ ๊ฑธ ๋ฐ๊ฒฌํ๋ ์๊ฐ์ด ์์. ํ๋ก์ ์ก์ธ์ค ๋ก๊ทธ์๋ ์์ฒญ์ด ํ ๊ฑด์ธ๋ฐ, ๋ค์ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ก๊ทธ์๋ ๋ ๊ฑด์ด ์ฐํ ์๋ ๊ฒฝ์ฐ ๋ง์ ๋๋ค. ์ด๊ฒ ๋ฐ๋ก HTTP ์์ฒญ ์ค๋จธ๊ธ๋ง์ด ๋จ๊ธฐ๋ ๊ฐ์ฅ ์ ํ์ ์ธ ํ์ ์ด๊ณ , ์ด๋ฒ์ Starlette์ ๋ถ์ CVE-2026-48710๋ ์ ํํ ์ด ๊ณ์ด์ ๋ฌธ์ ์.
- Kludex/Starlette์์ HTTP ์์ฒญ·์๋ต ์ค๋จธ๊ธ๋ง(Request/Response Smuggling) ์ทจ์ฝ์ ์ด ๋ณด๊ณ ๋จ — ํ๋ก์์ ์ฑ์ด ๊ฐ์ ๋ฐ์ดํธ ์คํธ๋ฆผ์ ๋ค๋ฅด๊ฒ ํด์ํ๋ ๊ฒฝ๊ณ๋ฉด ๋ถ์ผ์น ๋ฌธ์ .
- ์ค์ง ์ํ์ ์ธ์ฆ·WAF·๋ผ์ฐํ ์ฐํ, ์บ์ ์ค์ผ, ๋ค๋ฅธ ์ฌ์ฉ์ ์๋ต ํ์ทจ๊น์ง ์ด์ด์ง ์ ์๋ค๋ ์ .
- ๋์์ ์ธ ๊ฒน — Starlette·ASGI ์๋ฒ ์ต์ ํ, ํ๋ก์ ๋จ์์ ๋ชจํธํ ์์ฒญ ์ฐจ๋จ, ๊ทธ๋ฆฌ๊ณ "ํ๋ก์ ๋ก๊ทธ ๋ ์ฑ ๋ก๊ทธ" ๊ฑด์ ๋์กฐ ํ์ง.
1. Starlette๊ฐ ์ด๋์ ์ ์๋ ๋ฌผ๊ฑด์ธ์ง๋ถํฐ
Starlette๋ ํ์ด์ฌ ASGI ๊ธฐ๋ฐ์ ๊ฒฝ๋ ์น ํ๋ ์์ํฌ์. ๊ทธ ์์ฒด๋ก ์ฐ์ด๊ธฐ๋ ํ์ง๋ง, ์ง์ง ๋ฌด์์ด ๊ฑด FastAPI๊ฐ Starlette ์์ ์นํ ์๋ค๋ ์ฌ์ค์. ์์ฆ ์ฌ๋ด์ ๋์๋ค๋๋ AI ์ถ๋ก API, ๋ด๋ถ ๋ฐฑ์คํผ์ค, ๋ง์ดํฌ๋ก์๋น์ค ๊ฒ์ดํธ์จ์ด ์๋น์๊ฐ FastAPI๋ก ์ง์ฌ ์๋ค๋ณด๋, Starlette ํ๋์ ๊ตฌ๋ฉ์ด ๋๋ฉด ์กฐ์ง๋์ ์ ํ ๋ค๋ฅธ ํ๋ค์ด ๋์์ ์ํฅ๊ถ์ ๋ค์ด๊ฐ. ์์ฐ ๋ชฉ๋ก์ "Starlette"๋ผ๊ณ ์ ํ ์๋ ์๋ฒ๊ฐ ์๋๋ผ๋ ์์ฌํ ์ ์๋ ์ด์ ๊ฐ ์ด๊ฒ.
2. ์์ฒญ ์ค๋จธ๊ธ๋ง, ๊ฐ๋ ๋ง ์ง๊ณ ๋์ด๊ฐ
HTTP๋ "์์ฒญ์ด ์ด๋์ ๋๋๋๊ฐ"๋ฅผ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ์๋ฆผ. ํ๋๋ Content-Length, ๋ค๋ฅธ ํ๋๋ Transfer-Encoding: chunked์. ๋ฌธ์ ๋ ์ด ๋์ด ๋์์ ๋ค์ด์ค๊ฑฐ๋, ํค๋ ๊ฐ์ด ์ ๋งคํ๊ฒ ์ฐ์์ ๋ ๋ฐ์ํจ. ์๋จ ํ๋ก์๋ A ๊ธฐ์ค์ผ๋ก ์์ฒญ ๊ฒฝ๊ณ๋ฅผ ์๋ฅด๊ณ , ๋ท๋จ ์ ํ๋ฆฌ์ผ์ด์ ์ B ๊ธฐ์ค์ผ๋ก ์๋ฆ. ๊ทธ๋ฌ๋ฉด ํ๋ก์๊ฐ "์์ฒญ ํ๋"๋ผ๊ณ ๋ฏฟ๊ณ ๋๊ธด ๋ฐ์ดํธ ๋ญ์น์ ๋ท๋ถ๋ถ์ด, ์ฑ ์ ์ฅ์์๋ ๋ค์ ์์ฒญ์ ์๋จธ๋ฆฌ๊ฐ ๋์ด๋ฒ๋ฆผ.
- ๊ทธ๋ ๊ฒ ๋ฐ์ด๋ฃ์ ์กฐ๊ฐ์ ํ๋ก์๋ฅผ ํต๊ณผํ ์ ์ด ์์ผ๋ WAF·์ธ์ฆ ํํฐ๋ฅผ ๊ฑด๋๋.
- ์ฐ๊ฒฐ์ด ์ฌ์ฌ์ฉ๋๋ ๊ตฌ๊ฐ์ด๋ผ๋ฉด, ๊ทธ ์กฐ๊ฐ์ด ๋ค๋ฅธ ์ฌ์ฉ์์ ์์ฒญ ์์ ๋ถ์ด ์๋ต์ด ๋ค์์.
- ์๋ต ์ชฝ ๊ฒฝ๊ณ๊ฐ ์ด๊ธ๋๋ ๊ฒฝ์ฐ(์๋ต ์ค๋จธ๊ธ๋ง)์๋ A ์ฌ์ฉ์์๊ฒ ๊ฐ ์๋ต์ด B ์ฌ์ฉ์ ๋ธ๋ผ์ฐ์ ์ ๋์ฐฉํ๋ ์ํฉ๋ ์ฑ๋ฆฝํจ.
๊ตฌ์ฒด์ ์ธ ํ์ด๋ก๋ ๋ฌธ๋ฒ์ ์ฌ๊ธฐ์ ๋ค๋ฃจ์ง ์์. ๋ฐฉ์ด์ ์ ์ฅ์์ ํ์ํ ๊ฑด "์ด๋ค ๋ฌธ์๋ฅผ ์ด๋์ ๋ฃ๋๋"๊ฐ ์๋๋ผ, ๋ด ๊ตฌ๊ฐ์ ํด์์ด ๊ฐ๋ผ์ง๋ ์ง์ ์ด ์กด์ฌํ๋๊ฐ์ด๊ธฐ ๋๋ฌธ์.
3. ์ ํ๋ ์์ํฌ ๋ ๋ฒจ ํ์ฑ์ด ์ค์ํ๊ฐ
๋ง์ ํ์ด "์ฐ๋ฆฌ๋ nginx ๋ค์ ์์ผ๋ ๊ด์ฐฎ๋ค"๊ณ ์๊ฐํจ. ๊ณผ์ฐ ๊ทธ๋ด๊น? ์ค๋จธ๊ธ๋ง์ ๋จ๋ ์ํํธ์จ์ด์ ๋ฒ๊ทธ๊ฐ ์๋๋ผ ๋ ํ์ ์ฌ์ด์ ์๊ฒฌ ์ฐจ์ด์. ์ฆ ํ๋ก์๊ฐ ์๋ฌด๋ฆฌ ์๊ฒฉํด๋, ๋ท๋จ ํ๋ ์์ํฌ๊ฐ ๊ด๋ํ๋ฉด ๊ทธ ๊ด๋ํจ์ด ๊ณง ํ์ด ๋จ. ๋ฐ๋๋ก ํ๋ ์์ํฌ๊ฐ ์๊ฒฉํด๋ ์๋จ์ด ํ๊ฑฐ์ฐ๋ฉด ๋ง์ฐฌ๊ฐ์ง๊ณ . ๊ทธ๋์ Starlette ๊ฐ์ ํ๋ ์์ํฌ·ASGI ์๋ฒ(uvicorn, hypercorn ๋ฑ)์ ํค๋ ํ์ฑ ๊ท์ฝ์ด ์ผ๋ง๋ RFC์ ๋ถ์ด ์๋๋๊ฐ ์ค์ ๋ณด์ ๊ฒฝ๊ณ๋ฅผ ๊ฒฐ์ ํจ.
4. ์ง๊ธ ๋น์ฅ ํด๋ณผ ์ ๊ฒ ์์
- ์์ฐ ์๋ณ: requirements.txt·poetry.lock·pip freeze๋ฅผ ์ ์ ์กฐ์ฌํด starlette, fastapi, uvicorn ๋ฒ์ ์ ๋ฝ์. ์ปจํ ์ด๋ ์ด๋ฏธ์ง ์์ชฝ๊น์ง ๋ด์ผ ํจ. ์์ฐ ์ธ๋ฒคํ ๋ฆฌ์์ ๋น ์ง๋ ๊ฑด ๋๊ฐ "๋๊ฐ ๊ธํ๊ฒ ๋์ด ๋ด๋ถ์ฉ" ์๋น์ค์.
- ๋ฒ์ ์ต์ ํ: Starlette ๋ฐ ํจ๊ป ์ฐ๋ ASGI ์๋ฒ๋ฅผ ํจ์น ๋ฐ์๋ ์ต์ ๋ฒ์ ์ผ๋ก ์ฌ๋ฆผ. FastAPI๋ฅผ ์ด๋ค๋ฉด FastAPI๋ง ์ฌ๋ฆฌ๋ ๊ฒ ์๋๋ผ ํ์ ์์กด์ฑ์ธ Starlette๊ฐ ์ค์ ๋ก ์ฌ๋ผ๊ฐ๋์ง ํ์ธํด์ผ ํจ.
- ๊ฒฝ๊ณ๋ฉด ์ถ์: ํ๋ก์์์ Content-Length์ Transfer-Encoding์ด ๋์์ ์กด์ฌํ๋ ์์ฒญ, ์ค๋ณต ํค๋, ๋น์ ์ chunked ์ธ์ฝ๋ฉ์ ์ ๊ทํํ์ง ๋ง๊ณ ๊ทธ๋ฅ ๊ฑฐ์ ํ๋๋ก ์ค์ . "๊ณ ์ณ์ ์ ๋ฌ"์ด ์ค๋จธ๊ธ๋ง์ ์ต๊ณ ์กฐ๋ ฅ์์.
- ์ฐ๊ฒฐ ์ ์ฑ ์กฐ์ : ํ๋ก์์ ๋ฐฑ์๋ ์ฌ์ด ๊ตฌ๊ฐ์ HTTP/2๋ก ์ ๋ฆฌํ๊ฑฐ๋, ๋ฆฌ์คํฌ๊ฐ ํฐ ๊ตฌ๊ฐ์ keep-alive ์ฌ์ฌ์ฉ์ ์ ํ. ๋ฐฑ์๋ ์ฐ๊ฒฐ์ด ๊ณต์ ๋์ง ์์ผ๋ฉด ํผํด๊ฐ ์์ฒญ ํ๋์์ ๋ฉ์ถค.
5. ํ์ง — ๋ก๊ทธ ๋ ๋ฒ์ ๋๋ํ ๋๋ ๊ฒ๋ถํฐ
๊ฐ์ธ์ ์ผ๋ก๋ ํจํด ์๊ทธ๋์ฒ๋ณด๋ค ๊ฑด์ ๋์กฐ๋ฅผ ๋จผ์ ์ถ์ฒํจ. ๋ฐฉ๋ฒ์ ๋จ์ํจ.
- ๊ฐ์ ์๊ฐ๋์ ํ๋ก์ ์ก์ธ์ค ๋ก๊ทธ์ ์์ฒญ ์์ ์ ํ๋ฆฌ์ผ์ด์ ๋ก๊ทธ์ ์ฒ๋ฆฌ ์์ฒญ ์๋ฅผ ๋น๊ต. ์ฑ ์ชฝ์ด ๊พธ์คํ ๋ ๋ง์ผ๋ฉด ๊ทธ๊ฑด ๊ฒฝ๊ณ๊ฐ ๊ฐ๋ผ์ง๊ณ ์๋ค๋ ์ ํธ์.
- ์ฑ ๋ก๊ทธ์๋ ์๋๋ฐ ํ๋ก์ ๋ก๊ทธ์๋ ๋์ ํญ๋ชฉ์ด ์๋ ๊ฒฝ๋ก๊ฐ ์๋์ง ํ์ธ. ํนํ /admin, /internal ๊ฐ์ ๊ด๋ฆฌ ๊ฒฝ๋ก๊ฐ ํ๋ก์ ๊ธฐ๋ก ์์ด ๋ฑ์ฅํ๋ฉด ์ฆ์ ์กฐ์ฌ ๋์์.
- ์์ฒญ ID๋ฅผ ํ๋ก์ ๋จ์์ ๋ฐ๊ธํด ํค๋๋ก ์ฌ๊ณ , ์ฑ ๋ก๊ทธ์ ๊ทธ๋๋ก ๋จ๊ธฐ๋๋ก ํจ. ID ์๋ ์์ฒญ = ํ๋ก์๋ฅผ ๊ฑฐ์น์ง ์์ ์์ฒญ.
- ๋์ผ ์์ค์์ 400/408 ๊ฐ์ ํ์ฑ ์ค๋ฅ๊ฐ ์งง์ ๊ฐ๊ฒฉ์ผ๋ก ๋ฐ๋ณต๋๋ ํจํด๋ ์ข์ ์กฐ๊ธฐ ์งํ์. ์ค๋จธ๊ธ๋ง์ ์ฑ๊ณต ์ ์ ํญ์ ํ์ ๋จ๊ณ๋ฅผ ๊ฑฐ์นจ.
WAF ๋ฃฐ ํ๋ ์ถ๊ฐํ๋ ๊ฒ๋ณด๋ค ์ด ์์ฒญ ID ํ์ดํ๋ผ์ธ ํ๋ ๊น์๋๋ ๊ฒ ์ฅ๊ธฐ์ ์ผ๋ก ํจ์ฌ ๊ฐ์ด์น๊ฐ ์๋ ๊ฒ ๊ฐ์. ์ด๋ฒ CVE๋ฟ ์๋๋ผ ์์ผ๋ก ๋์ฌ ๊ฐ์ ๊ณ์ด ์ด์ ์ ๋ถ๋ฅผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋ณผ ์ ์๊ฒ ๋๋๊น.
6. ๋ง๋ฌด๋ฆฌํ๋ฉฐ
์ค๋จธ๊ธ๋ง ๊ณ์ด ์ทจ์ฝ์ ์ ๋ณผ ๋๋ง๋ค ๋๋ ์๊ฐ์, ๊ฒฐ๊ตญ ๋ณด์ ์ฌ๊ณ ์๋น์๊ฐ ์ํํธ์จ์ด ์์ด ์๋๋ผ ์ํํธ์จ์ด์ ์ํํธ์จ์ด ์ฌ์ด์์ ํฐ์ง๋ค๋ ๊ฒ์. ๊ฐ๊ฐ์ ๋ค ์ ์ ๋์์ธ๋ฐ, ์ด์ด๋ถ์ด๋ ์๊ฐ ํด์์ด ๊ฐ๋ผ์ง. ๊ทธ๋์ ์ด๋ฐ ๊ฑด ํจ์น๋ง์ผ๋ก ๋๋ด์ง ๋ง๊ณ , ๋ด ๊ตฌ๊ฐ์ ๊ฒฝ๊ณ๋ฉด ์ง๋๋ฅผ ํ ๋ฒ ๊ทธ๋ ค๋๋ ๊ฒ ์ข๋ค๊ณ ๋ด. ํด๋ผ์ด์ธํธ → CDN → ๋ก๋๋ฐธ๋ฐ์ → ํ๋ก์ → ASGI ์๋ฒ → ์ฑ, ์ด ์ฌ์ฌ์์ HTTP๋ฅผ ๋ค์ ํ์ฑํ๋ ์ง์ ์ด ๋ช ๊ฐ์ธ์ง ์ธ์ด๋ณด๋ ๊ฒ๋ง์ผ๋ก๋ ๊ฐ์ด ํ ์ด.
์ด๋ฒ ์ฃผ๋ง์ ๊ฐ์ ์๋น์ค ์์กด์ฑ ๋ชฉ๋ก๋ถํฐ ํ๋ฒ ํ์ด๋ณด๋ ๊ฑด ์ด๋จ๊น์. ํน์ ์ฌ๋ด์์ ์์ฒญ ID ๋์กฐ ํ์ง๋ฅผ ๋ค๋ฅด๊ฒ ๊ตฌํํด์ ์ฌ๋ฏธ๋ฅผ ๋ณธ ์ฌ๋ก๊ฐ ์๋ค๋ฉด ๋๊ธ๋ก ๊ณต์ ํด ์ฃผ์ธ์. ์ฐจ์ฐจ ์ ๋ฆฌํด์ ๋ค์ ๊ธ์ ๋ฐ์ํด ๋ณด๊ฒ ์. ๊ฐ์ด ํด๋ณด์์!
# ๋๊ธ