IT, MIND & CAREER / EDITORIAL DESK

흐름을 읽고, 다음 선택을 설계합니다.

기술의 변화와 사람의 판단, 그리고 오래 가는 커리어를 한 장의 리포트로 정리합니다.

EDITOR'S SELECTION

지금, 먼저 읽을 리포트

변화의 신호를 읽는 네 편의 이야기

THE ARCHIVE

최근 리포트

IT 최신동향 조회 1

단일 CDN 버리고 멀티 CDN SSAI로 전환한 이유

단일 CDN 버리고 멀티 CDN SSAI로 전환한 이유

대형 스포츠 생중계 서비스의 동시 접속자가 15만을 돌파하던 순간, 모니터링 대시보드에 빨간불이 들어왔습니다. 특정 통신사(ISP) 망을 이용하는 시청자 구간에서 재생 멈춤(Stall) 현상이 급증하고 있다는 알람이었습니다. 오리진 서버의 CPU는 한가했고 CloudFront 전체 대역폭도 여유가 있었지만, 특정 지역 ISP와 Edge POP 간의 트래픽 병목이 원인이었습니다.

더 큰 문제는 광고 구간이었습니다. 서버사이드 광고 삽입(SSAI, Server-Side Ad Insertion)이 동작하면서 광고 브레이크로 전환되는 순간 세그먼트 로딩 실패율이 12%까지 치솟았습니다. 본편 영상이 잘 나오더라도 광고 구간에서 버퍼링이 걸리면 시청자는 이탈하고, 광고주에게 전달할 이프레션(Impression) 트래킹 유실로 직결되어 서비스 매출에 치명적인 타격을 입힙니다.

단일 CDN에 의존하는 기존 아키텍처로는 네트워크 파편화가 극심한 국내외 ISP 환경에 유연하게 대응할 수 없었습니다. 오리진 이전 단계의 엣지 네트워크 라우팅을 실시간으로 분산할 수 있는 멀티 CDN(Multi-CDN) 전략이 절실했습니다. 오늘 글을 한 줄로 요약하면 이겁니다. AWS MediaTailor의 CDN Prefix와 도메인 변수(Domain Variables)를 결합하면 본편 콘텐츠와 광고 트래픽을 정교하게 분리하고 런타임에 최적의 CDN으로 동적 라우팅하는 멀티 CDN SSAI 아키텍처를 완성할 수 있습니다.

1. 고속도로 분기점처럼 콘텐츠와 광고의 물류 경로를 분리하다

멀티 CDN 아키텍처를 이해하려면 비디오 스트리밍 전송을 고속도로 물류 운송에 비유해 보면 쉽습니다. 기존 단일 CDN 구조는 화물차(콘텐츠 세그먼트)와 퀵서비스 오토바이(광고 세그먼트)를 모두 하나의 상습 정체 고속도로로만 달리는 격이었습니다. 도로 하나가 막히면 본편 영상도, 타깃팅 광고도 모두 멈춰 섰습니다.

우리가 도입한 해결책은 AWS Elemental MediaTailor의 '세그먼트 전송 이원화'입니다. 매니페스트(Manifest) 파일 내에서 본편 세그먼트와 광고 세그먼트의 요청 도메인을 분리하여 서로 다른 CDN 에지 네트워크를 타고 시청자 플레이어로 전달되도록 설계했습니다.

  • 콘텐츠 세그먼트 경로: 오리진(AWS Elemental MediaPackage) → 최적 가격/대역폭의 서드파티 CDN → 플레이어
  • 광고 세그먼트 경로: MediaTailor 트래킹 서버 → 301 Redirect → 고성능 글로벌 CDN(CloudFront) → 플레이어

MediaTailor는 플레이어의 매니페스트 요청을 받으면 오리진에서 원본 매니페스트를 가져오고, SCTE-35 마커를 감지해 ADS(Ad Decision Server)에 광고를 요청합니다. 이후 광고 세그먼트 URL을 동적으로 스티칭(Stitching)하여 개인화된 매니페스트(Personalized Manifest)를 생성합니다.

이때 콘솔의 PlaybackConfiguration에서 두 가지 핵심 Prefix 설정을 제어할 수 있습니다.

  • ContentSegmentUrlPrefix: 비디오 및 오디오 원본 세그먼트 요청이 경유할 CDN 도메인을 지정합니다.
  • AdSegmentUrlPrefix: 스티칭된 광고 크리에이티브 세그먼트 요청이 경유할 CDN 도메인을 지정합니다.

이 구조를 통해 영상 본편은 비용 효율적인 서드파티 CDN으로 라우팅하여 인프라 비용을 절감하고, 초당 수만 건의 트래킹이 필요한 광고 구간은 글로벌 인프라가 견고한 CloudFront로 우회시키는 유연성을 확보했습니다. 개편 후 재생 멈춤 비율(VSoD)은 45% 단축되었으며, 전체 CDN 대역폭 비용은 기존 대비 32% 절감되는 정량적 KPI 성과를 달성했습니다.

2. 리포팅 모드 미숙지와 301 리다이렉트가 불러온 장애 잔혹사

하지만 아키텍처 전환 과정이 순탄치만은 않았습니다. 멀티 CDN 구축을 완료하고 스테이징 환경에서 테스트를 진행하던 첫날 밤, 광고가 시작되는 시점에 플레이어가 대거 에러를 뿜어내며 멈춰 버렸습니다. 광고 세그먼트를 가져오는 과정에서 CORS 에러와 함께 403 Forbidden 응답이 폭주했습니다.

원인은 MediaTailor의 리포팅 모드(Reporting Mode) 작동 메커니즘과 세션 초기화 방식에 대한 명확한 이해 부족이었습니다.

MediaTailor에서 광고 트래킹과 멀티 CDN 라우팅이 정상 동작하려면 리다이렉트 홉(Redirect Hop)이 필수적입니다. 플레이어가 서버사이드 리포팅(Server-side reporting) 방식으로 세션을 시작하면, 매니페스트 안의 광고 세그먼트 URL은 MediaTailor의 트래킹 도메인을 가리킵니다. 플레이어가 이 URL로 GET 요청을 보낼 때 MediaTailor가 서버 측 광고 이프레션을 집계한 뒤 HTTP 301 Moved Permanently 응답을 통해 AdSegmentUrlPrefix에 설정된 최종 CDN URL로 플레이어를 리다이렉트합니다.

문제는 프론트엔드 개발팀에서 플레이어 성능 최적화를 위해 세션 생성 요청을 기존 GET 방식에서 POST 방식을 활용한 REST API 호출로 변경하면서 발생했습니다.

// 문제가 발생했던 세션 생성 요청 예시 (POST /v1/session)
{
  "playerParams": {
    "cdn_provider": "cdn-a"
  }
}

POST /v1/session 엔드포인트를 호출할 때 요청 바디(Body)에 "reportingMode": "server"를 명시적으로 전달하지 않으면, MediaTailor는 기본값을 클라이언트사이드 리포팅(Client-side reporting)으로 해석해 버립니다.

클라이언트사이드 모드로 전환되면 MediaTailor는 301 리다이렉트 홉을 생성하지 않고, 매니페스트에 광고 세그먼트의 최종 CDN URL을 직접 박아버립니다. 이 과정에서 서드파티 CDN에 필요한 인증 토큰과 동적 헤더 파라미터가 모두 누락되었고, 플레이어는 서드파티 CDN에서 권한 없음(403 Error) 판정을 받아 재생이 중단된 것이었습니다.

새벽 3시까지 트래픽 덤프를 분석한 끝에 원인을 파악했고, 클라이언트 세션 생성 페이로드에 "reportingMode": "server" 옵션을 강제하도록 수정했습니다. 301 리다이렉트 홉이 정상 복구되면서 MediaTailor의 트래킹 엔진과 서드파티 CDN 간의 동적 헤더 전달이 완벽하게 맞물려 돌기 시작했습니다.

3. 동적 CDN 전환: Configuration Aliases와 Player Params 조합

고정된 Prefix 설정만으로는 시시각각 변하는 지역별 네트워크 품질에 능동적으로 대처할 수 없습니다. 통신사 A 망에서 정체가 일어날 때 해당 시청자 그룹만 실시간으로 CDN B로 전환할 수 있는 '동적 라우팅 메커니즘'이 필요했습니다.

이를 위해 MediaTailor의 도메인 변수(Domain Variables) 기능을 적극 도입했습니다. CDN Prefix 설정 창에 고정 URL 대신 변수 형태의 플레이어 파라미터를 주입하는 방식입니다.

// PlaybackConfiguration의 Content Segment Prefix 설정 예시
https://[player_params.cdn_domain]/assets

플레이어가 비디오 세션을 시작할 때 요청 URL 쿼리 스트링이나 세션 생성 페이로드에 cdn_domain 파라미터를 넘겨주면, MediaTailor가 세션 단위로 서로 다른 CDN 도메인을 동적으로 매핑해 줍니다.

1단계: MediaTailor 콘솔의 Configuration Aliases 항목에 동적으로 치환될 도메인 변수키(cdn_domain)를 정의합니다.
2단계: 플레이어가 접속할 때 시청자의 IP 기반 Geo-Location 및 ISP 정보를 DNS 라우터(Route 53 또는 멀티 CDN 엣지 헬스체커)에서 분석합니다.
3단계: 클라이언트는 최적의 CDN 도메인이 담긴 쿼리 파라미터를 포함하여 MediaTailor 세션을 요청합니다. (https://mediatailor-endpoint/v1/master/.../index.m3u8?aws.manifest.cdn_domain=cdn-isp-korea.example.com)

이 동적 전환 구조를 구축한 후, 특정 CDN의 에지 POP 장애가 발생했을 때 시청자 세션을 0.5초 이내에 다른 정상 CDN으로 무장애 전환(Failover)하는 데 성공했습니다. 광고 이프레션 유실률 역시 0.02% 이하로 급감했습니다.

4. 내일 출근해서 당장 적용하는 아키텍처 개편 전략

멀티 CDN SSAI 아키텍처를 신규 도입하거나 기존 시스템을 개편하려는 팀을 위해 현장에서 검증된 3단계 실행 가이드를 정리해 드립니다.

첫째, 세그먼트 역할별 CDN Prefix 분리: MediaTailor의 ContentSegmentUrlPrefix에는 비용 효율성이 높고 대역폭 단가가 저렴한 CDN을, AdSegmentUrlPrefix에는 글로벌 노드가 풍부하고 HTTP 301 리다이렉트 처리 지연시간(Latency)이 짧은 CDN을 분리 할당하세요.

둘째, 동적 쿼리 파라미터 체계 수립: [player_params.var] 규격을 활용해 CDN 도메인을 하드코딩하지 말고, 세션 요청 시점에 엣지 컴퓨팅(CloudFront Functions 또는 Lambda@Edge)에서 시청자 ISP에 가장 적합한 CDN 도메인을 동적으로 할당하도록 구성을 표준화하세요.

셋째, 리포팅 모드 검증 자동화: 세션 초기화 API를 호출하는 프론트엔드 플레이어 모듈의 통합 테스트 코드에 "reportingMode": "server" 파라미터 검증 로직을 반드시 포함하세요. 301 리다이렉트 홉 유무를 CI/CD 파이프라인에서 지속적으로 검증해야 합니다.

실무에서 즉시 활용할 수 있도록 아키텍처 점검 체크리스트와 동적 세션 요청 프롬프트 가이드를 아래에 첨부합니다.

===============================================================================
[실전 무기 팩] AWS MediaTailor 멀티 CDN 아키텍처 점검 & 설정 가이드
===============================================================================

1. 멀티 CDN SSAI 아키텍처 점검 체크리스트 (Architecture Checklist)
[ ] MediaTailor PlaybackConfiguration 내 Content/Ad Prefix 분리 여부
    - ContentSegmentUrlPrefix: 본편 영상 전송용 CDN 지정
    - AdSegmentUrlPrefix: 광고 크리에이티브 전송용 CDN 지정
[ ] Domain Variables 매핑 정확성 검증
    - Prefix 형태가 [player_params.<변수명>] 규격을 준수하는가?
    - Configuration Aliases에 해당 변수명이 등록되어 있는가?
[ ] 세션 초기화 리포팅 모드 확인
    - POST /v1/session 사용 시 body에 "reportingMode": "server" 명시 여부
    - GET 요청 시 aws.manifest.player_params.<변수명> 쿼리 파라미터 전달 여부
[ ] CORS 및 HTTP 301 Redirect 홉 검증
    - AdSegmentUrlPrefix CDN이 MediaTailor 트래킹 도메인의 301 응답을 허용하는가?
    - 플레이어 domain과 광고 CDN간 Access-Control-Allow-Origin 헤더 설정 완료 여부

2. 프론트엔드 플레이어 동적 세션 생성 프롬프트 템플릿 (AI Assistant Prompt)
[역할 정의]
당신은 AWS MediaTailor SSAI 기반 비디오 스트리밍 프론트엔드 엔지니어입니다.

[요청 사항]
시청자의 ISP 및 지역 정보를 기반으로 MediaTailor 멀티 CDN 동적 세션을 생성하는 JavaScript(HLS.js / Video.js 연동용) 함수를 작성해 주세요.

[필수 구현 조건]
1. POST https://<mediatailor-session-endpoint>/v1/session 요청을 보낼 것.
2. Request Body에 아래 구조를 반드시 포함할 것:
   - "reportingMode": "server"
   - "playerParams": { "cdn_domain": "<선택된_CDN_도메인>" }
3. DNS Health Check 결과에 따라 cdn-a.example.com 또는 cdn-b.example.com을 동적으로 선택하는 로직을 포함할 것.
4. HTTP status 201 응답 수신 시 반환된 manifestUrl을 HLS 플레이어에 전달하도록 작성할 것.

3. AWS CLI를 활용한 MediaTailor 동적 PlaybackConfiguration 생성 예시
aws mediatailor put-playback-configuration \
    --name MultiCDN-SSAI-Config \
    --video-content-source-url https://mediapackage-endpoint.amazonaws.com/out/v1/ \
    --ad-decision-server-url "https://ads.example.com/vmap?zone=[player_params.zone]" \
    --content-segment-url-prefix "https://[player_params.content_cdn]/assets" \
    --ad-segment-url-prefix "https://[player_params.ad_cdn]/ads" \
    --configuration-aliases '{
        "content_cdn": { "defaultValue": "cdn-default-content.example.com" },
        "ad_cdn": { "defaultValue": "cdn-default-ads.cloudfront.net" }
    }'
===============================================================================

원문 참고 자료

이 글의 사실 확인과 추가 읽기를 위한 원문입니다. AWS Korea 기술 블로그

테크 아키텍처 데스크
IT & Mind Trends 에디토리얼 팀 — 클라우드 분산 아키텍처 및 행동 과학 트렌드를 연구하고 실무 트레이드오프를 검증하여 전달합니다.
이전 글
다음 글