CDN 개념 이해하기
CDN을 처음 접하는 분을 위해 핵심 개념을 쉽게 설명합니다.
CDN이란?
CDN은 전 세계에 분산된 서버(엣지 노드) 네트워크를 통해 콘텐츠를 사용자 가까이에서 빠르게 전달하는 서비스입니다.
실제 콘텐츠가 저장된 고객 서버. CDN 도입 후 전체 요청의 99% 이상은 원본에 도달하지 않습니다.
사용자와 가까운 위치에 배치된 M2Live CDN 서버. 캐싱된 콘텐츠를 원본 요청 없이 즉시 응답합니다.
엣지 노드에 임시 저장된 콘텐츠. TTL 동안 유지되며 반복 요청을 처리합니다.
캐시 유지 시간. 만료 후 다음 요청 시 원본에서 새 콘텐츠를 가져와 다시 캐싱합니다.
Cache MISS 시 CDN이 원본 서버에서 콘텐츠를 가져오는 동작. Origin Pull이 적을수록 CDN 효율이 높습니다.
캐시를 강제 삭제합니다. 원본 변경 후 CDN에 즉시 반영할 때 사용합니다.
캐시 HIT vs MISS
캐시 히트율 (Cache Hit Ratio)
| 히트율 | 상태 | 조치 |
|---|---|---|
| 99% 이상 | 최적 | 현재 설정 유지 |
| 90~99% | 양호 | TTL 연장 검토 |
| 70~90% | 개선 필요 | Cache-Control 헤더 및 TTL 점검 |
| 70% 미만 | CDN 효과 저조 | 즉시 기술지원팀 문의 |
HTTP 캐시 헤더 가이드
CDN 서비스는 원본 서버의 Cache-Control 헤더를 최우선으로 준수합니다.
원본 서버에서 콘텐츠의 용도에 알맞은 캐시 정책을 내려주시면, CDN이 훨씬 더 효율적으로 작동하여 서버 부하를 줄이고 최상의 전송 속도를 제공할 수 있습니다.
| 헤더 | 동작 | 권장 대상 |
|---|---|---|
Cache-Control: max-age=86400 | 1일 캐싱 | 정적 이미지 (JPG, PNG 등) |
Cache-Control: max-age=2592000 | 1달 캐싱 | 비디오 (MP4 등 대용량 미디어) |
Cache-Control: max-age=300 | 5분 캐싱 | 업데이트가 잦은 CSS, JS |
Cache-Control: no-cache | 매 요청마다 재검증 | 자주 변경되는 HTML 문서 |
빠른 시작 가이드
M2Live Cloud CDN을 처음 구성하는 7단계 가이드입니다.
시작 전 체크리스트
| 항목 | 내용 | 필수 |
|---|---|---|
| 서비스 도메인 | 서브도메인 권장 (예: cdn.myservice.com) | 필수 |
| 원본 서버 주소 | 실제 콘텐츠가 있는 서버 IP/도메인 | 필수 |
| SSL 인증서 | 인증서, 키파일, 체인인증서(HTTPS 서비스 시) | HTTPS 시 필수 |
| DNS 편집 권한 | CNAME 레코드 추가 권한 | 필수 |
단계별 설정
cdn.myservice.com 300 IN CNAME cdn.myservice.service1.m2live.io.콘텐츠 유형별 권장 TTL
- API 엔드포인트에 긴 TTL — 모든 사용자에게 동일 캐시가 반환됩니다.
- 로그인 페이지 캐싱 — 다른 사용자의 개인정보가 노출될 수 있습니다.
- 원본 IP 외부 노출 — CDN 도입 후에도 원본 IP가 공개되면 직접 공격이 가능합니다.
도메인 관리
CDN 서비스에 연결할 도메인을 신청하고, DNS · 인증서 · 원본 서버 세 가지 상태를 실시간으로 확인합니다.
도메인 연결 신청
도메인 연결 신청 버튼을 클릭해 팝업을 작성합니다. 운영팀이 호스팅을 발급하면 DNS 설정 단계로 진행할 수 있습니다.
| 항목 | 설명 | 입력 예시 |
|---|---|---|
| 도메인 필수 | CDN으로 서빙할 도메인. 루트 도메인(example.com)은 불가하며 반드시 서브도메인으로 신청해야 합니다. |
cdn.myservice.comimg.myservice.com |
| 설명 필수 | 도메인 용도를 알아보기 쉬운 메모. 팀원 간 운영 목적 구분에 유용합니다. | 이미지 CDN (상품 사진)동영상 스트리밍 |
cdn., img. 등 서브도메인으로 신청하세요. ALIAS(ANAME) 레코드가 필요한 경우 기술지원팀에 문의하세요.
서비스 상태 — 3가지 진단 항목
도메인을 선택하면 DNS · 인증서 · 원본 서버 상태를 실시간으로 확인할 수 있습니다. 각 항목의 정상 기준과 이상 시 조치 방법은 아래 표를 참고하세요.
| 항목 | 주요 확인 포인트 | 이상 시 조치 |
|---|---|---|
| ① DNS |
A 레코드가 M2Live CDN IP 대역을 가리키는지 확인. 응답 시간 100ms 이하 정상. DNS TTL은 초기 30~300초, 안정화 후 3600초 이상 권장. |
CNAME/A 레코드 미설정 또는 전파 중 → DNS 레코드 확인. 전파는 최대 48시간 소요. |
| ② 인증서 |
주체(Subject)에 서비스 도메인 포함 여부 확인. 유효 기간 내에 있는지 확인. 남은 기간 30일 이하면 갱신 준비. |
만료 시 브라우저 경고 즉시 발생 → SSL 탭에서 새 인증서 재등록. |
| ③ 원본 서버 |
가용 IP가 1개 이상인지 확인. 가용 IP 0개라면 원본 장애 상태. |
가용 IP 0개 또는 5xx 응답 → 원본 서버 점검 후 기술지원팀 연락. |
*.myservice.com 와일드카드 인증서 하나로 모든 서브도메인을 커버할 수 있습니다. 갱신도 한 번에 처리됩니다.
URL 진단 — 캐시 HIT/MISS 확인
서비스 상태 화면 하단 URL 진단에 리소스 경로를 입력하면 CDN 경유 여부와 캐시 상태를 즉시 확인할 수 있습니다.
| 결과 항목 | 의미 및 이상 시 조치 |
|---|---|
| 응답 코드 | 5xx → 원본 서버 장애 / 404 → 원본 경로 오류 / 301·302 → 리다이렉트 루프 점검 |
| 캐시 상태 | 항상 MISS면 TTL 설정 또는 Cache-Control 헤더 점검 |
| CDN 경유 여부 | 미경유 시 DNS 전파 미완료 또는 CNAME/A 레코드 오류 |
| Content-Type | 기대와 다른 포맷이면 미디어 최적화 설정 또는 Accept 헤더 확인 |
일반 설정
도메인 활성화, Alias(별칭 도메인), 전송 대역폭 제한, URL Rewrite 정책을 관리합니다. 각 항목은 독립적으로 켜고 끌 수 있으며, 저장 즉시 반영됩니다.
| 항목 | 개념 | 활용 예시 |
|---|---|---|
| 도메인 Alias | 하나의 CDN 설정으로 여러 도메인을 동시에 서빙합니다. | img.myservice.com과 cdn.myservice.com을 단일 CDN으로 연결 |
| 전송 대역폭 제한 | 도메인당 최대 전송 속도(Mbps)를 제한합니다. | 서비스 품질을 낮추어 과금량을 줄입니다. |
| URL Rewrite | 정규표현식으로 요청 URL을 CDN 엣지에서 재매핑합니다. 원본 서버나 클라이언트 변경 없이 URL 구조를 투명하게 전환합니다. | 구 경로 /old/(.*) → 신 경로 /new/$1 |
① 도메인 활성화
CDN 서비스 전체를 ON/OFF하는 마스터 스위치입니다. 비활성화하면 해당 도메인의 모든 CDN 기능(캐시, 이미지·비디오 최적화, 접근 제어 등)이 즉시 중단됩니다. 중단 전 반드시 도메인을 다른 서비스로 라우팅하도록 변경해야 합니다.
② 도메인 Alias (별칭 도메인)
Alias는 하나의 CDN 설정(원본 서버, 캐시 정책, SSL 등)을 여러 도메인이 공유할 수 있게 해주는 기능입니다. 예를 들어 이미지용 img.myservice.com과 일반 콘텐츠용 cdn.myservice.com이 동일한 원본과 설정을 사용한다면, 별도 CDN을 만들지 않고 Alias로 등록하면 됩니다.
③ 전송 대역폭 제한
도메인당 CDN에서 전송할 수 있는 최대 속도를 Mbps 단위로 제한합니다. 트래픽을 억제하여 트래픽 비용을 예측 가능하게 관리할 수 있습니다. 대신 서비스 품질(전송속도)는 저하됩니다.
| 설정값 | 동작 | 권장 시나리오 |
|---|---|---|
| 비활성화 (기본) | 속도 제한 없음. CDN이 가능한 최대 속도로 전송합니다. | - |
④ URL Rewrite 정책
CDN 엣지에서 클라이언트 요청 URL을 정규표현식(RegExp) 패턴으로 매칭한 뒤, 지정한 형식으로 변조합니다. 캐싱키와 원본에 요청되는 URL 모두 바뀐 URL이 사용됩니다. 클라이언트나 원본 서버 코드를 수정하지 않고도 URL 구조를 투명하게 변경할 수 있습니다.
| 구성 요소 | 설명 | 예시 |
|---|---|---|
| URL 패턴 | 매칭할 정규표현식. 괄호 ()로 캡처 그룹을 만들면 치환에서 #1, #2로 참조할 수 있습니다. | ([^/]+)/(.*) |
| 치환 | 패턴이 일치했을 때 재조합할 URL. 캡처 그룹은 #1, #2 … 순서로 참조합니다. | #1.php?id=#2 |
| 변경 전 URL 로깅 | Rewrite가 적용되기 전의 원본 요청 URL을 access.log에 함께 기록합니다. 디버깅 시 유용합니다. | — |
| 대소문자 구분 | 패턴 매칭 시 대소문자를 구분할지 여부입니다. 기본값은 구분하지 않음(case-insensitive)입니다. | — |
URL Rewrite 패턴 예시
| 변환 목적 | URL 패턴 | 치환 | 결과 |
|---|---|---|---|
| 경로 구조 변환 | ([^/]+)/(.*) |
#1.php?id=#2 |
/post/123 → /post.php?id=123 |
| 디렉토리 접두사 추가 | (.*) |
/v2/#1 |
/api/users → /v2/api/users |
| 확장자 제거 | (.*)\.html$ |
#1 |
/about.html → /about |
| 구 경로 → 신 경로 | /old/(.*) |
/new/#1 |
/old/banner.jpg → /new/banner.jpg |
원본 연결 / 헤더 제어
CDN이 원본 서버(Origin Server)와 통신하는 방식 전반을 설정합니다. 프로토콜·주소·타임아웃부터 요청/응답 헤더 조작, Redirect 처리, 원본요청 URL Rewrite까지 원본 연결과 관련된 모든 항목이 이 탭에 집중되어 있습니다.
Cache MISS 시 CDN 엣지가 원본 서버로 콘텐츠를 가져오는 동작. 이후 동일 요청은 캐시에서 즉시 응답합니다.
동일 콘텐츠에 동시 요청이 몰릴 때 Origin Pull을 1회로 병합합니다. 원본 과부하 방지 핵심 기능.
CDN이 원본에 요청할 때 보내는 Host 값. 원본이 Host헤더로 요청을 분기한다면 반드시 일치해야 합니다.
연결대기(Connect)와 수신대기(Read) 두 단계의 타임아웃을 각각 설정합니다. Timeout되면 CDN의 에러처리 메커니즘이 가동됩니다.
원본 → CDN(응답헤더 변조) 구간에서 HTTP 헤더를 추가·덮어쓰기·삭제할 수 있습니다.
캐시키에는 영향없이 원본에 전달할 URL을 정규표현식으로 변환합니다.
① 원본 프로토콜 / 주소
CDN 엣지가 원본 서버로 Origin Pull 요청을 보낼 때 사용할 프로토콜과 주소를 설정합니다. 여러 주소를 등록하면 라운드로빈 로드밸런싱이 적용되며, 보조 주소로 설정한 서버는 주 서버가 모두 응답 불가일 때만 투입됩니다.
| 항목 | 설명 | 권장값 |
|---|---|---|
| 원본 프로토콜 | CDN ↔ 원본 간 통신 방식. HTTP는 암호화 없이 빠르고, HTTPS는 종단간(End-to-End) 암호화를 보장합니다. | 내부망이면 HTTP, 공인망이면 HTTPS 권장 |
| 원본 주소 | IP 주소 또는 도메인. http://, https:// 접두사 없이 입력합니다. | 192.168.10.135 또는 origin.myservice.com |
| 포트(port) | 원본 서버가 수신하는 포트 번호. 기본 포트(HTTP 80, HTTPS 443)와 다를 때 지정합니다. | - |
| 보조 주소 | 주 원본 서버 전체 장애 시 자동으로 전환되는 Failover 서버입니다. | 가용성이 중요한 서비스에 설정 권장 |
② Host 헤더
CDN이 원본 서버에 요청을 보낼 때 HTTP Host 헤더에 어떤 값을 넣을지 결정합니다. 기본적으로는 클라이언트가 요청한 Host 값이 그대로 전달됩니다. 원본 서버가 Apache VirtualHost나 Nginx server_name으로 여러 도메인을 구분하거나, 포트가 포함된 Host를 요구하는 경우 이 옵션을 활성화해 맞춤 값을 입력합니다.
③ 중복요청 병합 (Request Coalescing)
동일한 콘텐츠에 대해 Cache MISS 상태에서 대량의 요청이 동시에 들어올 때, CDN이 원본 서버에 Origin Pull을 단 1회만 보내고 나머지 요청은 그 응답을 기다렸다가 한꺼번에 처리하는 기능입니다. Thunder Herd Problem(캐시 만료 시 원본에 요청이 폭주하는 현상)을 방지하는 핵심 설정입니다.
④ 연결대기 / 수신대기 시간 (Timeout)
CDN이 원본 서버와 통신할 때 적용되는 두 가지 타임아웃을 설정합니다. 타임아웃이 반복되면 CDN은 해당 원본을 장애로 간주하고 보조 원본으로 전환하거나 오류 응답을 반환합니다.
| 항목 | 의미 | 기본값 | 설정 범위 |
|---|---|---|---|
| 연결대기 시간 (Connect Timeout) |
CDN이 원본 서버에 TCP 연결을 맺을 때까지 기다리는 시간. 원본 서버가 연결 자체를 받지 못하는 경우(방화벽 차단, 서버 다운 등)에 적용됩니다. | 3초 | 0 ~ 5초 (0 = 기본값 적용) |
| 수신대기 시간 (Read Timeout) |
TCP 연결 후 원본 서버가 데이터를 전송하지 않는 유휴 시간의 허용 한도. 연결은 됐지만 응답이 느린 경우(처리 지연, 대용량 파일 등)에 적용됩니다. | 10초 | 0 ~ 60초 (0 = 기본값 적용) |
⑤ 세션 재사용 (Keep-Alive / Connection Reuse)
CDN과 원본 서버 사이의 TCP 연결을 요청마다 새로 맺지 않고 재사용하는 기능입니다. 비활성화 시 매 HTTP 요청마다 TCP 3-Way Handshake가 새로 발생해 연결 오버헤드가 증가합니다. 원본 서버가 Keep-Alive를 지원하면 반드시 활성화를 권장합니다.
⑥ 비표준헤더 캐싱
원본 서버가 응답에 포함하는 HTTP 헤더 중 CDN이 캐시와 함께 저장할 헤더 범위를 결정합니다. 기본적으로 CDN은 보안 문제를 방지하기 위해 표준으로 정의된 헤더만 캐싱합니다. Set-Cookie 헤더는 어떤 설정에서도 캐싱되지 않습니다.
| 모드 | 동작 | 권장 상황 |
|---|---|---|
| 표준 헤더만 | RFC 표준 헤더(Cache-Control, Content-Type, ETag 등)만 캐싱합니다. | 일반적인 정적 콘텐츠 CDN |
| 확장 표준 헤더 + 비표준 헤더 | 표준 헤더 + 원본 서버가 추가한 커스텀 헤더(X-Custom-* 등)까지 함께 캐싱합니다. | 커스텀 헤더를 클라이언트에 전달해야 하는 API/미디어 서비스 |
어떤 설정이라도 Set-Cookie 헤더는 캐싱되지 않습니다.
목록: Cache-Control, Content-Disposition, Content-Encoding, Content-Length, Content-Type, Expire, Transfer-Encoding, Server, Content-Language, Content-Location, Content-MD5, Proxy-Authenticate, Retry-After, TE, Trailer, Warning, WWW-Authenticate
⑦ 원본 ETag 지원
ETag는 콘텐츠의 버전을 나타내는 해시 값입니다. 원본 서버가 응답에 ETag를 포함하면 CDN이 이를 저장해 두고, 이후 캐시를 재검증할 때 원본에 If-None-Match 헤더로 전달합니다. 원본이 "변경 없음"을 확인하면 304로 응답해 불필요한 데이터 전송을 줄입니다.
⑧ Redirect 재요청
원본 서버가 301/302 등 Redirect 응답을 반환했을 때 CDN이 Location 헤더의 URL로 자동으로 재요청해 최종 콘텐츠를 가져오는 기능입니다. 비활성화 시 CDN은 Redirect 응답 자체를 캐시하고 클라이언트에 그대로 전달해, 클라이언트가 직접 Redirect를 따라갑니다.
| 항목 | 설명 | 예시 |
|---|---|---|
| Redirect 상태코드 | 재요청을 트리거할 HTTP 상태코드를 지정합니다. 3xx는 300번대 전체를 의미합니다. | 3xx, 301, 302 |
| URL 패턴 | 재요청을 적용할 URL 패턴. 빈값이면 전체 URL에 적용됩니다. 와일드카드 *는 모든 패턴을 의미합니다. | *.mp4, /videos/* |
⑨ User-Agent 헤더
CDN이 원본 서버로 Origin Pull 요청을 보낼 때 전송하는 User-Agent 헤더 값을 설정합니다. 기본값은 M2Live 클라우드 서비스명입니다. 원본 서버가 특정 User-Agent만 허용하거나, 클라이언트 User-Agent를 그대로 전달해야 할 때 변경합니다.
⑩ X-Forwarded-For (XFF) 헤더
X-Forwarded-For는 클라이언트의 실제 IP 주소를 프록시(CDN)를 거쳐 원본 서버에 전달하기 위한 표준 HTTP 헤더입니다. CDN을 거치면 원본 서버는 CDN의 IP만 보게 되므로, 클라이언트 IP 기반의 로깅·접근 제어·지역 판단이 필요하다면 반드시 이 기능을 활성화해야 합니다.
| 동작 | 설명 |
|---|---|
| 비활성화 | 클라이언트 X-Forwarded-For 헤더의 맨 좌측 필드만 원본 서버에 전달합니다. |
| 활성화 | 클라이언트가 보낸 X-Forwarded-For 헤더에 클라이언트 IP(=Remote Socket IP)를 추가해 전달합니다. 클라이언트가 헤더를 보내지 않았다면 클라이언트 IP만 원본에 전달합니다. |
활성화하면 클라이언트가 보낸 X-Forwarded-For헤더에 클라이언트 IP를 추가합니다. 만약 클라이언트가 해당 헤더를 보내지 않았다면 X-Forwarded-For헤더의 값으로 클라이언트 IP만 원본서버로 전달합니다.
⑪ 요청헤더 변조
CDN이 원본 서버로 요청을 전달할 때 HTTP 헤더를 동적으로 추가·덮어쓰기·삭제하는 기능입니다. 특정 URL 패턴에만 선택적으로 적용할 수 있습니다.
| 항목 | 설명 | 예시 |
|---|---|---|
| 헤더 이름 | 추가·변경·삭제할 HTTP 헤더 이름 | x-media-type |
| 값 | 헤더에 설정할 값. 삭제 액션 선택 시 비워둡니다. | video/mp4 |
| URL 패턴 | 이 규칙을 적용할 URL 패턴. 빈값이면 전체 URL에 적용됩니다. | /*.mp4 |
| 액션 | 추가(없으면 추가, 있으면 덮어쓰기) / 강제 덮어쓰기 / 삭제 중 선택 | 추가 (헤더가 존재하면 덮어쓰고 없다면 추가) |
⑫ 응답헤더 변조
원본 서버가 CDN에 응답을 보낼 때 HTTP 헤더를 동적으로 추가·덮어쓰기·삭제하는 기능입니다. 요청헤더 변조와 동일한 구조지만 방향이 반대(원본 → CDN)입니다.
- 요청헤더 추가: 원본 서버 인증을 위해
X-CDN-Secret: <token>헤더를 모든 Origin Pull에 삽입 - 응답헤더 추가: 원본이 CORS 헤더를 반환하지 않을 때
Access-Control-Allow-Origin: *를 응답에 삽입 - 응답헤더 삭제: 원본이 반환하는 민감한
Server헤더를 제거해 서버 정보 노출 방지
⑬ 원본요청 URL Rewrite
클라이언트 요청 URL을 원본 서버에 전달하기 전에 정규표현식으로 변환합니다. 일반 설정의 URL Rewrite와 달리 캐시키에 영향을 주지 않습니다. 즉, 클라이언트 입장에서는 원래 URL로 캐시가 관리되지만, 원본 서버에는 변환된 URL로 요청이 전달됩니다.
| 구분 | 일반 설정 URL Rewrite | 원본요청 URL Rewrite |
|---|---|---|
| 변환 시점 | CDN 엣지 진입 시 (캐시키 변경됨) | 원본 전달 직전 (캐시키 불변) |
| 캐시키 영향 | 있음 — 변환된 URL로 캐시 저장 | 없음 — 원본 URL로 캐시 저장 |
| 주요 용도 | 클라이언트에게 노출되는 URL 구조 변경 | 원본 서버의 내부 경로 매핑 |
도메인별로 독립 설정되므로 도메인이름은 입력하지 않습니다.
SSL / HTTPS
클라이언트(브라우저)와 CDN 엣지 노드 간 HTTPS 암호화 통신을 설정합니다. SSL 인증서를 등록하면 보안 HTTPS 프로토콜을 통해 콘텐츠를 안전하게 전송할 수 있습니다.
- 사용자 ↔ CDN 엣지: 이 페이지에서 등록한 SSL 인증서로 HTTPS 암호화
- CDN 엣지 ↔ 원본 서버: 원본 연결/헤더 제어 탭에서 HTTPS 프로토콜 선택
- 두 구간 모두 HTTPS로 설정해야 완전한 종단간(End-to-End) 암호화가 보장됩니다.
SSL/TLS 핵심 개념
CA(인증기관)가 발급한 공개 인증서. 도메인 소유권을 증명하며 브라우저가 신뢰하는 기관의 서명이 포함되어 있습니다. .pem, .crt, .cer 형식을 지원합니다.
인증서와 쌍을 이루는 비밀 키. 암호화된 통신을 복호화하는 데 사용됩니다. 절대 외부에 노출해서는 안 됩니다. .pem, .key 형식을 지원합니다.
중간 CA(Intermediate CA) 인증서 묶음. 브라우저가 루트 CA까지 신뢰 경로를 확인하는 데 필요합니다. 없으면 일부 브라우저/기기에서 경고가 발생합니다. .pem, .crt, .cer 형식을 지원합니다.
암호화 프로토콜 버전. TLSv1.2는 구형 클라이언트 호환성을 위해, TLSv1.3은 보안·성능 향상을 위해 권장됩니다. 기본값은 TLSv1.2 + TLSv1.3 동시 지원입니다.
인증서 파일 구성
| 파일 | 역할 | 지원 형식 | 필수 여부 |
|---|---|---|---|
| 증명서 (Certificate) |
CA가 발급한 공개 인증서. 도메인 소유권 및 서버 신원을 증명합니다. | .pem .crt .cer |
필수 |
| 개인 키 (Private Key) |
인증서와 쌍을 이루는 비밀 키. 서버가 암호화된 통신을 복호화하는 데 사용됩니다. | .pem .key |
필수 |
| 인증서 체인 (Chain / Bundle) |
중간 CA 인증서 묶음. 브라우저가 루트 CA까지 신뢰 경로를 추적하는 데 필요합니다. | .pem .crt .cer |
권장 (없으면 일부 환경에서 경고 발생) |
| TLS 버전 | 이 인증서에 적용할 TLS 프로토콜 버전을 지정합니다. 미선택 시 기본값(TLSv1.2, TLSv1.3)이 사용됩니다. | TLSv1.2 / TLSv1.3 | 선택 (기본값 권장) |
HTTPS 활성화 및 인증서 관리
_wildcard_.m2live.io_2025090589371.crt.pem_wildcard_.m2live.io_2025090589371.key.pemroot-chain-bundle.pemSSL 인증서 추가 — 입력 항목
SSL 인증서 추가 버튼을 클릭하면 아래 팝업이 열립니다. 각 파일은 직접 내용을 붙여넣거나 파일 첨부 버튼으로 업로드할 수 있습니다.
TLS 버전 선택 가이드
| 버전 | 보안 수준 | 호환성 | 권장 여부 |
|---|---|---|---|
| TLSv1.0 | 낮음 — POODLE, BEAST 취약점 존재 | 구형 IE6~8, Android 2.x | 사용 금지 |
| TLSv1.1 | 낮음 — 현대적 암호 스위트 미지원 | 구형 브라우저 | 사용 금지 |
| TLSv1.2 | 양호 — 현재 널리 사용 중 | Chrome 30+, iOS 5+, Android 4.4+ | 권장 (호환성) |
| TLSv1.3 | 높음 — 핸드셰이크 단축, 취약 암호 제거 | Chrome 70+, Firefox 63+, iOS 12.2+ | 권장 (보안) |
와일드카드 인증서 활용
와일드카드 인증서(*.myservice.com)는 동일 도메인의 모든 서브도메인에 하나의 인증서를 적용할 수 있습니다. 서브도메인마다 개별 인증서를 발급·등록·갱신하는 부담을 줄이고, 관리 포인트를 단일화할 수 있습니다.
| 인증서 유형 | 커버 범위 | 관리 난이도 |
|---|---|---|
| 단일 도메인 | cdn.myservice.com 1개만 |
서브도메인 추가마다 재발급 필요 |
| 와일드카드 (Wildcard) |
*.myservice.com → 모든 1단계 서브도메인 |
갱신 1회로 전체 적용 |
인증서 갱신 체크리스트
| 단계 | 작업 | 비고 |
|---|---|---|
| 1 | CA에서 새 인증서 발급 (증명서 + 개인 키 + 체인) | 만료 30일 전 시작 권장 |
| 2 | SSL 탭 → 기존 인증서 편집 또는 삭제 후 재추가 | 편집 시 서비스 중단 없이 교체 가능 |
| 3 | 도메인 관리 → 서비스 상태에서 인증서 항목 "유효" 확인 | 반영까지 최대 수 분 소요 |
| 4 | URL 진단으로 HTTPS 정상 응답 확인 | 응답 코드 200, CDN 경유 여부 확인 |
캐시 (TTL)
TTL(Time To Live)은 콘텐츠가 CDN 엣지에 캐싱되는 시간입니다. TTL 우선순위 제어부터 응답코드별 TTL, no-cache/no-store 정책, 커스텀 TTL, 갱신 예외, 캐시키 구성, POST 캐싱, 바이패스까지 캐시와 관련된 모든 설정이 이 탭에 집중되어 있습니다.
- TTL ↑ 길수록 → 히트율 높아짐, 원본 부하 감소 → 단, 콘텐츠 변경 시 이전 버전이 계속 제공될 수 있음
- TTL ↓ 짧을수록 → 항상 최신 콘텐츠 제공 → 단, 히트율 낮아지고 원본 부하 증가
- 최적 전략: 정적 콘텐츠 긴 TTL + URL 버전 해시(cache busting) + 변경 시 퍼지(Purge)
① TTL 적용 우선순위
CDN은 원본 서버의 Cache-Control 헤더를 기본적으로 준수하지만, 운영 필요에 따라 CDN 콘솔에서 강제로 우선순위를 변경할 수 있습니다. 우선순위 목록은 드래그로 순서를 조정할 수 있으며, 목록 상단일수록 높은 우선순위로 적용됩니다.
| TTL 소스 | 설명 | 우선순위 기본값 |
|---|---|---|
| 커스텀 TTL | URL 패턴별로 콘솔에서 직접 지정한 TTL | 1순위 (최고) |
| 원본 max-age | 원본의 Cache-Control: max-age 값 | 2순위 |
| 원본 no-cache | 원본이 Cache-Control: no-cache로 응답 — 매 요청마다 원본에서 재검증 | 3순위 |
| 응답코드별 설정 | 응답코드(2xx/3xx/4xx/5xx)별로 콘솔에서 지정한 TTL | 4순위 |
| 원본 no-store | 원본이 Cache-Control: no-store로 응답 — 캐싱 완전 불가 | 5순위 |
| 원본 s-maxage | 원본이 CDN 전용으로 지정한 Cache-Control: s-maxage 값 | 6순위 (최저) |
② 응답코드별 TTL
원본 서버의 HTTP 응답 상태코드 계열별로 TTL을 개별 설정합니다. 오류 응답(4xx/5xx)이 길게 캐싱되면 원본 문제가 해결된 후에도 사용자가 계속 오류를 받게 되므로 짧게 유지해야 합니다. 접속실패·수신실패 시의 동작 정책도 함께 설정합니다.
| 응답코드 | 의미 | 권장 TTL | 이유 |
|---|---|---|---|
| 2xx 200, 201, 204 등 | 성공 응답. 정상적으로 반환된 콘텐츠 | 86400초 (1일) 이상 | 정적 콘텐츠는 길게 캐싱할수록 히트율 향상 |
| 3xx 301, 302, 303 등 | 리다이렉트 응답 | 300초 (5분) | 리다이렉트 목적지가 변경될 수 있으므로 중간값 권장 |
| 4xx 400, 401, 403 등 | 클라이언트 오류 (잘못된 요청, 권한 없음 등) | 3초 | 오류가 수정되면 즉시 정상 응답으로 전환되어야 함 |
| 5xx 500, 501, 502 등 | 서버 오류 (원본 장애, 과부하 등) | 3초 | 원본 복구 후 즉시 정상 서비스 재개 필요 |
| 접속실패 | CDN이 원본에 TCP 연결 자체를 맺지 못한 경우 | 3초 | 이미 캐싱된 콘텐츠라면 접속실패 시간(초)만큼 TTL을 연장 |
| 수신실패 | 연결 후 원본이 데이터를 전송하지 않은 경우 | 3초 | 신규 캐싱 시 원본 장애가 발생하면 500으로 응답하고 접속실패 시간만큼 유지 |
- 이미 캐싱된 콘텐츠라면 접속실패 시간(초)만큼 TTL을 연장한다.
- 신규 캐싱시 원본 장애가 발생하면 500으로 응답하고 접속실패 시간만큼 유지합니다.
③ no-cache 응답 정책
원본 서버가 200번대 성공 상태코드(200 OK 등)를 Cache-Control: no-cache와 함께 응답한 경우, CDN이 어떻게 동작할지를 정의합니다. no-cache는 "캐시하지 말라"가 아니라 "캐시하되, 사용 전 반드시 원본에서 재검증하라"는 의미입니다.
| 옵션 | 동작 | 권장 상황 |
|---|---|---|
| 기본값 사용 | CDN 기본 동작 방식을 따릅니다. (TTL: 5초) | 별도 정책이 필요 없는 일반 서비스 |
| 응답코드별 TTL 사용 | 응답코드별 TTL 설정값을 그대로 적용합니다. | 응답코드별 TTL을 이미 세밀하게 설정한 경우 |
| TTL 재정의 | no-cache 응답에만 별도의 TTL 값을 직접 지정합니다. | no-cache 응답을 짧게 캐싱해 원본 부하를 줄이고 싶을 때 |
| 응답 즉시 만료 | 캐싱하지 않고 매 요청마다 원본에서 가져옵니다. | 원본의 no-cache 지시를 CDN도 그대로 준수해야 할 때 |
④ no-store 응답 정책
원본 서버가 200번대 성공 상태코드를 Cache-Control: no-store와 함께 응답한 경우의 동작을 정의합니다. no-store는 "이 응답을 어떠한 형태로도 저장해서는 안 된다"는 강력한 지시입니다. 로그인 응답, 결제 정보 등 민감 데이터에 주로 사용됩니다.
| 옵션 | 동작 | 권장 상황 |
|---|---|---|
| 기본값 사용 | CDN 기본 동작 방식을 따릅니다. (TTL: 5초) | 별도 정책이 필요 없는 일반 서비스 |
| 응답코드별 TTL 사용 | 응답코드별 TTL 설정값을 그대로 적용합니다. | 응답코드별 TTL이 이미 세밀하게 설정된 경우 |
| TTL 재정의 | no-store 응답에만 별도의 TTL 값을 직접 지정합니다. | no-store 응답을 일부 캐싱하고 싶은 특수한 경우 |
| 캐싱하지 않고 바이패스 | 캐시하지 않고 원본 응답을 클라이언트에 그대로 전달합니다. | 원본의 no-store 지시를 CDN도 완전히 준수해야 할 때 (민감 정보) |
⑤ 커스텀 TTL
URL 패턴별로 TTL을 직접 지정합니다. 원본의 Cache-Control 헤더와 무관하게 CDN에서 강제로 TTL을 적용할 수 있습니다. 규칙은 선언된 순서대로 매칭되므로, 더 구체적인 패턴을 목록 상단에 먼저 선언해야 합니다.
| 항목 | 설명 | 예시 |
|---|---|---|
| URL 패턴 | TTL을 적용할 URL 경로 패턴. 와일드카드 *를 사용할 수 있습니다. | /samples/*.js, /images/* |
| TTL | 해당 패턴에 적용할 캐시 유지 시간(초). 0을 입력하면 캐싱하지 않습니다. | 1800 (30분), 86400 (1일) |
/images/thumb/*.jpg와 /images/*가 모두 있다면, /images/thumb/*.jpg를 반드시 위에 선언해야 합니다.
⑥ 갱신 예외 TTL (Stale-While-Revalidate)
캐시된 콘텐츠의 TTL이 만료됐을 때 원본 서버 장애 등의 이유로 갱신이 불가능한 경우, 만료된 캐시를 계속 서빙할지 여부를 설정합니다. 원본 장애 상황에서 사용자에게 오류 대신 이전 콘텐츠를 제공해 서비스 가용성을 높이는 데 활용됩니다.
| 항목 | 동작 | 권장 여부 |
|---|---|---|
| 갱신불가시 TTL 연장 | 원본 장애 등으로 캐싱된 콘텐츠 갱신이 불가능하면 TTL을 자동 연장해 기존 캐시를 계속 서빙합니다. | 활성화 권장 |
| 5xx TTL 연장 | 캐싱된 콘텐츠 갱신 시점에 원본이 500번대 오류를 응답한 경우 TTL을 자동 연장합니다. | 활성화 권장 |
| 4xx TTL 연장 | 캐싱된 콘텐츠 갱신 시점에 원본이 400번대 오류를 응답한 경우 TTL을 자동 연장합니다. | 선택적 — 4xx는 의도적 오류일 수 있으므로 신중히 설정 |
⑦ 캐시키 구성 (Cache Key)
캐시키(Cache Key)는 CDN이 동일한 요청인지 구별하는 기준입니다. 캐시키를 구성하는 요소가 많을수록 더 다양하게 캐시가 분리되어 히트율이 낮아질 수 있습니다. 반대로 요소를 줄이면 히트율은 높아지지만 잘못된 콘텐츠가 제공될 위험이 있습니다.
| 항목 | 활성화 시 동작 | 비활성화 시 동작 | 권장값 |
|---|---|---|---|
| 대소문자 구분 | URL의 대소문자를 구분해 별도 캐시로 저장/Image.jpg와 /image.jpg = 별개 캐시 | 모두 소문자로 정규화해 동일 캐시로 처리 | 활성화 권장 (원본이 대소문자를 구분하는 경우) |
| Accept-Encoding 헤더 구분 | 클라이언트의 압축 지원 여부(gzip, br 등)에 따라 별도 캐시로 저장 | Accept-Encoding 헤더를 무시하고 Plain으로 동작 | 활성화 권장 (압축 응답을 캐싱하는 경우) |
| QueryString 구분 | URL의 쿼리스트링(?key=value)을 포함해 캐시키 구성/api?v=1과 /api?v=2 = 별개 캐시 | 쿼리스트링을 무시하고 동일 리소스로 처리 | 활성화 권장 (버전 파라미터·필터 파라미터가 있는 경우) |
| Vary 헤더 지원 | 원본의 Vary 헤더 값을 인식해 헤더 값별로 별도 캐시 저장캐시 조건이 크게 늘어 HIT율 저하 가능 | Vary 헤더를 무시 | 비활성화 권장 (HIT율 저하 주의) |
이 옵션이 활성화되면 캐싱조건이 많아져 HIT율이 크게 저하되기 때문에 주의한다.
⑧ POST 캐싱
일반적으로 HTTP POST 요청은 상태를 변경하는 요청으로 간주되어 캐싱하지 않습니다. 이 기능을 활성화하면 POST 요청과 응답을 캐싱할 수 있습니다. 단, 최대 4KB까지의 POST Body만 캐싱 가능하며, 이를 초과하는 요청은 자동으로 바이패스(원본 직접 전달)됩니다.
최대 4KB까지의 POST Body를 캐싱할 수 있습니다. 초과되는 POST 요청은 바이패스됩니다.
⑨ 바이패스 (Bypass)
특정 URL 패턴에 해당하는 요청을 CDN이 캐시하지 않고 원본 서버로 직접 전달합니다. 로그인·결제·실시간 데이터 등 캐싱이 부적합한 경로를 명시적으로 지정할 수 있습니다. 규칙은 선언된 순서대로 매칭되므로, 더 구체적인 패턴을 먼저 선언해야 합니다.
| 항목 | 설명 | 예시 |
|---|---|---|
| URL 패턴 | 바이패스를 적용할 URL 경로 패턴. 명확한 경로 또는 와일드카드 패턴을 사용합니다. | /source/public.zip, /assets/*.js |
| 액션 | 현재는 bypass 단일 액션만 지원합니다. 해당 URL의 모든 요청을 원본으로 직접 전달합니다. | bypass |
선언된 순서를 따릅니다. 항상 명확한 패턴이 우선하도록 구성하세요.
콘텐츠 처리
조건부 요청(304 Not Modified), If-Modified-Since 비교 정책, If-Range 헤더 처리, GZip/Brotli 압축을 설정합니다. 각 항목은 불필요한 데이터 전송을 줄여 대역폭 비용을 절감하고 응답 속도를 높이는 데 기여합니다.
브라우저가 이미 캐싱한 리소스를 재요청할 때, CDN이 콘텐츠 변경 여부만 확인하고 변경이 없으면 헤더만 담긴 304 응답을 반환합니다. 전체 파일을 재전송하지 않아 대역폭과 응답 시간이 크게 절감됩니다.
브라우저가 캐싱한 리소스의 마지막 수정 시각을 헤더로 전달합니다. CDN이 캐싱된 Last-Modified 값과 비교해 변경 여부를 판단합니다.
브라우저가 캐싱한 리소스의 ETag(콘텐츠 해시)를 헤더로 전달합니다. CDN이 현재 캐싱된 ETag와 비교해 변경 여부를 판단합니다. 시각 비교보다 정밀합니다.
비디오 탐색(seek) 등에서 파일의 특정 바이트 구간만 요청하는 방식. If-Range는 캐싱된 버전이 유효한지 먼저 확인하고, 유효하면 206 Partial Content로 응답합니다.
HTML, CSS, JS, JSON 등 텍스트 콘텐츠를 압축 전송합니다. 이미지·비디오는 이미 압축된 포맷이므로 적용하지 않습니다. Brotli는 GZip 대비 20~26% 추가 압축률을 제공합니다.
① 클라이언트 304 정책 (조건부 요청)
브라우저가 보낸 조건부 헤더(If-Modified-Since, If-None-Match)를 CDN이 어떤 기준으로 평가해 304를 반환할지 결정합니다. 두 헤더를 함께 사용하는 경우 어느 하나라도 일치하면 304로 판단할지, 특정 헤더만 사용할지를 선택합니다.
| 옵션 | 동작 | 권장 상황 |
|---|---|---|
| 일부 일치 권장 | If-Modified-Since 또는 If-None-Match 중 하나라도 일치하면 304로 판단합니다. 두 헤더를 모두 활용해 최대한 304를 반환합니다. |
대부분의 서비스 — 대역폭 절감 효과 최대화 |
| If-Modified-Since만 | If-Modified-Since 헤더만으로 판단합니다. ETag를 무시합니다. |
원본 서버가 ETag를 생성하지 않는 경우 |
| If-None-Match만 | If-None-Match(ETag) 헤더만으로 판단합니다. 수정 시각을 무시합니다. |
콘텐츠 해시 기반으로만 변경을 감지하고 싶은 경우 |
② If-Modified-Since 조건판단
브라우저가 보낸 If-Modified-Since 값과 CDN이 캐싱한 Last-Modified 값을 어떻게 비교할지 정의합니다. HTTP 표준에서는 "같거나 큰 경우"(이상)를 변경 없음으로 판단하지만, 엄격하게 "정확히 일치하는 경우"만 304로 판단하는 옵션도 제공합니다.
| 옵션 | 304 반환 조건 | 권장 상황 |
|---|---|---|
| 같거나, 큰 경우 권장 | 클라이언트 값 ≥ 캐싱된 Last-Modified 값이면 304 반환. HTTP 표준 동작 방식. |
대부분의 서비스 — 표준 준수 및 대역폭 절감 |
| 일치할 경우 | 클라이언트 값 = 캐싱된 Last-Modified 값이 정확히 동일한 경우에만 304 반환. |
콘텐츠 수정 시각이 자주 바뀌는 서비스에서 엄격하게 재검증을 강제할 때 |
③ If-Range 헤더 처리
If-Range 헤더는 브라우저가 범위 요청(Range Request)을 보내기 전에 "내가 캐싱한 버전과 CDN이 가진 버전이 동일한가?"를 먼저 확인하는 전제 조건 헤더입니다.
| 상황 | If-Range 활성화 시 동작 | If-Range 비활성화 시 동작 |
|---|---|---|
| 캐싱된 버전이 유효한 경우 | 206 Partial Content — 요청한 바이트 구간만 전송 | If-Range 헤더를 무시하고 항상 200 전체 응답 또는 Range만 처리 |
| 캐싱된 버전이 변경된 경우 | 200 OK — 전체 파일을 새로 전송 |
④ GZip / Brotli 압축
텍스트 기반 콘텐츠(HTML, CSS, JS, JSON, XML 등)를 CDN이 압축해 전송합니다. 브라우저가 압축을 지원하면 Accept-Encoding 헤더로 알려주고, CDN은 그에 맞는 압축 포맷으로 응답합니다. 원본이 이미 압축된 콘텐츠를 반환한다면 CDN은 재압축하지 않고 압축 상태를 유지합니다.
| 압축 방식 | 압축률 | 브라우저 지원 | 권장 상황 |
|---|---|---|---|
| GZip | 일반적으로 60~80% 크기 감소 | 모든 현대 브라우저 지원 (IE6+) | 호환성이 중요한 서비스 |
| Brotli | GZip 대비 20~26% 추가 압축 | Chrome 50+, Firefox 44+, Safari 11+, Edge 15+ | 최신 브라우저 대상 서비스, 성능 최적화 우선 |
/sample/api) 또는 와일드카드를 포함하는 패턴(/asset/*.js)으로 구성할 수 있습니다.압축 적용 권장 대상
| 콘텐츠 유형 | 압축 적용 | 이유 |
|---|---|---|
| HTML, CSS, JS, JSON, XML, SVG, 폰트(woff) | 적용 권장 | 텍스트 기반으로 압축률이 높음 (60~80% 크기 감소) |
| JPEG, PNG, WebP, AVIF, GIF | 적용 불필요 | 이미 손실/무손실 압축된 바이너리 포맷 — 재압축 시 오히려 크기 증가 가능 |
| MP4, WebM, MP3, AAC | 적용 불필요 | 미디어 코덱이 자체적으로 압축 — 추가 압축 효과 없음 |
| ZIP, gz, br 등 압축 아카이브 | 적용 불필요 | 이미 압축된 파일 — 재압축 시 크기 증가 또는 처리 부하만 발생 |
/*처럼 모든 URL에 압축을 적용하면 이미 압축된 이미지·비디오 파일에도 GZip/Brotli 처리를 시도합니다. 압축 효과는 없고 CDN 처리 부하만 증가합니다. 반드시 /*.js, /*.css, /*.html 등 텍스트 파일 패턴만 등록하세요.
접근 제어
HTTP→HTTPS 강제 리다이렉트, URL·IP·헤더 기반 접근 제어 규칙, OPTIONS 메서드 응답, HTTP 메서드 허용 범위를 설정합니다. CDN 엣지에서 요청을 선별적으로 허용·차단해 원본 서버 부하를 줄이고 보안을 강화합니다.
HTTP로 들어오는 모든 요청을 301(영구 리다이렉트)로 HTTPS로 전환합니다. 평문 통신을 차단해 도청·중간자 공격을 방지합니다.
URL 패턴, 클라이언트 IP, 헤더(Referer, User-Agent) 세 가지 조건을 조합해 요청을 허용(Allow) 또는 거부(Deny)합니다. 규칙은 선언 순서대로 평가됩니다.
브라우저는 Cross-Origin 요청 전 OPTIONS 메서드로 사전 확인(Preflight)을 보냅니다. CDN이 200으로 응답하도록 설정해야 CORS 요청이 정상 처리됩니다.
CDN에서 허용할 HTTP 메서드를 명시적으로 지정합니다. 정적 콘텐츠 CDN이라면 GET/HEAD만 허용하고 나머지는 원본으로 바이패스하거나 차단합니다.
① HTTP to HTTPS 리다이렉트
HTTP(포트 80)로 들어오는 모든 요청을 CDN 엣지에서 HTTPS(포트 443)로 301 영구 리다이렉트합니다. 클라이언트가 암호화되지 않은 평문으로 접속하는 것을 원천 차단하며, 브라우저는 이후 해당 도메인에 자동으로 HTTPS로 접속합니다.
Strict-Transport-Security 헤더를 추가하면 브라우저가 이후 요청부터 자동으로 HTTPS만 사용해 첫 요청의 평문 노출도 차단할 수 있습니다.
② 접근제어 규칙
URL 패턴, 클라이언트 IP, 요청 헤더(Referer, User-Agent 등) 세 가지 조건을 조합해 특정 요청을 허용(Allow) 또는 거부(Deny)합니다. 규칙은 선언된 순서대로(위→아래) 평가되며, 첫 번째로 일치하는 규칙이 적용됩니다. 더 구체적인 조건을 먼저 선언해야 합니다.
| 조건 항목 | 설명 | 입력 예시 |
|---|---|---|
| URL 패턴 | 접근을 제어할 요청 경로 패턴. 와일드카드 * 사용 가능. 비워두면 전체 URL에 적용됩니다. |
/m2livecloud/healthcheck/admin/*/*.env |
| IP 패턴 | 허용·차단할 클라이언트 IP 또는 IP 대역. CIDR 표기 또는 범위 표기를 지원합니다. | 192.168.1.1192.168.1.1-25510.0.0.0/8 |
| 헤더 패턴 | 요청 헤더 값으로 조건을 설정합니다. Referer(Hotlinking 방지), User-Agent(봇 차단) 등에 활용합니다. |
refereruser-agent |
| 동작 (Action) | 조건 일치 시 수행할 동작. 거부(Deny)는 응답코드와 함께 접근을 차단하고, 허용(Allow)은 명시적으로 통과시킵니다. | 거부(Deny) / 허용(Allow) |
| 응답코드 | 거부(Deny) 시 클라이언트에 반환할 HTTP 상태코드. 기본값은 403입니다. | 403 Forbidden404 Not Found200 OK |
| 대소문자 구분 | 헤더 값 매칭 시 대소문자를 구분할지 여부. URL·IP는 항상 대소문자 무관하게 처리됩니다. | 체크박스 활성화 시 구분 |
접근제어 활용 시나리오
| 목적 | URL 패턴 | IP 패턴 | 헤더 패턴 | 동작 | 응답코드 |
|---|---|---|---|---|---|
| 관리자 페이지 IP 허용 | /admin/* | 203.0.113.0/24 | — | 허용 | — |
| 관리자 페이지 외부 차단 | /admin/* | — | — | 거부 | 403 |
| Hotlinking(이미지 직링크) 방지 | /images/* | — | referer (외부 도메인) | 거부 | 403 |
| 특정 봇 User-Agent 차단 | — | — | user-agent (악성 봇 식별값) | 거부 | 403 |
| 민감 파일 외부 노출 차단 | /*.env, /*.git | — | — | 거부 | 404 |
| 헬스체크 엔드포인트 허용 | /healthcheck | — | — | 허용 | — |
③ OPTIONS 메서드 응답
브라우저는 다른 도메인(Cross-Origin)에 fetch, XMLHttpRequest 등으로 요청하기 전에 CORS Preflight 요청을 OPTIONS 메서드로 먼저 보냅니다. CDN이 OPTIONS 요청에 어떻게 응답할지 결정합니다.
| 옵션 | 동작 | 권장 상황 |
|---|---|---|
| 405 Method Not Allowed | OPTIONS 요청을 지원하지 않는다고 응답합니다. CORS Preflight가 실패해 브라우저의 Cross-Origin 요청이 차단됩니다. | Cross-Origin 요청이 전혀 없는 서비스 |
| 200 OK 권장 | OPTIONS 요청에 200으로 응답합니다. 브라우저가 Preflight를 통과해 실제 요청을 진행할 수 있습니다. 클라이언트 헤더 제어 탭에서 CORS 헤더도 함께 설정해야 합니다. | 웹폰트, API fetch, Canvas 등 Cross-Origin 요청이 있는 서비스 |
has been blocked by CORS policy 오류가 발생할 때 순서대로 확인하세요.
- 접근 제어 → OPTIONS 메서드가 200 OK로 설정되어 있는지 확인
- 클라이언트 헤더 제어 → CORS 헤더 지원이 활성화되어 있는지 확인
- 원본 서버가
Access-Control-Allow-Origin헤더를 반환하는지 확인
④ HTTP 메서드 제한
CDN이 처리하거나 원본으로 전달할 HTTP 메서드를 명시적으로 지정합니다. CDN은 기본적으로 HEAD, GET, POST를 처리하며, 이 외에 선언된 메서드만 원본으로 바이패스됩니다. 이 설정은 OPTIONS 메서드 응답 설정보다 우선합니다.
| 메서드 | 용도 | CDN 기본 처리 | 권장 설정 |
|---|---|---|---|
GET | 리소스 조회 — 캐싱 대상 | CDN 처리 (캐시) | 항상 허용 |
HEAD | 헤더만 조회 — 캐시 유효성 확인 | CDN 처리 | 항상 허용 |
POST | 데이터 전송 — 상태 변경 요청 | CDN 처리 (POST 캐싱 설정에 따름) | API 서비스에만 허용 |
PUT | 리소스 전체 교체 | 선언 시 원본 바이패스 | REST API 서비스에만 허용 |
DELETE | 리소스 삭제 | 선언 시 원본 바이패스 | REST API 서비스에만 허용 |
PATCH | 리소스 부분 수정 | 선언 시 원본 바이패스 | REST API 서비스에만 허용 |
OPTIONS | CORS Preflight 확인 | OPTIONS 메서드 설정에 따름 | CORS 사용 시 허용 |
TRACE | 요청 루프백 디버깅 | 선언 시 원본 바이패스 | 비허용 권장 (XST 공격 위험) |
CDN 서버에서 처리할 수 있는 메서드(HEAD, GET, POST)를 제외한, 선언된 모든 메서드는 원본으로 바이패스된다. 이 설정은 OPTIONS 메서드 응답설정보다 우선한다.
| 서비스 유형 | 권장 허용 메서드 |
|---|---|
| 정적 콘텐츠 CDN (이미지, CSS, JS) | GET, HEAD |
| 웹사이트 + CORS 지원 | GET, HEAD, OPTIONS |
| REST API CDN | GET, HEAD, POST, PUT, DELETE, PATCH, OPTIONS |
클라이언트 헤더 제어
CDN이 클라이언트(브라우저)에게 전송하는 응답 헤더를 제어합니다. CORS 지원, 세션 재사용, Keep-Alive, Via, ETag, Server, Age 헤더 설정과 클라이언트 요청/응답 헤더 변조까지 클라이언트 방향의 모든 헤더 정책을 이 탭에서 관리합니다.
| 항목 | 헤더 | 역할 요약 | 기본 권장값 |
|---|---|---|---|
| CORS 헤더 | Access-Control-Allow-Origin | 다른 도메인의 JS에서 CDN 리소스 접근 허용 | 활성화 (Cross-Origin 사용 시) |
| Connection 헤더 | Connection: keep-alive | 클라이언트와 CDN 간 TCP 연결 재사용 | 활성화 권장 |
| Keep-Alive 헤더 | Keep-Alive | 연결 유지 파라미터(최대 요청 횟수 등) 전달 | 활성화 권장 |
| Via 헤더 | Via | CDN 경유 여부 표시 — 디버깅용 | 운영 환경 비활성화 권장 |
| ETag 헤더 | ETag | 콘텐츠 해시로 브라우저 캐시 유효성 검증 → 304 절감 | 활성화 권장 |
| Server 헤더 | Server | 원본 서버 정보를 클라이언트에 전달 | 보안상 비활성화 권장 |
| Age 헤더 | Age | CDN 캐시에 저장된 후 경과한 시간(초) 표시 | 활성화 권장 (캐시 디버깅) |
| 요청헤더 변조 | 커스텀 | 클라이언트 → CDN 요청 헤더 추가·수정·삭제 | 필요 시 설정 |
| 응답헤더 변조 | 커스텀 | CDN → 클라이언트 응답 헤더 추가·수정·삭제 | 필요 시 설정 |
① CORS 헤더 지원
CORS(Cross-Origin Resource Sharing)는 브라우저가 다른 도메인의 리소스를 JS에서 접근할 수 있도록 허용하는 표준 메커니즘입니다. CDN이 응답에 Access-Control-Allow-Origin 헤더를 추가해 브라우저의 Cross-Origin 요청을 허용합니다. 웹폰트 로드, fetch() API 호출, Canvas 이미지 처리 등에서 필수입니다.
| 옵션 | 동작 | 권장 상황 |
|---|---|---|
| *, 모든 도메인 | Access-Control-Allow-Origin: *를 응답에 추가합니다. 모든 도메인에서의 Cross-Origin 요청을 허용합니다. |
공개 CDN, 공개 API, 누구나 사용 가능한 리소스 |
| 선언된 도메인 | 허용할 Origin 도메인을 직접 지정합니다. 요청의 Origin 헤더와 비교해 일치하는 경우에만 허용합니다. |
특정 도메인만 허용해야 하는 내부 서비스, 인증이 필요한 API |
fetch(url, { credentials: 'include' })처럼 쿠키나 Authorization 헤더를 포함하는 Cross-Origin 요청은 브라우저 보안 정책상 Access-Control-Allow-Origin: *로는 동작하지 않습니다. 이 경우 선언된 도메인 옵션으로 구체적인 Origin을 지정하고, Access-Control-Allow-Credentials: true 헤더를 응답헤더 변조로 추가하세요.
② Connection 헤더 (세션 재사용)
CDN이 클라이언트에게 응답할 때 Connection 헤더를 포함해 TCP 연결의 재사용 여부를 알립니다. 활성화하면 Connection: keep-alive를 응답에 추가해 클라이언트가 동일 TCP 연결로 여러 요청을 연속 전송할 수 있도록 합니다. 비활성화하면 Connection: close로 응답해 요청마다 새 TCP 연결이 맺어집니다.
③ Keep-Alive 헤더
Keep-Alive 헤더는 TCP 연결 유지에 대한 상세 파라미터를 클라이언트에 전달합니다. 최대 요청 횟수(max)를 설정하면 해당 연결에서 처리 가능한 최대 요청 수를 지정하며, 이후 트랜잭션마다 1씩 차감되어 0이 되면 연결을 종료합니다.
Connection: keep-alive는 "연결을 유지하겠다"는 의사 표현이고, Keep-Alive: max=1000은 "최대 1,000번 요청까지 유지하겠다"는 구체적인 조건입니다. HTTP/2·HTTP/3 환경에서는 멀티플렉싱으로 연결 재사용이 기본이므로 이 헤더의 영향이 줄어듭니다.
④ Via 헤더
Via 헤더는 HTTP 요청/응답이 어떤 프록시(CDN 포함)를 경유했는지 기록하는 표준 헤더입니다. CDN 경유 여부와 버전 정보를 확인할 수 있어 디버깅에 유용하지만, 운영 환경에서는 인프라 구성 정보가 외부에 노출될 수 있으므로 비활성화를 권장합니다.
⑤ ETag 헤더
ETag(Entity Tag)는 콘텐츠의 특정 버전을 나타내는 식별자(해시 값)입니다. CDN이 응답에 ETag를 포함하면 브라우저가 다음 요청 시 If-None-Match 헤더로 전달해, 콘텐츠가 변경되지 않았다면 CDN은 본문 없이 304 Not Modified만 반환합니다. 대역폭을 절감하고 페이지 로드 속도를 향상시킵니다.
⑥ Server 헤더
Server 헤더는 원본 서버의 소프트웨어 정보(예: Apache/2.4.51, nginx/1.21.0)를 클라이언트에 전달합니다. 원본 서버가 이 헤더를 응답에 포함하는 경우 CDN이 이를 클라이언트에 그대로 전달할지 결정합니다. 서버 버전 정보는 공격자가 취약점을 식별하는 데 활용될 수 있으므로 운영 환경에서는 비활성화를 권장합니다.
Server: Apache/2.4.51 (Ubuntu)처럼 구체적인 버전 정보가 노출되면 공격자가 해당 버전의 알려진 취약점(CVE)을 식별해 공격에 활용할 수 있습니다. 원본 서버 설정에서도 Server 헤더를 제거하거나 일반화하는 것을 함께 권장합니다.
⑦ Age 헤더
Age 헤더는 해당 콘텐츠가 CDN 캐시에 저장된 후 경과한 시간(초)을 나타냅니다. 예를 들어 Age: 300은 이 응답이 CDN에 5분 동안 캐싱되어 있었음을 의미합니다. 클라이언트와 개발자가 캐시 상태를 직접 확인할 수 있어 디버깅에 유용합니다.
Age 값을 확인하세요. Age: 0이면 방금 원본에서 가져온 것(Cache MISS 또는 첫 캐싱), 양수면 해당 초만큼 CDN에 캐싱된 상태(Cache HIT)입니다.
⑧ 요청헤더 변조 (클라이언트 → CDN)
클라이언트가 CDN 서버에 요청을 보낼 때 HTTP 헤더를 동적으로 추가·수정·삭제합니다. 원본 연결/헤더 제어 탭의 요청헤더 변조(CDN → 원본)와 방향이 다릅니다. 특정 URL 패턴에만 선택적으로 적용할 수 있습니다.
| 항목 | 설명 | 예시 |
|---|---|---|
| 헤더 이름 | 추가·변경·삭제할 HTTP 헤더 이름 | x-media-type, Authorization |
| 값 | 헤더에 설정할 값. 삭제 액션 선택 시 비워둡니다. | video/mp4 |
| URL 패턴 | 이 규칙을 적용할 URL 패턴. 빈값이면 전체 URL에 적용. | /*.mp4 |
| 액션 | 추가(없으면 추가·있으면 덮어쓰기) / 강제 덮어쓰기 / 삭제 중 선택 | 추가 (헤더가 존재하면 덮어쓰고 없다면 추가) |
⑨ 응답헤더 변조 (CDN → 클라이언트)
CDN이 클라이언트에 응답을 보낼 때 HTTP 헤더를 동적으로 추가·수정·삭제합니다. 원본 서버가 반환하지 않는 헤더를 CDN 레벨에서 삽입하거나, 노출해서는 안 되는 헤더를 제거할 때 사용합니다.
- 보안 헤더 삽입: 원본이 반환하지 않는
X-Content-Type-Options: nosniff,X-Frame-Options: DENY를 응답헤더 변조로 일괄 추가 - CORS 헤더 보완: 원본 서버 수정 없이
Access-Control-Allow-Origin헤더를 응답에 삽입 - 민감 헤더 제거:
X-Powered-By,Server헤더를 삭제 액션으로 제거해 서버 정보 노출 방지 - 캐시 정책 강제: 특정 경로(
/*.html)에만Cache-Control: no-cache를 강제 덮어쓰기로 적용
캐시 무효화 (퍼지)
원본 콘텐츠를 변경한 후 CDN 엣지에 캐싱된 이전 버전을 강제로 삭제해 최신 콘텐츠를 즉시 제공합니다. 퍼지 탭과 퍼지 히스토리 탭으로 구성됩니다.
CDN 엣지 노드에 저장된 캐시를 TTL 만료 전에 강제로 삭제하는 작업입니다. 원본 콘텐츠가 변경됐지만 TTL이 아직 남아 있을 때, 즉시 최신 버전을 제공해야 할 때 사용합니다.
특정 파일의 URL을 정확하게 지정해 해당 캐시만 삭제합니다. 쿼리스트링 포함 URL도 별도로 지정할 수 있습니다. 원본 부하가 가장 낮은 방식입니다.
와일드카드(*)를 포함한 경로 패턴으로 여러 파일을 한 번에 삭제합니다. 특정 디렉토리나 파일 확장자 전체를 한꺼번에 무효화할 때 사용합니다.
해당 도메인의 모든 캐시를 동시에 삭제합니다. 대규모 배포·전체 리뉴얼 시 사용하지만, 이후 모든 요청이 원본으로 집중되므로 트래픽이 적은 시간에 실행해야 합니다.
퍼지 유형 비교
| 유형 | 삭제 범위 | 원본 부하 | 권장 상황 | 입력 예시 |
|---|---|---|---|---|
| URL 퍼지 | 지정한 URL과 정확히 일치하는 캐시만 삭제 | 낮음 | 특정 이미지·파일·API 응답 수정 | /images/banner.jpg/images/image.png?goodNo=123 |
| 패턴 퍼지 | 와일드카드 패턴에 일치하는 캐시 일괄 삭제 | 중간 | 특정 디렉토리 교체, 파일 확장자 전체 갱신 | /page/*.html/images/*/* |
| 전체 퍼지 | 해당 도메인의 모든 캐시 동시 삭제 | 높음 🚨 | 대규모 배포, 전체 리뉴얼, CDN 설정 대폭 변경 | — |
퍼지 실행
퍼지를 실행하려면 먼저 도메인을 선택한 후 퍼지 유형을 선택하고 내용을 입력합니다. URL 퍼지의 경우 한 줄에 하나씩 URL을 입력하며, 도메인 이름은 포함하지 않고 경로(/)부터 입력합니다.
퍼지 히스토리
실행된 모든 퍼지 작업의 이력을 확인합니다. 도메인, 퍼지 타입, 날짜로 필터링할 수 있으며, 각 퍼지의 결과(size · time · count)로 실제 삭제된 캐시의 규모를 파악할 수 있습니다.
| 컬럼 | 의미 |
|---|---|
| ID | 퍼지 작업의 고유 식별 번호. 오름차순으로 증가합니다. |
| 도메인 | 퍼지가 실행된 CDN 도메인 |
| 타입 | URL / 전체 / 패턴 중 실행된 퍼지 유형 |
| 내용 | 퍼지 대상 URL 또는 패턴. 길면 "펼치기"로 전체 확인 가능 |
| 상태 | 완료 / 진행 중 / 실패 등 퍼지 처리 상태 |
| 결과 | size: 삭제된 캐시 총 용량(bytes), time: 처리 시간(ms), count: 삭제된 캐시 항목 수 |
| 사용자 | 퍼지를 실행한 계정 이메일 |
| 일시 | 퍼지 실행 시각 |
히스토리 결과 필드 해석
| 결과 필드 | 의미 | 해석 예시 |
|---|---|---|
size |
삭제된 캐시의 총 용량(bytes) | size: 55586692 → 약 53MB의 캐시 삭제됨size: 0 → 해당 URL이 캐시에 없었음 (Cache MISS 상태였음) |
time |
퍼지 처리에 걸린 시간(ms) | time: 8 → 8ms 만에 처리 완료 |
count |
삭제된 캐시 항목(파일) 수 | count: 27 → 27개의 캐시 항목 삭제됨count: 0 → 삭제된 캐시 없음 (미캐싱 상태) |
/)부터만 입력하는지 확인하세요.
상황별 퍼지 가이드
| 상황 | 권장 퍼지 유형 | 입력 예시 |
|---|---|---|
| 특정 이미지·파일 1~수십 개 수정 | URL 퍼지 | /images/banner.jpg/css/main.css |
| 특정 디렉토리 전체 교체 | 패턴 퍼지 | /images/* |
| 특정 확장자 전체 갱신 | 패턴 퍼지 | /*.css, /*.js |
| CDN 캐시 설정 변경 후 반영 | 패턴 퍼지 또는 전체 퍼지 | /* 또는 전체 선택 |
| 대규모 배포·전체 사이트 리뉴얼 | 전체 퍼지 (저트래픽 시간대) | — |
| 이미지 최적화 설정 변경 | 패턴 퍼지 | /images/*, /*.jpg |