블로그를 운영하다 보면 서버 로그에 정체 모를 IP들이 들어와 환경설정 파일이나 관리자 페이지를 찌르는 모습을 자주 보게 됩니다. 클라우드플레어(Cloudflare)를 사용하고 있는데도 왜 이런 일이 벌어질까요? 이유는 간단합니다. 공격자들이 도메인이 아닌 서버의 실제 공인 IP를 알아내서 뒷문으로 직접 들어오기 때문입니다.
오늘은 이 뒷문을 완전히 봉쇄할 수 있는 보안 기능, 클라우드플레어 보안 Authenticated Origin Pulls 설정 방법을 정리해 드립니다.
목차
클라우드플레어 보안 Authenticated Origin Pulls란?
이 기능은 한마디로 “클라우드플레어가 발급한 전용 신분증(인증서)이 없는 접속은 서버가 즉시 거부”하게 만드는 설정입니다. 도메인을 거치지 않고 서버 IP로 직접 들어오는 모든 공격(Direct IP Attack)을 서버 입구에서 컷트할 수 있습니다.
특히 서버 사용자라면 반드시 설정해야 합니다. 전 세계 봇들이 무료 인스턴스 IP 대역을 매일같이 훑고 있기 때문이죠.
1단계: Cloudflare 대시보드 설정
먼저 클라우드플레어 측에서 “이제부터 접속할 때 신분증을 보여주겠다”라고 설정해야 합니다.
- Cloudflare 관리 화면 좌측 사이드바에서 SSL/TLS 메뉴를 클릭합니다.
- 하위 메뉴 중 원본 서버(Origin Server)를 선택하세요.
- 화면 중간의 인증된 원본 풀(Authenticated Origin Pulls) 항목을 찾아 스위치를 On으로 켭니다.

주의사항 (필독): 클라우드플레어에서 스위치만 켜고 내 서버 설정을 안 하면, 서버가 인증서를 요구하는데 클라우드플레어는 인증서를 안 보내는 엇박자가 발생해 사이트 접속이 안 될 수 있습니다. 반드시 아래 순서를 지켜주세요.
2단계: Ubuntu 서버(Nginx) 인증서 준비
이제 서버가 클라우드플레어의 신분증을 알아볼 수 있도록 인증서 파일을 미리 받아두어야 합니다. 터미널에서 아래 명령어를 입력하세요.
# 인증서 저장 디렉토리 생성
sudo mkdir -p /etc/nginx/ssl
# Cloudflare 공식 인증서 다운로드
sudo wget https://developers.cloudflare.com/ssl/static/authenticated_origin_pull_ca.pem -O /etc/nginx/ssl/authenticated_origin_pull_ca.pem인증서 다운로드가 완료되면 서버는 클라우드플레어를 식별할 준비가 된 것입니다.
3단계: Nginx 설정 수정 (최종 적용)
썸네일 재생성 같은 무거운 작업이 진행 중이라면 작업이 끝난 뒤 적용하는 것이 안전합니다. 준비가 되었다면 Nginx 설정 파일을 엽니다.
sudo nano /etc/nginx/sites-available/default
# 또는 사용 중인 사이트 설정 파일 (예: /etc/nginx/sites-available/)listen 443 ssl; 블록을 찾아 아래 내용을 추가합니다. 단순히 차단만 하는 것이 아니라, 서버 내부 알림(wp-cron)이 막히지 않도록 예외 처리가 포함된 코드입니다.
ssl_client_certificate /etc/nginx/ssl/authenticated_origin_pull_ca.pem;
# [수정] 외부 공격(IP 직접 접속 등)은 막고, 일반 사용자 및 봇은 허용
ssl_verify_client optional;
set $should_block "0";
# 1. 인증서가 없는 경우 (일반 방문자 및 봇)
if ($ssl_client_verify != SUCCESS) {
set $should_block "1";
}
# 2. 하지만 정상적인 도메인으로 접속한 경우 허용
if ($host ~* "도메인") {
set $should_block "0";
}
# 3. 검색 엔진 봇 및 SNS 크롤러 허용
if ($http_user_agent ~* (googlebot|bingbot|naverbot|facebookexternalhit|twitterbot|kakaotalk-scrap)) {
set $should_block "0";
}
# 4. 서버 내부 통신(wp-cron 등) 허용
if ($remote_addr = "127.0.0.1") {
set $should_block "0";
}
# 위 조건에 해당하지 않는 '수상한 접속'만 400 반환
if ($should_block = "1") {
return 400;
}저장 후 설정을 적용합니다.
sudo nginx -t
sudo systemctl reload nginx설정 후 무엇이 달라지나요?
1. 공격 경로 원천 봉쇄
그동안 공격자들은 도메인 공격이 막히면 서버 IP(132.x.x.x)로 직접 접속하는 방식을 사용할수 있습니다. 이제는 클라우드플레어의 전용 신분증이 없으면 서버가 400 Bad Request 에러를 뱉으며 아예 응답하지 않습니다.
2. 로그 정화 및 리소스 절약
로그에서 보이던 /nmaplowercheck나 /.env 같은 지저분한 스캔 공격들이 사라집니다. 서버의 소중한 CPU 자원을 봇들에게 낭비하지 않아도 됩니다.
3. 내부 시스템 유지
ssl_verify_client optional 로직 덕분에 외부 공격은 막으면서도, 서버 내부에서 발생하는 워드프레스 예약 작업이나 휴대폰 알림 전송은 차단되지 않고 항상 정상 작동합니다.
실시간 확인 방법
설정을 마쳤다면 정말 잘 막히는지 테스트해 보세요. 스마트폰에서 와이파이를 끄고 LTE 상태로 접속합니다.
- 도메인(openipc.kr) 접속: 평소처럼 사이트가 잘 열려야 합니다.
- 서버 IP 주소 직접 입력: 브라우저에 도메인 대신 서버 IP를 직접 치고 들어갔을 때 400 Bad Request가 뜨면 성공입니다!
이제 서버는 앞문과 뒷문이 모두 튼튼하게 잠긴 안전한 요새가 되었습니다. 워드프레스 사용자라면 지금 바로 적용해 보세요.

