Post

Cloudeflare CDN ์„ค์ •ํ•˜๊ธฐ

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๋ณ„๋กœ ๋กœ๊ทธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์–ด ์šด์˜๊ณผ ์œ ์ง€๋ณด์ˆ˜์— ํฐ ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

This post is licensed under CC BY 4.0 by the author.