FastAPI ๋ฐฑ์๋ ์๋ฒ๋ฅผ ๋ง๋น์ํค๋ ์ ์ฑ ํฌ๋กค๋ฌ ๋ด ์๋ฒฝ ๋ฐฉ์ด๊ธฐ: Cloudflare WAF ASN ์ฐจ๋จ ๋ฐ ๋ฅ ํ์ด์ง(Deep Pagination) ์ ํ
์น์ฌ์ดํธ์ ์์ง์ IT ์นผ๋ผ๊ณผ ํธ๋ ๋ ๊ฒ์๊ธ์ด ์๋ง ๊ฐ ์ด์ ์์ด๊ธฐ ์์ํ๋ฉด์, ํํ๋กญ๋ ์๋ฒ์ ์ ์ ์๋ 503 Service Unavailable ์๋ฌ์ ํจ๊ป DB ์ปค๋ฅ์ ํ(QueuePool limit overflow)๊ฐ ํฐ์ ธ๋๊ฐ๋ ํ์์ด ๋ฐ์ํ์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ์ CPU ์ ์ ์จ์ด ๋น์ ์์ ์ผ๋ก ์น์์๊ณ , ์ ๋์ผ์ค ์ฌ์ฌ๋ฅผ ์๋ ์์ ์์ ์๋ฒ ๋ค์ด์ ๊ฒ์ ์์ง ์ต์ ํ(SEO)์ ์น๋ช ์ ์ธ ํ๋ํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ ์์ฐํ ์ํฉ์ด์์ต๋๋ค.
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด uvicorn ์๋ฒ์ ์ค์๊ฐ ์ ์ ๋ก๊ทธ๋ฅผ ๋ฏ์ด๋ณธ ๊ฒฐ๊ณผ, ์ง์ง ์ ์ (์ฌ๋)์ ์
์ฑ ๋ด์ ๊ทน๋ช
ํ ํ๋ ์ฐจ์ด๋ฅผ ๋ฐ๊ฒฌํ ์ ์์์ต๋๋ค.
1. ์ง์ง ์ฌ๋๊ณผ ์ ์ฑ ๋ด์ ์๋ฆ ๋๋ ๋ก๊ทธ ์ฐจ์ด
์ผ๋ฐ์ ์ธ ์ฌ๋ ์ ์ ๊ฐ ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ์ฌ์ดํธ์ ์ ์ํ๋ฉด, ํ๋ฉด์ ๋ ๋๋งํ๊ธฐ ์ํด HTML์ ๋ค์ด๋ก๋ํ ์งํ ์์ญ ๊ฐ์ ์ธ๋ค์ผ ์ด๋ฏธ์ง ํ์ผ(.webp)์ ์ฐ์์ผ๋ก ์์ฒญํ๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ฉด, ์
์ฑ ๋ด๋ค์ ๋ก๊ทธ๋ ๋งค์ฐ ๊ธฐํ์ ์ด์์ต๋๋ค.

์ด๋ค์ ์ด๋ฏธ์ง๋ ๋จ ํ ์ฅ๋ ์์ฒญํ์ง ์๊ณ , 1์ด ๊ฐ๊ฒฉ์ผ๋ก page=81, page=180 ๋ฑ ์ผ๋ฐ ์ ์ ๋ผ๋ฉด ์ ๋ ๋๋ฅด์ง ์์ ๊ฒ์ํ์ ์๋ํ ๊น์ ํ๋จ ๋ชฉ๋ก๊น์ง ํ๊ณ ๋ค๋ฉฐ HTML ํ
์คํธ ๋ฐ์ดํฐ๋ง ๋ฌด์๋นํ๊ฒ ๊ธ์ด๊ฐ๊ณ (Scraping) ์์์ต๋๋ค.
IP๋ฅผ ์ถ์ ํด ๋ณด๋ 3.221.61.12๋ ๋ฏธ๊ตญ Amazon AWS ๋ฐ์ดํฐ์ผํฐ์ IP์๊ณ , ๋ค๋ฅธ IP๋ค๋ ๋๋ถ๋ถ ํด์ธ ํด๋ผ์ฐ๋ ํธ์คํ
์
์ฒด์ ๊ฐ์ ์๋ฒ์์ต๋๋ค. ํ๊ตญ์ด๋ก ๋ IT ์ปค๋ฎค๋ํฐ๋ฅผ ๋ฏธ๊ตญ AWS ์๋ฒ์์ 80ํ์ด์ง์ฉ ๋๊ฒจ๊ฐ๋ฉฐ ์ฝ์ ์ฌ๋์ ์์ต๋๋ค. ์ด๋ 100% ๋ฌด๋จ ํฌ๋กค๋ง ๋ด์ด์๊ณ , ์ด๋ค์ด ๋ฌด๊ฑฐ์ด DB ์กฐํ ์ฟผ๋ฆฌ๋ฅผ 1์ด์ ์์ญ ๋ฒ์ฉ ์ ๋ฐํ๋ฉฐ ์๋ฒ๋ฅผ ์ฃฝ์ด๊ณ ์์๋ ๊ฒ์
๋๋ค.

2. ๋ฐฉ์ด ์ ๋ต 1: Cloudflare WAF ASN ์ฑ๋ฆฐ์ง๋ก ํ์ ํ๋จํ๊ธฐ
์ด๋ฌํ ์ ์ฑ ๋ด๋ค์ IP ์ฃผ์๋ฅผ ๋ฌดํ๋๋ก ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ณ IP๋ฅผ ์ฐจ๋จํ๋ ๊ฒ์ ๋๋์ง ๊ฒ์์ ๋ถ๊ณผํฉ๋๋ค. ๊ฐ์ฅ ํ์คํ ๋ฐฉ๋ฒ์ ๋ด๋ค์ด ์์ํ๋ 'ํด๋ผ์ฐ๋ ํธ์คํ ์ ์ฒด' ์์ฒด๋ฅผ ๋ฌถ์ด์ ๋ฐฉ์ด๋ง์ ์น๋ ๊ฒ์ ๋๋ค.
์ ๋ Cloudflare์ WAF(์น ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฉํ๋ฒฝ) ์ปค์คํ ๋ฃฐ์ ํ์ฉํ์ฌ, ํน์ ASN(Autonomous System Number, ์์จ ์์คํ ๋ฒํธ)์ ํ๊ฒํ ํ์ต๋๋ค.
16509(Amazon AWS)14061(DigitalOcean)20473(Vultr)24940(Hetzner)
์ ASN ๋์ญ์์ ๋ค์ด์ค๋ ํธ๋ํฝ์ ๋ํด '๊ด๋ฆฌํ ์ฑ๋ฆฐ์ง(Managed Challenge)'๋ฅผ ๋ถ์ฌํ์ต๋๋ค. ํ์ด์ฌ ์คํฌ๋ฆฝํธ๋ก ๋์ํ๋ ๋ฉ์ฒญํ ๋ด๋ค์ ํด๋ผ์ฐ๋ํ๋ ์ด์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ณด์ ์ฑ๋ฆฐ์ง ํ๋ฉด์ ๋ซ์ง ๋ชปํ๊ณ ์ฐ์ฃผ ๋ฐ์ผ๋ก ํ๊ฒจ ๋๊ฐ๊ฒ ๋ฉ๋๋ค.
3. ๋ฐฉ์ด ์ ๋ต 2: ๊ตฌ๊ธ ์ ๋์ผ์ค ์ฌ์ฌ ๋ด(Known Bots) ์์ธ ์ฒ๋ฆฌ
์ด ๋ฐฉ์ด๋ง์ ์น ๋ ๊ฐ์ฅ ์ฃผ์ํด์ผ ํ ์ ์ "๊ตฌ๊ธ ๋ด(Googlebot)๊ณผ ์ ๋์ผ์ค ์ฌ์ฌ ๋ด(Mediapartners-Google)์ด ํ๊ฒจ ๋๊ฐ๋ฉด ์ ๋๋ค"๋ ๊ฒ์
๋๋ค.
์ด๋ฅผ ์๋ฒฝํ๊ฒ ํด๊ฒฐํ๊ธฐ ์ํด WAF ๊ท์น์ Known Bots = Off (๊บผ์ง) ์กฐ๊ฑด์ ์ถ๊ฐํ์ต๋๋ค. ์ฆ, "์๋ง์กด ์๋ฒ์์ ๋ค์ด์ค๋ฉด์, ๋์์ ๊ตฌ๊ธ ๋ด์ฒ๋ผ ์ฐฉํ๊ฒ ์ธ์ฆ๋ ๋ด์ด ์๋ ๋
์๋ค์๊ฒ๋ง ์ฑ๋ฆฐ์ง๋ฅผ ๋์๋ผ!"๋ผ๋ ์๋ฒฝํ ๋
ผ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์์ฑํ์ต๋๋ค. ์ด ์ค์ ๋๋ถ์ ์ ๋์ผ์ค ์ฌ์ฌ์๋ ๋จ 0.1%์ ์
์ํฅ๋ ์ฃผ์ง ์์ผ๋ฉด์ ์ฌ์ดํธ๋ฅผ ๋ณดํธํ ์ ์์์ต๋๋ค.

4. ๋ฐฉ์ด ์ ๋ต 3: ๋ฐฑ์๋(FastAPI) ๋ฅ ํ์ด์ง(Deep Pagination) ๊ฐ์ ์ ํ
ํด๋ผ์ฐ๋ํ๋ ์ด๊ฐ ์๋จ์์ ๋ง์์ฃผ๋๋ผ๋, ์ฐํํด์ ๋ค์ด์ค๋ ๋ด๋ค์ ์ํด ๋ฐฑ์๋ ํ์ด์ฌ ์ฝ๋(FastAPI) ๋จ์์๋ 2์ฐจ ๋ฐฉ์ด๋ง์ ์ณค์ต๋๋ค.
์ผ๋ฐ์ ์ธ ์ ์ ๊ฒฝํ(UX) ์ ํน์ ๊ฒ์๊ธ์ ๋ณด๋ฉฐ ํ๋จ ๋ชฉ๋ก์ 15ํ์ด์ง ์ด์ ๋๊ธฐ๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ฐฑ์๋ ๋ก์ง์ if page > 15: ์กฐ๊ฑด์ ์ถ๊ฐํ์ฌ, 15ํ์ด์ง๋ฅผ ์ด๊ณผํ๋ ๋น์ ์์ ์ธ ํธ์ถ์ด ๋ค์ด์ค๋ฉด ๊ฐ์ฐจ ์์ด 404 Not Found ์๋ฌ๋ฅผ ๋ฑ์ด๋ด๊ฑฐ๋ 1ํ์ด์ง๋ก ๊ฐ์ ๋ฆฌ๋ค์ด๋ ํธ(Cap) ์์ผ๋ฒ๋ ธ์ต๋๋ค.

์ด ์กฐ์น๋ ๋จ์ํ ๋ด์ ๋ง๋ ๊ฒ์ ๋์ด, ๊ตฌ๊ธ ๋ด์ ํฌ๋กค๋ง ์์ฐ(Crawl Budget) ๋ญ๋น๋ฅผ ๋ง์ ๊ฒ์์์ง ์ต์ ํ(SEO) ์ ์๋ฅผ ๋ํญ ๋์ด์ฌ๋ฆฌ๋ 1๋ฑ ๊ณต์ ์ด ๋์์ต๋๋ค.
๋งบ์ผ๋ฉฐ: ์๋ฒฝํ ํํ๋ฅผ ๋์ฐพ์ ์๋ฒ ํฐ๋ฏธ๋
๋ชจ๋ ์ธํ
์ ๋ง์น๊ณ ์๋ฒ ๋ก๊ทธ๋ฅผ ๋ค์ ๋ชจ๋ํฐ๋งํ์ ๋, ์ ๋ ์๋์ ํ์จ์ ๋ด์ฌ์์ต๋๋ค. ์ง๊ธ์ง๊ธํ๋ 503 ์๋ฌ์ DB ํ์์์ ๋ก๊ทธ๋ ์๋ฒฝํ๊ฒ ์์ทจ๋ฅผ ๊ฐ์ถ์์ต๋๋ค. ๋์ ์ง์ง ์ฌ๋ ๋ฐฉ๋ฌธ์๋ค์ด ์ ์ ์ด๋ฏธ์ง ํ์ผ(.webp)์ ํธ์ถํ๋ 200 OK์ 304 Not Modified ๋ก๊ทธ๋ง์ด ํํ๋กญ๊ฒ ํ๋ฌ๊ฐ๊ณ ์์์ต๋๋ค.
ํด๋ผ์ฐ๋ ํ๊ฒฝ์์ 1์ธ ๊ฐ๋ฐ์๋ก ์๋น์ค๋ฅผ ์ด์ํ๋ค ๋ณด๋ฉด, ์ ์ฑ ํธ๋ํฝ๊ณผ์ ์ ์์ ํผํ ์ ์๋ ์๋ช ์ ๋๋ค. ๋ฌด์์ ์๋ฒ ์ฌ์(Scale-up)์ ์ฌ๋ ค ๋น์ฉ์ ๋ญ๋นํ๊ธฐ ์ ์, WAF๋ฅผ ํตํ ๋คํธ์ํฌ ๊ณ์ธต์ ๋ฐฉ์ด์ ๋ฐฑ์๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณ์ธต์ ๋ก์ง ์ต์ ํ(Pagination ์บก)๋ฅผ ์ ์ ํ ์กฐํ์ํค๋ ๊ฒ์ด ์ง์ ํ ์์ง๋์ด์ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ์์์ ๋ผ์ ๋ฆฌ๊ฒ ๋ฐฐ์ธ ์ ์์์ต๋๋ค.
โ ์์ฃผ ๋ฌป๋ ์ง๋ฌธ (FAQ)
Q1. ์ด๋ฏธ์ง ํ์ผ(webp)์ ์์ฒญํ์ง ์๋ IP๋ฅผ ๋ฌด์กฐ๊ฑด ๋ด์ผ๋ก ๊ฐ์ฃผํ๊ณ ์ฐจ๋จํ๋ฉด ์ ๋๋์?
A. ์ ๋ ์ ๋ฉ๋๋ค. ๊ตฌ๊ธ ๊ฒ์ ๋ด(Googlebot)์ด๋ ์ ๋์ผ์ค ์ฌ์ฌ ๋ด ์ญ์ ์๋ฒ ๋ถํ๋ฅผ ์ค์ด๊ธฐ ์ํด HTML ํ ์คํธ๋ง ๊ธ์ด๊ฐ๊ณ ์ธ๋ค์ผ ์ด๋ฏธ์ง๋ ๋ค์ด๋ก๋ํ์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๋ํ, ์ฌ๋ฐฉ๋ฌธํ๋ ์ผ๋ฐ ์ ์ ๋ ๋ธ๋ผ์ฐ์ ์บ์์ ์ด๋ฏธ์ง๊ฐ ์ ์ฅ๋์ด ์์ด HTML๋ง ํธ์ถํ๊ธฐ๋ ํฉ๋๋ค. ์ด๋ฅผ ๋ง์ผ๋ฉด ์ถฉ์ฑ ์ ์ ์ ๊ตฌ๊ธ ๊ฒ์ ๋ ธ์ถ์ ๋ชจ๋ ์๊ฒ ๋ฉ๋๋ค.
Q2. Cloudflare์ "I'm Under Attack" ๋ชจ๋๋ฅผ ์ผ๋ฉด ๋ด์ ์ฝ๊ฒ ๋ง์ ์ ์์ง ์๋์?
A. ํด๋น ๋ชจ๋๋ฅผ ์ผ๋ฉด ์ฌ์ดํธ์ ์ ์ํ๋ ๋ชจ๋ ์ ์ ์ ๋ด(๊ตฌ๊ธ ๋ด ํฌํจ)์๊ฒ 5์ด ๋๊ธฐ ํ๋ฉด(์๋ฐ์คํฌ๋ฆฝํธ ์ฑ๋ฆฐ์ง)์ ๊ฐ์ ํฉ๋๋ค. ์ด๋ ์ ์ ๊ฒฝํ(UX)์ ์ฌ๊ฐํ๊ฒ ํผ์ํ๋ฉฐ, ์ ๋์ผ์ค ์ฌ์ฌ ๋ด์ด ์ฌ์ดํธ๋ฅผ ์ฝ์ง ๋ชปํด ์ฌ์ฌ์์ ํ๋ฝํ๋ ๊ฒฐ์ ์ ์ธ ์์ธ์ด ๋๋ฏ๋ก ์์ ์ผ๋๋ ๊ฒ์ ๊ถ์ฅํ์ง ์์ต๋๋ค.
Q3. ๊ฒ์ํ ํ๋จ ๋ชฉ๋ก์ ํ์ด์ง ์๋ฅผ 15ํ์ด์ง๋ก ์ ํํ๋ฉด, ๊ณผ๊ฑฐ์ ์๋ ๊ธ๋ค์ ๊ตฌ๊ธ์ ๋ ธ์ถ๋์ง ์๋์?
A. ๊ทธ๋ ์ง ์์ต๋๋ค. ๊ตฌ๊ธ ๋ด์ ๊ฒ์ํ ํ๋จ์ 1, 2, 3ํ์ด์ง ๋ฒํผ์ ์ผ์ผ์ด ๋๋ฌ๊ฐ๋ฉฐ ๊ธ์ ์์งํ๋ ๊ฒ์ด ์๋๋ผ, ์ฐ๋ฆฌ๊ฐ ๊ตฌ๊ธ ์์น ์ฝ์์ ์ ์ถํ sitemap.xml ํ์ผ์ ์ง๋๋ก ์ผ์ ๋ชจ๋ ๊ฐ๋ณ ๊ฒ์๊ธ์ ๋ค์ด๋ ํธ URL ์ฃผ์๋ก ์ง์ ์ฐพ์ ๋ค์ด๊ฐ๋๋ค. ๋ฐ๋ผ์ ๋ฅ ํ์ด์ง์ ๋ง๋ ๊ฒ์ ๊ณผ๊ฑฐ ๊ธ ๋
ธ์ถ์ ์๋ฌด๋ฐ ์
์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
๐ฌ ๋๊ธ 0๊ฐ