우리가 Cloudflare를 쓴 이유 — 정적 블로그의 3겹 방어

우리가 Cloudflare를 쓴 이유 — 정적 블로그의 3겹 방어

· #cloudflare · #security · #aticaa · English

블로그를 열고 이틀째, 트래픽 통계를 열어봤다. 7일간 요청 5,000건, 접속 국가 26개.

글 세 편짜리 신생 블로그에? 설렘은 10초 만에 끝났다. 뜯어보니 80%가 4xx 오류 (4,000건), json 파일을 더듬는 프로브가 3,650건, 접속 1위 국가는 네덜란드 — VPS 호스팅 밀집 지역이다. 방문자가 아니라 취약점 스캐너였다.

새 도메인이 DNS에 등록되는 순간부터 봇들은 온다. 워드프레스 관리자 페이지를 찾고, .env 파일을 더듬고, 공개된 취약점의 공격 코드를 아무 데나 던져본다. 상대가 글 세 편짜리 블로그인지 확인도 하지 않는다.

그런데 우리는 이미 방어선이 세 겹이었다. 전부 무료로. 이 글은 그 이유다.

DNS가 아니라 프록시다

aticaa.io의 DNS는 Cloudflare가 맡고 있다. 그런데 Cloudflare의 진짜 가치는 DNS(주소 안내판)가 아니다. DNS 레코드 옆의 주황색 구름 아이콘 — 프록시다.

구름이 회색이면 Cloudflare는 주소만 알려주고 비켜선다. 주황이면 모든 트래픽이 Cloudflare의 엣지를 통과한다. 그리고 그 길목에서 이런 것들이 공짜로 일어난다:

국내 도메인 등록대행사의 DNS는 말 그대로 안내판까지만 한다. 국내에도 WAF·CDN 서비스는 있지만 전부 기업용 유료 상품이고, “개인에게 이 세트를 무료로”라는 티어 자체가 없다. Cloudflare 무료 플랜이 세계적으로도 이례적인 것이다.

3겹 방어선

이 블로그에 도달하는 악성 요청은 세 개의 문을 통과해야 한다. 통과할 수 없다.

1겹 — Cloudflare 관리 규칙. 어제 로그에 프랑스의 AWS 서버 한 대가 던진 요청 3건이 차단으로 찍혀 있었다. 우리가 아무 설정도 하지 않은, 무료 플랜에 기본 포함된 관리 룰셋이 알려진 익스플로잇 패턴을 잡아낸 것이다.

2겹 — 커스텀 WAF 규칙. 워드프레스 스캐너들이 두드리는 경로(/wp-, .php, /.env, /.git 등)를 문 앞에서 차단하는 규칙을 하나 만들었다. 정적 사이트라 이 경로들은 어차피 404지만, 봇에게는 404 응답조차 아깝다.

설계에서 배운 것 두 가지. /admin을 “포함” 조건으로 잡으면 /posts/admin-ux-design 같은 미래의 정상 글까지 차단된다 — “시작함” 조건으로 바꿨다. 그리고 규칙을 존 전체에 걸면 같은 존의 API 서브도메인까지 오폭한다 — 호스트를 블로그로 한정했다. 차단 규칙은 만들 때보다 오탐을 설계할 때 실력이 드러난다.

3겹 — 정적 사이트라는 본질. 최후의 방어선이자 최강의 방어선. 이 블로그에는 서버 코드가 한 줄도 없다. 로그인도, DB도, 실행되는 것 자체가 없다. 뚫을 것이 없는 집은 뚫리지 않는다.

정직한 트레이드오프

공짜 점심은 없다는 원칙대로, 두 가지는 알고 쓰는 게 맞다.

단일 의존. 모든 트래픽이 Cloudflare를 지나므로, Cloudflare가 장애 나면 같이 죽는다. 실제로 몇 년에 한 번씩 전 세계 인터넷의 절반이 함께 멈추는 날이 있다. 우리는 그 위험을 알고 받아들였다 — 개인 블로그의 가용성 요구사항과 맞바꾼 것 치고는 남는 장사다.

무료 플랜의 국내 라우팅. 과거엔 무료 플랜의 한국 트래픽이 국내 통신사와의 피어링 비용 문제로 해외 엣지를 우회해 느리다는 악명이 있었다. 지금은 많이 개선됐고, 우리처럼 정적+캐시 구성이면 체감은 더 작다. 그래도 국내 트래픽이 커지면 실측해볼 항목으로 적어뒀다.

그리고 Cloudflare가 왜 이걸 공짜로 주는지도 생각해볼 만하다. 무료 사용자들의 트래픽은 그들의 위협 탐지망을 학습시키는 센서다. 어제 우리 블로그를 두드린 스캐너의 패턴도 지금쯤 어딘가의 시그니처가 됐을 것이다. 우리는 요금 대신 데이터를 내고 있다 — 쿠키리스 통계를 골랐던 우리 기준으로도, 이건 수용 가능한 거래였다.

요약

정적 블로그를 만든다면:

  1. DNS를 Cloudflare로 옮기고 구름을 주황으로 켜라 — 그게 전부다
  2. 커스텀 규칙 5개 중 하나로 스캐너 경로를 차단하라 — 단, 오탐을 먼저 설계하라
  3. 나머지는 정적 사이트라는 본질이 지켜준다

봇들은 오늘도 온다. 우리는 어제도 잤다.

기록은 계속된다.