Cloudeflare CDN ์ค์ ํ๊ธฐ
๐ฅ ๋ค์ด๊ฐ๋ฉฐ
์๋น์ค๋ฅผ ์ ์ด์ํด๊ฐ๋ ์์ค์ ์๋ฒ ๋ก๊ทธ์ ๋ถ๋ฏธ์ค๋ฌ์ด ๋ก๊ทธ๊ฐ ์ฐํ๋ค.
1
2
3
4
5
6
7
8
[2025-11-25 18:43:04.654] [request-c9be46222a2d41788f161d4fe715c7f5] [INFO ] [http-nio-8080-exec-4] day.widdle.widdle.global.log.filter.MDCLoggingFilter - --> GET /tests/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php
[2025-11-25 18:43:04.655] [request-c9be46222a2d41788f161d4fe715c7f5] [INFO ] [http-nio-8080-exec-4] day.widdle.widdle.global.log.filter.MDCLoggingFilter - <-- 404 GET /tests/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php (1ms)
[2025-11-25 18:43:04.845] [request-44ff4369a08245ec818fbc81990cf3ea] [INFO ] [http-nio-8080-exec-2] day.widdle.widdle.global.log.filter.MDCLoggingFilter - --> GET /test/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php
[2025-11-25 18:43:04.846] [request-44ff4369a08245ec818fbc81990cf3ea] [INFO ] [http-nio-8080-exec-2] day.widdle.widdle.global.log.filter.MDCLoggingFilter - <-- 404 GET /test/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php (1ms)
[2025-11-25 18:43:05.010] [request-6730b3475622444cb6f17b2af798857a] [INFO ] [http-nio-8080-exec-9] day.widdle.widdle.global.log.filter.MDCLoggingFilter - --> GET /testing/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php
[2025-11-25 18:43:05.012] [request-6730b3475622444cb6f17b2af798857a] [INFO ] [http-nio-8080-exec-9] day.widdle.widdle.global.log.filter.MDCLoggingFilter - <-- 404 GET /testing/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php (2ms)
[2025-11-25 18:43:05.154] [request-d8bd8f79c7294fb1a310ce4d4582725a] [INFO ] [http-nio-8080-exec-5] day.widdle.widdle.global.log.filter.MDCLoggingFilter - --> GET /api/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php
[2025-11-25 18:43:05.155] [request-d8bd8f79c7294fb1a310ce4d4582725a] [INFO ] [http-nio-8080-exec-5] day.widdle.widdle.global.log.filter.MDCLoggingFilter - <-- 400 GET /api/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php (1ms)
Widdle์ ํ ์ด ํ๋ก์ ํธ๋ก ๋ง๋ค์ด์ก๊ณ , Kordle์ ๋ด๋ถ ๋ก์ง์ด ๊ถ๊ธํ์ฌ ๊ฐ๋ฐํ๊ฒ ๋ ์๋น์ค์ด๋ค. Kordle์ด ํ๋ฃจ์ ํ ๋ฌธ์ ์ด๊ธฐ ๋๋ฌธ์ Kordle์ ํ๊ณ ๋ ์ฃผ๋ณ ์ง์ธ๋ค์ด ์์ฌ์์ ๋ด ์๋น์ค๋ฅผ ์ด์ฉํ๊ณค ํ๋ค. ๋ถ๋ชจ๋๋ ์น๋งค ์๋ฐฉ์ ํ๊ฒ ๋ค๋ฉฐ ์ด์ฉํ๊ธฐ ๋๋ฌธ์ ๊ทธ์ EC2์ Vercel์ ๋ฐฐํฌํด๋์ ์ํ๋ก ์ฒ์ฒํ ์ ์ง๋ณด์ํ๋ค๊ฐ ์ต๊ทผ ํฌํ ์ ๋ถํธ์บ ํ ๋ด์์ ์๋์น์์ ๋ถ์ด ์ผ์ด ๋ค์ ๋ฒ๋ํ๊ธฐ ์์ํ๋ค.
๊ทธ๋ฐ๋ฐ ์ต๊ทผ ์ด์ํ ๋ก๊ทธ๊ฐ ์ฐํ ์ด์ ๋ํด ์ ๋ฏธ๋์ด์๊ฒ ๋ฌผ์ด๋ณด๋ ๋น์ ์์ ์ธ ๋ด ์ ๊ทผ์ด๋ฉฐ, ๋ฐฉ์นํ ๊ฒฝ์ฐ ๋ณด์์ ํฐ ์ํ์ด ๋ ์ ์๋ค๊ณ ํ๋ ๊ฒ์ด๋ค. ๋๋ ๊ทธ๋ ๊ฒ Cloudflare CDN์ ์ถ๊ฐํ๊ฒ ๋์๋ค.
โ๏ธ Cloudflare CDN
์ Cloudflare๋ฅผ ์ ํํ์์๊น? ์ฐ์ ๋น์ฅ ๋ฐ๋ก ํ์ํ๊ธฐ ๋๋ฌธ์ ์ค์ ์ด ๊ฐํธํด์ผํ๊ณ , ๋ ์๋ ์ทจ์ค์ ์ ์ฅ์์ ๋ฌด๋ฃ๋ผ๋ ๊ฒ์ด ๋ฉ๋ฆฌํธ๊ฐ ๊ฝค ์ปธ๋ค.
Cloudflare๋ CDN ์บ์ฑ์ ํตํ ์น ์ฌ์ดํธ์ ๋ก๋ฉ ํน์ ๋ค์ด๋ก๋ ์๋๋ฟ๋ง ์๋๋ผ HTTPS, TLS/SSL๋ฅผ ์ฌ์ฉํ ๊ธฐ๋ณธ์ ์ธ ๋ณด์ WAF, DDoS, Bot ๊ด๋ฆฌ ๋ฑ์ ๋ณด์ ๊ธฐ๋ฅ๋ ์ ๊ณตํ๋ค.
๋๋ Vercel๋ก ํ๋ก ํธ์๋๋ฅผ ๋ฐฐํฌํ๊ณ ์๋ฒ๋ฅผ EC2๋ก ๋ฐฐํฌํ ์ํ์๋ค. ๋ด๊ฐ ํ ์ผ์ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด Vercel์ด ์๋ Cloudflare๋ก ๊ฐ๊ฒ ํ๋ฉด ๋๋ ๊ฒ์ด์๋ค.
Domain ์ฐ๊ฒฐํ๊ธฐ
์ฐ์ Enter an existing domain ์นธ์ ๋์ ๋๋ฉ์ธ์ ์ ๋ ฅํด์ค๋ค. ๋๋ Quick scan for DNS records ์ํ๋ก continue ๋ฒํผ์ ๋๋ ๋ค.
๊ทธ๋ผ ์์ ๊ฐ์ ํ๋ ์ ํ ์ฐฝ์ด ๋ฌ๋ค. ๋๋ ๋น์ฐํ Free๋ฅผ ๊ณจ๋๋ค.
ํน์๋ ๋ฌธ์ ๊ฐ ๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด ๊ฐ๋ ค๋จ๋ค.
๋ด Widdle์ ๋ณด๋ฉด ์๊ฒ ์ง๋ง .day ๋๋ฉ์ธ์ ์ฌ์ฉํ๊ณ ์๋ค. ์ด ๋๋ฉ์ธ์ด AWS Route53์์ ์ง์ํ๋ ๋๋ฉ์ธ์ด ์๋๊ธฐ ๋๋ฌธ์ ๊ฐ๋น์์์ ๊ตฌ๋งคํ ์ํ์๋ค. ๊ทธ๋์ ๊ฐ๋น์ ๋ค์์๋ฒ ์ํ๊ฐ ์๋์ ๊ฐ์๋ค.
์ด์ ์ด ๊ฐ๋น์ ๋ค์์๋ฒ์ ์์์ ์ป์ Cloudflare ๋ค์์๋ฒ๋ฅผ ์ฐ๊ฒฐํด์ฃผ๋ฉด ๋๋ค.
WAF ์ค์ ํ๊ธฐ
CDN๋ง ์ฐ๊ฒฐํด์๋ ๋ฌธ์ ๊ฐ ๋๋์ง ์๋๋ค. WAF๋ฅผ ์ค์ ํด์ค์ผ ํ๋ค.
๋๋ ์ด๋ ๊ฒ ์ฌ๋ฌ๊ฐ๋ฅผ ์์ฑํด์คฌ๋ค.
Block Bot Scans
1
2
3
4
5
6
7
(http.request.uri.path contains "phpunit") or
(http.request.uri.path contains ".php") or
(http.request.uri.path contains "wp-admin") or
(http.request.uri.path contains "wp-content") or (http.request.uri.path contains ".env") or
(http.request.uri.path contains ".git") or
(http.request.uri.path contains "phpmyadmin") or
...
์ ์ผ ๋จผ์ ํธ๋ํฝ์ ์ฌ๋ฆฌ๋ ๋ด๋ค์ด ํด๋น uri๋ค์ ๊ณ์ ๋ถ๋ฌ์ค๋ ค๋ ์๋๊ฐ ์์๊ธฐ ๋๋ฌธ์ uri๊ฐ ์์ ์ blockํ๋๋ก ์ค์ ํด์คฌ๋ค.
Challenge Bad Bots
1
2
3
(http.user_agent contains "scanner") or
(http.user_agent contains "bot") or
(http.user_agent eq "")
User Agent๊ฐ scanner, bot์ด๊ฑฐ๋ ๊ฐ์ด ๋น์ด์์ ์ blockํ๋ ๊ฒ์ด ์๋ Managed Challenge๊ฐ ๋๋๋ก ํด์ฃผ์๋ค. Managed Challenge๋ก ์ค์ ํ๋ฉด ํด๋น ์กฐ๊ฑด์ ๊ฑธ๋ ธ์ ๋ ํ
์คํธ๋ฅผ ์คํ์ํจ๋ค. ์ ์์ ๋ฐ๋ผ ๋ค๋ฅธ๋ฐ, ์ ์๊ฐ ๋์ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ์ฆ๋ช
๊ฐ์ ๋น๋ํํ ํ
์คํธ๋ CAPTCHA์ ๊ฐ์ ๋ณต์กํ ํ
์คํธ๋ฅผ ํ๊ธฐ๋ ํ๋ค.
Geo Blocking Rule
์ด ๊ท์น์ CDN์ ์ฐ๊ฒฐํ ๋ค ๊ฝค ์๊ฐ์ด ์ง๋ ๋ค์ ์ถ๊ฐํ ๊ฒ์ธ๋ฐ, ๋์ ๊ฒฝ์ฐ ํด๋๋์ ๋ค๋๋๋์์ ์ง์ค์ ์ธ ๋ด ๊ณต๊ฒฉ์ด ์ผ์ด๋ฌ๊ธฐ ๋๋ฌธ์ ํด๋น ๋ ๊ตญ๊ฐ๋ฅผ block ์ํค๊ฒ ๋์๋ค.
1
2
(ip.src.country eq "NL") or
(ip.src.country eq "PL")
VPN์ ์ฌ์ฉํด์ ๋ด์ ๋๋ฆด ๊ฒ์ ์์ง๋ง ์ผ๋จ ๋ ์์ ํธ๋ํฝ์ ๋ง์์ผ ํธ๊ธฐ์ ์ด๋ฐ ๊ฒฐ์ ์ ๋ด๋ ธ๋ค.
Access Rule
์ด ๊ท์น์ IP๋ฅผ block ์ํค๊ธฐ ์ํด ๋ง๋ค์๋ค.
1
2
(ip.src eq 194.___.__.___) or
(ip.src eq 35.___.__.___)
ํน์ ๋ชฐ๋ผ์ ๋ง์คํน ํด์ ์ฌ๋ฆฐ๋ค. ํด๋น ์์ดํผ ์ฃผ์์์ ๊ณ์ ๋น์ ์์ ์ธ uri๋ก ์ ๊ทผํ๋ ค ํ๊ธฐ์ ๋ง๊ฒ ๋์๋ค.
Global API Rate Limit
์ด๊ฑด ํน์ ๋ชฐ๋ผ์ ์ถ๊ฐํด๋์ ๊ท์น์ด๋ค. 10์ด๊ฐ 30ํ ์ด์์ ์์ฒญ์ด ํ ์์ดํผ์์ ๋ค์ด์ฌ ์ block๋๋๋ก ์ค์ ํ์๋ค.
1
(http.request.uri.path contains "/")
EC2 ALB ์ธ๋ฐ์ด๋, ์์๋ฐ์ด๋ ๊ท์น ์์
์ด๋ ๊ฒ ์ค์ ์ ํด๋์ผ๋ Cloudflare๋ฅผ ์ฐํํ์ฌ ์ง์ ๋ด์ด ์์ฒญ์ ๋ณด๋ด๋ ์ํฉ์ด ๋ฒ์ด์ก๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด EC2 ๋ก๋๋ฐธ๋ฐ์์ ์ธ๋ฐ์ด๋ ๊ท์น์ ์์ ํ๊ฒ ๋์๋ค. Cloudflare Ip ๋ฒ์ ์ฌ์ดํธ์ ๋ค์ด๊ฐ EC2 ์ธ๋ฐ์ด๋, ์์๋ฐ์ด๋ ๊ท์น์ ์ถ๊ฐํด์ฃผ์๋ค.
๋จผ์ VPC -> ๊ด๋ฆฌํ ์ ๋์ฌ ๋ชฉ๋ก์ Cloudflare Ip ๋ฒ์๋ฅผ ์ถ๊ฐํด์ฃผ์๋ค.
๊ทธ๋ฆฌ๊ณ EC2 ALB์ ์ธ๋ฐ์ด๋์ ์์๋ฐ์ด๋์์ ํด๋น ๋ชฉ๋ก๋ค์ ๋ถ๋ฌ์ ์ถ๊ฐํด์ฃผ์๋ค.
โจ ๋๋ ์
ํ์คํ CDN์ ๋ถ์ฌ์ ๊ด๋ฆฌํ๋ ์ธ๋ชจ์๋ ๋ก๊ทธ๊ฐ ์๊ธฐ์ง ์์ ์ข์๋ค.
๊ทธ๋ฆฌ๊ณ Cloudflare์ ๋ค์ด๊ฐ ๊ธฐ๋ก์ ๋ณด๋ ํ์คํ ์ ๋ง์์ฃผ๊ณ ์๋ ๊ฒ ๊ฐ์์ ์์ฌ์ด ๋์๋ค. ๋ํ Cloudflare์์ ์๊ฐ, IP๋ณ๋ก ๋ก๊ทธ๋ฅผ ๋ณผ ์ ์์ด ์ด์๊ณผ ์ ์ง๋ณด์์ ํฐ ๋์์ด ๋ ๊ฒ ๊ฐ๋ค.










