개요
CDN을 처음 도입하거나 설정을 변경한 직후, 예상치 못한 오류가 발생하는 경우가 많습니다. 특히 Cloudflare와 AWS CloudFront는 기능이 강력한 만큼 설정 포인트가 다양해 사소한 옵션 하나로도 장애가 발생할 수 있습니다. 이 글에서는 Cloudflare/AWS CloudFront 환경에서 자주 겪는 설정 오류를 실전 사례로 설명하고, 단계별 트러블슈팅 방법과 재발 방지 팁을 제공합니다. 실무에서 바로 사용할 수 있는 cURL 명령, 헤더 판독법, 룰 셋팅 예시, 권장 정책을 함께 정리했습니다.
CDN 트러블슈팅의 원칙
- 문제 범위 축소: DNS, 엣지(Cloudflare/CloudFront), 오리진(서버/S3), 클라이언트(브라우저/네트워크) 중 어디에서 문제가 발생하는지 먼저 구분합니다.
- 계층별 가설 검증: 헤더와 상태 코드를 통해 캐시 여부, SSL/TLS 상태, WAF 차단 등을 구분합니다.
- 재현 가능한 최소 케이스: 특정 URL, 특정 HTTP 메서드, 특정 헤더 조합으로 최소 재현 사례를 만들고 반복 검증합니다.
- 변경 이력 확인: 최근 배포, 인증서 갱신, DNS TTL 만료, 정책 변경 등의 변경 이벤트를 우선 확인합니다.
필수 도구와 관찰 포인트
- 브라우저 개발자 도구: 네트워크 탭에서 요청/응답 헤더, 리다이렉트 체인, 캐시 히트 여부를 확인합니다.
- cURL: 정확한 헤더 제어와 응답 분석을 위해 필수입니다.
- 헤더 키 포인트:
- Cloudflare: cf-cache-status, cf-ray, server: cloudflare
- CloudFront: X-Cache, Via, X-Amz-Cf-Pop, X-Amz-Cf-Id
- 공통: Age, Cache-Control, Vary, Set-Cookie, Location, Content-Type
- 로그/콘솔:
- Cloudflare: Analytics → Firewall Events, Rules, DNS, SSL/TLS, Caching, Cache Rules
- CloudFront: Standard/Real-time logs, CloudWatch, Origin/Cache/Response policies, AWS WAF logs
- 오리진: 웹서버 로그(Nginx/Apache), 애플리케이션 로그, S3 서버 액세스 로그
예제 cURL 명령:
# 헤더만 확인
curl -I https://www.example.com/
# Cloudflare/CloudFront를 우회하고 오리진 직접 확인 (DNS 해석 제어)
# 203.0.113.10에는 오리진 IP를, Host에는 프로덕션 호스트명을 유지
curl -I --resolve www.example.com:443:203.0.113.10 https://www.example.com/
# TLS 세부 확인
curl -Iv https://www.example.com/
# 캐시 무효화 테스트(조건부 요청/리밸리데이트 유도)
curl -I -H "Cache-Control: no-cache" https://www.example.com/
자주 발생하는 문제 지도
- DNS/도메인
- 잘못된 CNAME/레코드, Apex 도메인 플래트닝 문제, TTL 전파 지연
- SSL/TLS
- 인증서 만료/도메인 미포함, SNI/호스트 불일치, Cloudflare Flexible 모드로 인한 루프
- 캐싱/키
- HTML 비의도적 캐시, 쿠키/헤더 포워딩 과다로 캐시 파편화, 캐시 무효화 누락
- 리다이렉트/프로토콜
- HTTP→HTTPS 이중 리다이렉트, CloudFront Viewer 정책과 오리진 강제 리다이렉트 충돌
- 권한/접근 제어
- CloudFront OAI/OAC와 S3 버킷 정책 불일치, WAF/방화벽 차단, 지오 차단
- 오리진 가용성/성능
- 5xx(타임아웃, 커넥션 리셋), 높은 TTFB, Keep-Alive 비활성, CORS 설정 오류
아래부터 Cloudflare와 CloudFront 각각에 대해 실전 사례를 다룹니다.
Cloudflare 트러블슈팅
1) Flexible SSL로 인한 HTTPS 리다이렉트 루프
증상
- 브라우저에서 ERR_TOO_MANY_REDIRECTS
- DevTools에서 https→http→https 무한 리다이렉트
- Cloudflare 대시보드 SSL/TLS 모드가 Flexible
원인
- Flexible은 엣지(사용자↔Cloudflare)만 HTTPS, 오리진(Cloudflare↔서버)은 HTTP로 통신합니다.
- 오리진이 HTTPS 강제 리다이렉트(Nginx 301, HSTS 등)를 적용하면 루프가 발생합니다.
해결
- SSL/TLS를 Full(Strict)로 전환
- 오리진에 유효한 인증서 설치(권장: Cloudflare Origin Certificate 또는 Let’s Encrypt)
- Nginx 예시:
# 80 → 443 리다이렉트는 유지
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/ssl/certs/origin.crt;
ssl_certificate_key /etc/ssl/private/origin.key;
# 앱 로직 ...
}
예방 팁
- 신규 도메인 연결 시 SSL 모드는 처음부터 Full(Strict)을 기본값으로 설정
- 인증서 자동 갱신(Let’s Encrypt) 또는 Cloudflare Origin CA + 긴 유효기간 사용
2) 521/522/523/525/526 오류 코드 판독
- 521: 오리진 연결 거부. 방화벽/Fail2Ban/iptables/CSF에서 Cloudflare IP가 차단되었거나, 웹서버가 다운.
- 522: 연결 타임아웃. 오리진 과부하, 네트워크 이슈, 장시간 블로킹 요청.
- 523: 원래 DNS 문제. Cloudflare가 오리진을 찾지 못함.
- 525: SSL 핸드셰이크 실패. 인증서 체인 불완전, SNI 불일치, 약한 암호 스위트.
- 526: 인증서 유효성 실패. Full(Strict)에서 오리진 인증서가 도메인을 포함하지 않음.
즉시 점검 체크리스트
- 오리진 IP에서 443 포트 열림, 방화벽 화이트리스트에 Cloudflare IP 범위 추가
- 오리진 인증서 체인(Intermediate) 포함, 도메인 일치, 만료 확인
- Cloudflare의 DNS 레코드가 최신 오리진 IP를 가리키는지 점검
cURL 확인
# 오리진 직접 TLS 확인
curl -Iv --resolve www.example.com:443:203.0.113.10 https://www.example.com/
3) cf-cache-status로 캐시 상태 진단
- HIT: 캐시 적중
- MISS: 캐시 없음(첫 요청/새 키)
- EXPIRED: 만료되어 재검증 필요
- BYPASS: 규칙/헤더로 캐시 우회
- DYNAMIC: 기본적으로 캐시하지 않는 컨텐츠
빠르게 보는 지표
curl -I https://www.example.com/app.js
# cf-cache-status: HIT
# age: 12345
실전 문제
- HTML이 의도치 않게 캐시되어 로그인 상태가 섞임
- 이유: Cache Everything 규칙 + 쿠키 무시
해결
- Cloudflare Rules → Cache Rules:
- 경로: *.html
- Cache: Bypass 또는 Respect origin Cache-Control
- 혹은 조건부로 로그인 쿠키가 존재하면 Bypass
- 동적 페이지는 BYPASS, 정적 에셋은 장기 캐시 전략으로 구분
예시(Cache Rules 개념)
- If: http.request.uri.path contains ".html" OR http.request.headers["cookie"] contains "session="
- Then: Cache: Bypass
4) DNS/CNAME/오리진 호스트 불일치
증상
- 특정 서브도메인만 403/404
- Cloudflare 프록시(오렌지 구름) 활성화 시만 문제가 발생
- 오리진이 SNI/Host 기반 라우팅을 사용
원인
- 오리진 서버가 Host 헤더 기준으로 가상호스트를 나누는데, Cloudflare 설정에서 잘못된 레코드를 가리키거나 오리진이 해당 Host를 인식하지 못함
진단
- 오리진 직결 요청으로 Host 헤더 테스트:
curl -I --resolve app.example.com:443:203.0.113.10 https://app.example.com/
해결
- 오리진 웹서버의 server_name에 해당 호스트 추가
- Cloudflare DNS 레코드 값이 최신 오리진 IP/CNAME을 가리키는지 확인
- 필요 시 Origin Rules로 백엔드에 전달되는 Host 헤더 재정의
5) 페이지 규칙/리다이렉트 규칙으로 인한 루프와 누락
현상
- www ↔ non-www 사이 무한 리다이렉트
- HTTP→HTTPS, 언어/국가 기반 리다이렉트 중복
조치
- Cloudflare Rules → Redirect Rules를 단일 소스로 관리
- 조건 충돌 확인(최상위 규칙부터 매칭)
- 오리진에서도 동일 리다이렉트를 구현했다면 한쪽만 남김
테스트
- DevTools에서 리다이렉트 체인 확인
- cURL로 -L 옵션 없이 헤더만 추적
curl -I https://example.com/
6) WAF/보안 기능으로 인한 오탐
징후
- 일부 사용자만 403, cf-ray 포함
- Bot Fight Mode, Super Bot Fight, Rate Limiting 활성 상태
- 특정 국가/자치망에서만 발생
대응
- Security → Events에서 차단 로그 확인, 규칙 ID/서비스 파악
- 해당 경로/메서드에만 예외 처리(Custom rules)
- API나 웹훅 엔드포인트는 User-Agent, Rate Limit, 인증 체계를 명확히
- 일시적으로 로그-온리(Log only)로 전환 후 패턴 분석
7) 성능/TTFB가 느린 경우
진단 포인트
- cf-cache-status가 DYNAMIC/MISS이면 오리진 TTFB가 그대로 노출
- 오리진 Keep-Alive, 데이터베이스 N+1, 외부 API 대기 등 확인
- Cloudflare Tiered Cache, Early Hints(103), Argo Smart Routing 고려
실무 팁
- HTML도 캐시 가능한 구간을 구분(로그인 전/후 분리)
- Cache Keys에서 불필요한 쿼리스트링/쿠키를 제외해 파편화 감소
- 이미지/정적 리소스는 장기 캐시 + 파일명 버전 관리
AWS CloudFront 트러블슈팅
1) S3 오리진 403 AccessDenied/OAC(OAI) 정책 오류
증상
- CloudFront X-Cache: Error from cloudfront, 403 AccessDenied
- S3 정적 웹 호스팅과 혼용 시 301/307 리다이렉트
권장 구성
- S3 REST 엔드포인트 + Origin Access Control(OAC) 사용
- 버킷 퍼블릭 접근 차단 유지
대표 버킷 정책(OAC):
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCloudFrontOAC",
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::123456789012:distribution/EDFDVBD6EXAMPLE"
}
}
}
]
}
점검
- CloudFront 배포가 OAC를 사용하도록 연결됐는지
- 버킷 정책의 Resource, SourceArn이 정확한지
- S3 접근 로그에서 CloudFront 서명 요청이 들어오는지
오류 사례
- S3 Website endpoint를 오리진에 설정 → 인덱스/에러 문서 리다이렉트 혼선
- 해결: S3 REST 엔드포인트로 오리진 재설정, OAC 적용
2) Alternate Domain Name(CNAME) 미등록으로 인한 403
증상
- CloudFront를 CNAME으로 연결했으나 403 The request could not be satisfied
- X-Cache: Error from cloudfront
원인
- CloudFront 배포에 도메인을 Alternate domain name으로 등록하지 않음
- ACM 인증서에도 해당 도메인이 포함되어 있지 않음(us-east-1 리전 필수)
해결
- CloudFront → Settings → Alternate domain names에 도메인 추가
- AWS Certificate Manager(us-east-1)에서 인증서 발급 및 배포 연결
- DNS CNAME을 CloudFront 도메인으로 지정
- Cloudflare를 앞단에서 사용할 경우에도 CloudFront 배포는 Host 헤더로 도메인을 인식해야 함
검증
curl -I https://cdn.example.com/
# X-Cache: Miss from cloudfront
# Via: 1.1 ... cloudfront
3) Viewer Protocol Policy/오리진 리다이렉트 충돌
증상
- HTTP 요청이 301→301 혹은 301→307 반복
- 모바일/특정 경로에서만 무한 리다이렉트
원인
- CloudFront Behavior에서 Redirect HTTP to HTTPS를 설정했는데, 오리진도 동일한 리다이렉트 수행
- 경로별 Behavior가 상이해 일부 경로만 중복 리다이렉트
해결
- Redirect는 CloudFront 단에서만 수행하도록 오리진 리다이렉트 제거(또는 반대로)
- Behavior 매칭 순서와 경로 패턴 재정비
4) 캐시 정책/오리진 요청 정책으로 인한 캐시 파편화
증상
- X-Cache: Miss from cloudfront가 지속
- 실사용자 응답이 항상 느림
원인
- Cache Policy에서 Query strings, Cookies, Headers를 과도하게 Forward
- 사용자별 쿠키/헤더로 캐시 키가 무한 분기
해결
- 최소한만 Forward:
- 정적 리소스: None (no cookies, no headers)
- HTML: 필요한 쿠키/헤더만 선별(로그인 식별용 최소화)
- Origin Request Policy 분리: 오리진에만 필요한 헤더는 오리진 요청에서만 전달
권장 설정 예
- Cache Policy: CachingOptimized 혹은 커스텀(쿼리 전부 무시, 쿠키 무시, 헤더 무시)
- Origin Request Policy: 필요한 Auth 헤더만 선별적으로 전달
5) 5xx(502/503/504)와 타임아웃
징후
- CloudFront가 504 Gateway Timeout
- 오리진/ALB 타임아웃, Keep-Alive 미스매치, TLSHandshakeTimeout 증가
진단
- CloudWatch ALB/NLB/EC2 지표(오토스케일 이벤트, 연결 수, 오류율)
- 오리진에 직접 요청으로 TTFB 확인:
curl -I --resolve www.example.com:443:198.51.100.20 https://www.example.com/
조치
- CloudFront Origin timeout/retry 설정 조정
- 오리진 Keep-Alive와 워커 프로세스 튜닝
- Lambda@Edge/CloudFront Functions가 응답 지연 유발하는지 점검
- Origin Shield 활성화로 백엔드 부하 감소
6) CORS/Range 요청/대용량 전송 이슈
현상
- 브라우저에서 CORS 오류
- 동영상/대용량 파일 이어받기 실패
해결
- Response Headers Policy에서 Access-Control-Allow-Origin/Methods/Headers/Expose 설정
- Range 요청을 캐시에 허용(기본 지원되지만 오리진이 Accept-Ranges 응답하는지 확인)
- S3/오리진 서버에서 Content-Length/Content-Type 정확히 설정
예시(응답 헤더 정책)
- Access-Control-Allow-Origin: https://www.example.com
- Access-Control-Allow-Credentials: true(필요 시)
- Vary: Origin
7) 로그 기반 원인 추적
- Standard logs: S3에 저장, 지연 분석
- Real-time logs: Kinesis Data Streams로 실시간 파이프라인
- 필수 필드: cs-host, cs-uri-stem, x-edge-result-type, x-cache, sc-status, time-taken, x-forwarded-for, user-agent
- 문제 발생 시간대에 특정 POP(x-amz-cf-pop)에서만 오류가 증가하는지 확인하여 리전/네트워크 이슈와 분리
Cloudflare vs CloudFront 공통 디버깅 절차
- DNS/도메인 확인
- A/AAAA/CNAME이 올바른 대상인지, TTL이 지나 새 값이 전파되었는지 확인
- Apex 도메인에서 ALIAS/Flattening 동작 확인
- SSL/TLS 체인
- cURL -Iv로 체인/도메인 일치/SNI 확인
- 중간 인증서 포함 여부 필수
- 캐시 상태 판독
- Cloudflare: cf-cache-status
- CloudFront: X-Cache(HIT/Miss/Error), Age
- 의도한 캐시 키 설계인지 확인
- 리다이렉트 체인
- DevTools 또는 cURL로 위치, 횟수, 상태 코드 301/302/307 파악
- Viewer 정책과 오리진 리다이렉트 중복 방지
- 보안/접근 제어
- WAF/봇 방어/지오 제한으로 특정 사용자만 차단되는지
- CloudFront OAC/S3 정책, Cloudflare 방화벽 규칙 확인
- 오리진 성능/가용성
- 오토스케일 이벤트, DB 지연, 외부 API 타임아웃 파악
- 캐시로 감당할 수 없는 동적 요청의 병목 제거
실전 시나리오 1: Cloudflare + WordPress, 로그인 섞임
현상
- 일부 사용자에게 타인의 로그인 상태로 보임
- cf-cache-status: HIT인 HTML 응답
원인
- Cache Everything 규칙으로 HTML을 캐시, 쿠키 무시
해결 단계
- Cache Rules에서 HTML BYPASS, 혹은 로그인 쿠키(session, wordpress_logged_in_) 존재 시 BYPASS
- APO(Automatic Platform Optimization) 사용 시 로그인/프리뷰 쿠키 우회 옵션 재확인
- 정적 리소스만 장기 캐시, HTML은 짧은 TTL 또는 no-store
검증
curl -I https://www.example.com/
# 기대: cf-cache-status: BYPASS 또는 DYNAMIC
예방
- 배포 파이프라인에 규칙 검증 체크리스트 포함
- e2e 테스트에서 로그인/로그아웃 시나리오를 포함
실전 시나리오 2: CloudFront + S3, 403 폭주
현상
- 급작스런 403 비율 상승
- 배포를 신규로 교체한 직후
원인
- 새 배포에 OAC 연결했지만 S3 버킷 정책에 SourceArn이 이전 배포 ARN으로 남아 있음
해결
- 버킷 정책의 SourceArn을 현행 배포 ARN으로 업데이트
- CloudFront 배포가 올바른 오리진을 가리키는지 확인
- 필요 시 Invalidations로 캐시 재동기화
검증
# CloudFront 경유
curl -I https://assets.examplecdn.com/logo.png
# 기대: X-Cache: Hit from cloudfront
# S3 직접 접근(퍼블릭 차단인 경우 403 정상)
curl -I https://my-bucket.s3.amazonaws.com/logo.png
예방
- IaC(Terraform/CloudFormation)로 OAC와 버킷 정책을 템플릿화
- 배포 교체 시 정책도 자동 갱신되도록 변수화
실전 시나리오 3: 혼합 스택(Cloudflare 앞단 + CloudFront 백단)
구성
- 사용자 → Cloudflare → CloudFront → S3/ALB
문제
- 도메인 추가 후 403 The request could not be satisfied
- CloudFront에서 해당 Host를 인식하지 못함
해결
- CloudFront Alternate domain names에 최종 도메인을 추가
- ACM(us-east-1) 인증서에 도메인 포함
- Cloudflare는 프록시(오렌지) 사용 가능하나 Host 헤더가 그대로 전달되도록 유지
- Cloudflare Origin Rules로 백엔드 Host 헤더를 강제로 변경하지 않도록 주의
검증
curl -I https://cdn.example.com/
# Via: ... cloudfront
# X-Cache: Miss/Hit from cloudfront
예방
- 도메인 온보딩 체크리스트에 “CloudFront Alternate domain + ACM 인증서” 항목 포함
- 스테이징에서 동일 체인으로 사전 검증
문제 재현과 분리 전략
- 오리진 직결 요청
- --resolve로 CDN을 우회해 오리진을 직접 검증
- 캐시 우회
- Cache-Control: no-cache로 재검증, 혹은 쿼리 파라미터로 변형
- 특정 POP/지역 확인
- CloudFront: X-Amz-Cf-Pop, Cloudflare: cf-ray 지리 정보로 POP 이슈 추적
- 사용자 조건 차이 탐지
- Cookie 제거 후 테스트, 특정 UA/헤더 제거
- 타임라인 상관 분석
- 배포, 인증서 갱신, DNS 변경 시간과 오류 급증 시간 비교
운영 레시피: 빠른 진단 치트시트
- 5분 안에 상태 파악
- curl -I URL → 상태 코드, 서버 헤더(Cloudflare/CloudFront), 캐시 상태 확인
- DNS 조회(dig/nslookup)로 CNAME/A 대상 확인
- SSL 체인(curl -Iv)으로 인증서 문제 발견
- 15분 안에 범위 축소
- 오리진 직결(--resolve), 캐시 우회(Cache-Control: no-cache)
- 리다이렉트 체인 확인
- 30분 안에 조치
- 잘못된 Redirect/Rules 비활성 또는 수정
- CloudFront 정책(Cache/Origin Request/Response Headers) 최소화 구성
- Cloudflare Cache Rules로 HTML BYPASS, 정적만 캐시
- 사후
- 로그 수집/대시보드 지표화, 경보 조건 설정(5xx, TTFB, 캐시 적중률)
재발 방지와 베스트 프랙티스
- 인프라를 코드로
- CloudFront 배포, OAC, S3 정책, WAF 규칙을 IaC로 관리
- Cloudflare Rules/DNS/SSL을 Terraform provider로 버전 관리
- 환경 분리
- dev/stage/prod 별 도메인과 CDN 배포 분리
- Canary 릴리스로 점진적 적용
- 캐시 키 설계
- 비즈니스 기준으로 캐시 가능/불가능 경로 정의
- 쿠키/헤더 최소화, 정적 자산은 파일명 버전으로 무효화 비용 절감
- 모니터링
- 캐시 히트율, 4xx/5xx 비율, TTFB, POP별 편차를 지표화
- 인증서 만료/배포 실패/규칙 충돌 알림
- 보안 예외 최소화
- API 경로는 별도 Behavior/Rule로 분리, 정확한 인증 및 Rate Limit
- Geo/IP 접근 통제는 규칙 기반으로 명확히 문서화
자가 점검 체크리스트
Cloudflare
- SSL/TLS 모드 Full(Strict)
- Origin Certificate/Let’s Encrypt 정상, 체인 포함
- Cache Rules로 HTML BYPASS, 정적만 캐시
- Redirect Rules/Transform Rules 충돌 없음
- Firewall/WAF 차단 로그 점검, 필요한 예외만 허용
- 오리진 방화벽에서 Cloudflare IP 화이트리스트
CloudFront
- Alternate domain names + ACM(us-east-1) 인증서 일치
- S3는 OAC 사용, 버킷 정책 SourceArn 최신화
- Behavior별 Viewer/Cache/Origin Request/Response Headers 정책 최소화
- Redirect는 한 계층에서만 수행
- Origin timeout/retry/Keep-Alive 적정 설정
- 로그(Standard/Real-time)와 CloudWatch 경보 구성
공통
- DNS 레코드 최신 오리진/배포 가리킴, TTL 고려
- cURL 헤더 판독으로 캐시/리다이렉트/SSL 즉시 확인
- 배포 전후 변경 이력 기록 및 롤백 플랜 준비
마무리
CDN 트러블슈팅은 “어디에서 문제가 발생하는지”를 신속히 구분하고, 캐시/리다이렉트/SSL/권한이라는 핵심 축을 체계적으로 점검하는 것이 핵심입니다. Cloudflare와 AWS CloudFront는 기능이 풍부한 만큼 초기 설정과 정책 관리에서 작은 실수가 장애로 이어지기 쉽습니다. 본문에서 제시한 헤더 판독법, 규칙 설계 패턴, 실전 시나리오별 해결책을 참고해 장애를 단축하고, IaC/모니터링/체크리스트로 재발을 예방하세요.
마지막으로, 운영 환경에 맞춘 “나만의 런북”을 만들어 두면 비상 상황에서 엄청난 시간을 절약할 수 있습니다. 런북에는 다음을 포함하세요.
- 장애 유형별 진단 순서(cURL 명령, 대시보드 위치)
- Cloudflare/CloudFront 주요 설정 스냅샷과 변경 승인 프로세스
- 연락 포인트(네트워크, 보안, 애플리케이션 담당자)
- 롤백 및 우회 전략(임시 BYPASS, 정적 페이지 서빙, 임시 DNS 스위치)
이런 기본기를 갖추면, CDN은 장애의 원인이 아니라 안정성과 성능을 강화하는 든든한 인프라 레이어가 됩니다.