1์ธ ๊ฐ๋ฐ์์ ์๋ฒ ์์กด๊ธฐ: ํด๋ผ์ฐ๋ํ๋ ์ด WAF ์๋ ์ ํ(Rate Limiting)์ผ๋ก L7 ๋๋์ค(DDoS) ๋ฐฉ์ด ๋ฐ API ์์ธ ์ฒ๋ฆฌํ๊ธฐ
์น์ฌ์ดํธ๋ฅผ ์ฒ์ ์คํํ๊ณ ์ ์์๊ฐ ํ ๋ช ๋ ๋ช ๋์ด๋ ๋๋ ๊ทธ์ ์ ๊ธฐํ๊ณ ํ๋ณตํ๊ธฐ๋ง ํ์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ ๋ , ์ฌ์ดํธ์ ์ ์ํ๋ ค๋๋ฐ ํ์ 0.1์ด ๋ง์ ๋จ๋ ํ๋ฉด์ด ํ์๊ฒ ๋ฉ์ถฐ ์๋๋ '502 Bad Gateway'๋ผ๋ ๋์ฐํ ์๋ฌ ์ฐฝ์ ๋์ ์ต๋๋ค.
ํ๋ค์ง ๋๋ผ ์ค๋ผํด ํด๋ผ์ฐ๋ ์๋ฒ ํฐ๋ฏธ๋์ ์ ์ํด htop ๋ช
๋ น์ด๋ก ์ํ๋ฅผ ํ์ธํด ๋ณด๋, CPU ์ ์ ์จ์ด 100%๋ฅผ ์ฐ๊ณ ๋นจ๊ฐ๊ฒ ํ์ค๋ฅด๊ณ ์์์ต๋๋ค. ์๋ฒ ์ ์ ๋ก๊ทธ(access.log)๋ฅผ ์ด์ด๋ณธ ์๊ฐ ์ ๋ ๊ฒฝ์
ํ์ต๋๋ค. ๋ฌ์์, ์ค๊ตญ ๋ฑ ์ ์ธ๊ณ์ ์ ์ฒด๋ถ๋ช
IP๋ค์ด 1์ด์ ์๋ฐฑ, ์์ฒ ๋ฒ์ฉ ์ ์ฌ์ดํธ์ ๋ฉ์ธ ํ์ด์ง์ ๊ฒ์ํ์ ๋ฏธ์น ๋ฏ์ด ์๋ก๊ณ ์นจํ๋ฉฐ ๊ธ์ด๊ฐ๊ณ (Scraping) ์์๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ง ๊ทธ๋๋ก ํ๊น์ ๊ฐ๋ฆฌ์ง ์๋ L7(์์ฉ ๊ณ์ธต) ๋๋์ค(DDoS) ๊ณต๊ฒฉ์ด์ ์ ์ฑ ๋ด๋ค์ ํญ๊ฒฉ์ด์์ต๋๋ค. ์๊ธ๋ ฅ์ด ๋๋ํ ๋๊ธฐ์ ์ด๋ผ๋ฉด ๋ฐฉ์ด ์ฅ๋น(Anti-DDoS)๋ฅผ ์ฌ๋ฉด ๊ทธ๋ง์ด๊ฒ ์ง๋ง, ๋ฌด๋ฃ ํด๋ผ์ฐ๋ ํฐ์ด๋ก ์ฐ๋ช ํ๋ 1์ธ ๊ฐ๋ฐ์์๊ฒ ์๋ฒ ๋ง๋น๋ ๊ณง ์๋น์ค์ ์ฃฝ์์ ์๋ฏธํ์ต๋๋ค. ์ ๋ ์ด ๋ฌด์๋นํ ๊ณต๊ฒฉ์ ๋ง์๋ด๊ธฐ ์ํด ๊ฐ์ฅ ํ์ค์ ์ด๊ณ ๊ฐ๋ ฅํ ๋ฐฉํจ, Cloudflare WAF(์น ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฉํ๋ฒฝ)๋ฅผ ๋นผ๋ค์์ต๋๋ค.
1. ๊ฐ๋ ฅํ 1์ฐจ ๋ฐฉ์ด์ : WAF ์๋ ์ ํ(Rate Limiting) ์ค์
ํด๋ผ์ฐ๋ํ๋ ์ด(Cloudflare)๋ ๋จ์ํ ๋๋ฉ์ธ์ ์ฐ๊ฒฐํ๊ณ HTTPS ์๋ฌผ์ ๋ฅผ ์ฑ์์ฃผ๋ ์ฉ๋ ์ธ์๋, ๋ง๊ฐํ ๋ณด์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๊ทธ์ค ํต์ฌ์ '์๋ ์ ํ(Rate Limiting)' ๊ท์น์ ๋๋ค.
์ผ๋ฐ์ ์ธ ์ฌ๋์ด ์ค๋งํธํฐ์ผ๋ก ์น์ฌ์ดํธ๋ฅผ ๊ตฌ๊ฒฝํ ๋, 1์ด์ ์์ญ ๋ฒ์ฉ ์๋ก๊ณ ์นจ์ ๋๋ฅด์ง๋ ์์ต๋๋ค. ์ฆ, ๋น์ ์์ ์ผ๋ก ์งง์ ์๊ฐ์ ์์ฒญ๋ ์์ฒญ์ ๋ณด๋ด๋ ํธ๋ํฝ์ 100% ๊ณต๊ฒฉ์ด๊ฑฐ๋ ํฌ๋กค๋ฌ ๋ด์ด๋ผ๋ ๋ป์ ๋๋ค. ์ ๋ ํด๋ผ์ฐ๋ํ๋ ์ด ๋์๋ณด๋์ [Security] -> [WAF] -> [Rate Limiting rules] ๋ฉ๋ด๋ก ๋ค์ด๊ฐ ์๋์ ๊ฐ์ด ๊ท์น์ ์์ฑํ์ต๋๋ค.
๊ท์น ์ด๋ฆ: Block Malicious Bots & DDoS
์กฐ๊ฑด(If):
URI Pathcontains/(๋ด ์ฌ์ดํธ์ ๋ชจ๋ ์ฃผ์์ ๋ํ์ฌ)์๋ ์ ํ ์กฐ๊ฑด: 10์ด(10 seconds) ๋์ 30ํ(30 requests) ์ด์์ ์์ฒญ์ด ๋ค์ด์ฌ ๊ฒฝ์ฐ
์ก์ (Action): ํด๋น IP๋ฅผ 1์๊ฐ(1 hour) ๋์ ์ฐจ๋จ(Block)


์ด ๊ท์น์ ๋ฐฐํฌ(Deploy)ํ๊ณ ๋จ 5๋ถ ๋ค, ๋๋ผ์ด ์ผ์ด ๋ฒ์ด์ก์ต๋๋ค. ๋ถ์ด ๋ ๊ฒ ๊ฐ์๋ ์๋ฒ์ CPU ์ ์ ์จ์ด 5% ๋ฐ์ผ๋ก ๋ ๋จ์ด์ก๊ณ , 502 ์๋ฌ๋ฅผ ๋ฟ๋ ์น์ฌ์ดํธ๊ฐ ๋ค์ ์พ์ ํ๊ฒ ์ด๋ฆฌ๊ธฐ ์์ํ์ต๋๋ค. ํด๋ผ์ฐ๋ํ๋ ์ด๊ฐ ์๋ฒ ์๋จ์์ ๋ฏธ์น ๋ฏ์ด ์ ์์ ์๋ํ๋ ์ ์ฑ IP๋ค์ ์ ๋ถ 'Block' ์ฒ๋ฆฌํด ๋ฒ๋ ธ๊ธฐ ๋๋ฌธ์ ๋๋ค.
2. ๋ป๋ฐ์ ์๊ตฐ ์ค์ธ ์ฌ๊ฒฉ: ๋ด ์๋ ์ ๋ก๋ ๋ด์ด ์ฐจ๋จ๋๋ค!
"ํด, ์ด์๋ค. ์ด์ ๋๋ฌ๋ค!"๋ผ๋ฉฐ ์์ฌํ๊ณ ๋ฉฐ์น ์ด ์ง๋ฌ์ ๋ฌด๋ ต, ๋ ๋ค๋ฅธ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ ์ฌ์ดํธ์๋ ์ ๊ฐ ๋ณ๋๋ก ๋๋ฆฌ๊ณ ์๋ ํ์ด์ฌ ํฌ๋กค๋ง ๋ด์ด ์ฃผ๊ธฐ์ ์ผ๋ก ์์ง์ ๊ธ์ ์๋์ผ๋ก ํฌ์คํ
ํด ์ฃผ๋ '์๋ ์
๋ก๋ ์ ์ฉ API(/api/auto-upload)'๊ฐ ์์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ์ค๋๋ฐ๋ผ ์๋ ์ ๋ก๋๊ฐ ์ ํ ๋์ง ์๊ณ ์๋ฌ ๋ก๊ทธ๋ง ์์ด๊ณ ์์์ต๋๋ค. ์์ธ์ ๋ถ์ํด ๋ณด๋ ํํํ๊ฒ๋ ๋ฒ์ธ์ ๋ฐ๋ก ์ ๊ฐ ๋ฉฐ์น ์ ์ ์ธํ ํ '์๋ ์ ํ ๊ท์น'์ด์์ต๋๋ค. ์ ์ฐฉํ ์๋ํ ๋ด์ด ๊ฒ์๊ธ ์ด๋ฏธ์ง์ ๋ฐ์ดํฐ๋ฅผ ์ฐ์์ผ๋ก ์๋ฒ์ ๋ฐ์ด ๋ฃ๋ ํ์๋ฅผ, ํด๋ผ์ฐ๋ํ๋ ์ด WAF๊ฐ "์ด? 10์ด์ 30๋ฒ ๋๊ฒ ์ ์ํ๋ค? ๋ ๋๋์ค ๊ณต๊ฒฉ์ด์ง? ์ฐจ๋จ!" ํ๊ณ ๋ง์๋ฒ๋ฆฐ ๊ฒ์ ๋๋ค. (์ผ๋ช False Positive, ์คํ์ง ๋ฌธ์ )
3. ์๋ฒฝํ ํธ๋ฌ๋ธ์ํ : WAF ์์ธ ์ฒ๋ฆฌ(Whitelist) ๊ท์น ์ถ๊ฐ
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ "๋ชจ๋ ์ ์์ ๊น๊นํ๊ฒ ๊ฒ์ฌํ๋, ๋ด๊ฐ ํ๋ฝํ ํน์ API ์ฃผ์๋ ์์ธ๋ก ํต๊ณผ์์ผ๋ผ"๋ผ๋ ์ ๊ตํ ๊ท์น ํ๋์ด ํ์ํ์ต๋๋ค.
์ ๋ ๋ค์ ํด๋ผ์ฐ๋ํ๋ ์ด WAF ํธ์ง ํ๋ฉด์ผ๋ก ๋ค์ด๊ฐ, ๊ธฐ์กด์ ๋ง๋ค์ด๋ ๊ท์น์ 'AND' ์กฐ๊ฑด์ ์ถ๊ฐํ์ฌ ์๋์ ๊ฐ์ด ๊ฐ์ ํ์ต๋๋ค.
์กฐ๊ฑด 1:
URI Pathcontains/(๋ชจ๋ ์ ์ ๊ฒ์ฌ)์กฐ๊ฑด 2 (์์ธ 1):
ANDURI Pathdoes not contain/api/auto-upload(์๋ ์ ๋ก๋ API๋ ๊ฒ์ฌ ์ ์ธ)์กฐ๊ฑด 3 (์์ธ 2):
ANDURI Pathdoes not contain/upload-api(์๋ธ ์ ๋ก๋ API๋ ์ ์ธ)

์ด๋ ๊ฒ ์ธํ ์ ์์ ํ๊ณ ๋๋, ์ ์ธ๊ณ์์ ๋ชฐ๋ ค์ค๋ ์ ์ฑ ๋๋์ค ๋ด๋ค์ ์ฌ์ ํ ์ฒ ํต๊ฐ์ด ํ๊ฒจ ๋๊ฐ๋ฉด์๋, ์ ์๋ ์ ๋ก๋ ๋ด์ ๋ฌด์ฌํ ํ๋ฆฌํจ์ค(Free Pass)๋ก ๊ฒ์๊ธ์ ์์ฑํ๊ธฐ ์์ํ์ต๋๋ค. ๊ทธ์ผ๋ง๋ก ์๊ตฐ๊ณผ ์ ๊ตฐ์ ์๋ฒฝํ๊ฒ ์๋ณํด ๋ด๋ ์ต๊ฐ์ ๋ฐฉ์ด๋ง์ด ์์ฑ๋ ์๊ฐ์ด์์ต๋๋ค.
๋งบ์ผ๋ฉฐ: 1์ธ ๊ฐ๋ฐ์์๊ฒ ๋ณด์์ ์ ํ์ด ์๋ ํ์
๋๋์ค ๊ณต๊ฒฉ์ ๋จ์ ์ด์ผ๊ธฐ์ธ ์ค๋ง ์์์ต๋๋ค. ํ์ง๋ง ์ฌ์ดํธ๋ฅผ ์ด์ํ๋ค ๋ณด๋ฉด ๊ทธ ๊ท๋ชจ์ ์๊ด์์ด ์๋ํ๋ ์ ์ฑ ๋ด๋ค์ ํ๋ฅญํ ํ๊น์ด ๋๋ค๋ ๊ฒ์ ์ด๋ฒ์ ๋ผ์ ๋ฆฌ๊ฒ ๊นจ๋ฌ์์ต๋๋ค.
์๋ฒ๊ฐ ํฐ์ง๊ณ ๋์ ์์ตํ๋ ค๋ฉด ์ด๋ฏธ ์ ์ ๋ค์ ๋ ๋๊ณ ๊ฒ์ ์์ง ์ต์ ํ(SEO) ์ ์๋ ๊น์ธ ๋ค์ ๋๋ค. ์ค๋ผํด ํด๋ผ์ฐ๋ ๊ฐ์ IaaS(์๋น์คํ ์ธํ๋ผ)๋ฅผ ์ง์ ๋ค๋ฃจ๋ 1์ธ ๊ฐ๋ฐ์๋ผ๋ฉด, ์๋ฒ ์ฝ๋ ์ต์ ํ๋ ์ค์ํ์ง๋ง ์๋ฒ ์๋จ์ ํด๋ผ์ฐ๋ํ๋ ์ด ๊ฐ์ WAF ๋ฐฉ์ด๋ฒฝ์ ์ธ์ฐ๊ณ ์ ์ ํ ์๋ ์ ํ ๋ฃฐ์ ์ ์ฉํ๋ ๊ฒ์ด ์ต์ฐ์ ๊ณผ์ ์์ ์์ง ์์ผ์ จ์ผ๋ฉด ํฉ๋๋ค.
์ค๋๋ ํธ๋ํฝ์ ๋ฐ๋ค์์ ๋ฌต๋ฌตํ ๋ด ์๋ฒ๋ฅผ ์งํค๋ฉฐ ๊ณ ๊ตฐ๋ถํฌํ๋ ๋ชจ๋ 1์ธ ๊ฐ๋ฐ์๋ถ๋ค์ ์์ํฉ๋๋ค!
โ ์์ฃผ ๋ฌป๋ ์ง๋ฌธ (FAQ)
Q1. ํด๋ผ์ฐ๋ํ๋ ์ด ๋ฌด๋ฃ(Free) ์๊ธ์ ๋ก๋ ์ด ์ ๋์ ๋๋์ค ๋ฐฉ์ด๊ฐ ๊ฐ๋ฅํ๊ฐ์? A. ๋ค, ์ถฉ๋ถํ ๊ฐ๋ฅํฉ๋๋ค. ๊ณผ๊ฑฐ์๋ ์๋ ์ ํ(Rate Limiting)์ด ์ ๋ฃ ๊ธฐ๋ฅ์ด์์ผ๋, ํ์ฌ๋ ์ปค์คํ WAF ๊ท์น ๋ด์์ ์ผ์ ํ์๊น์ง ๋ฌด๋ฃ๋ก ๊ฐ๋ ฅํ ๋ฐฉ์ด ๋ก์ง์ ์ง์ ์งค ์ ์๋๋ก ๊ฐ๋ฐฉ๋์์ต๋๋ค. 1์ธ ๊ฐ๋ฐ์ ์์ค์ ํธ๋ํฝ ๋ฐฉ์ด์๋ ์ฐจ๊ณ ๋์นฉ๋๋ค.
Q2. ์๋ ์ ํ์ ๊ฑธ๋ฉด ์ ์์ ์ธ ์ผ๋ฐ ์ ์์(์ ์ )๊ฐ ์ฐจ๋จ๋ ์ํ์ ์๋์? A. ์ผ๋ฐ์ ์ธ ์ฌ๋์ด ๋ง์ฐ์ค๋ฅผ ํด๋ฆญํ๊ณ ํ๋ฉด์ ์ฝ๋ ์๋๋ก๋ '10์ด์ 30ํ ์ด์์ ํ์ด์ง ์์ฒญ'์ ๋ฐ์์ํค๊ธฐ ๋ถ๊ฐ๋ฅ์ ๊ฐ๊น์ต๋๋ค. ๋ง์ฝ ์ ์ ์ ์ ๊ฐ ์ฐจ๋จ๋๋ค๋ฉด ๊ธฐ์ค์น(์: 10์ด๋น 50ํ)๋ฅผ ์กฐ๊ธ ๋ ๋๋ํ๊ฒ ์ํํด ์ฃผ๋ฉด ๋ฉ๋๋ค.
Q3. WAF์์ 'URI Path does not contain' ๋์ IP ์ฃผ์๋ก ์์ธ ์ฒ๋ฆฌ(Whitelist)๋ฅผ ํด๋ ๋๋์?
A. ๋ฌผ๋ก ์
๋๋ค! ๋ง์ฝ ์๋ ์
๋ก๋ ๋ด์ ์คํํ๋ ์๋ฒ์ IP๊ฐ ๊ณ ์ ๋์ด ์๋ค๋ฉด, IP Source Address is not 123.456.78.90 ์ฒ๋ผ ๊ณ ์ IP๋ฅผ ๋ฑ๋กํ๋ ๊ฒ์ด ๋ณด์์ ํจ์ฌ ๋ ์์ ํ๊ณ ํ์คํ ๋ฐฉ๋ฒ์
๋๋ค.
๐ฌ ๋๊ธ 0๊ฐ