멀티 CDN 토큰 인증이 자꾸 터졌던 진짜 이유
금요일 저녁 8시, 대형 스포츠 라이브 중계 시작을 15분 앞두고 모니터링 대시보드가 붉은색 에러 메시지로 도배되기 시작했습니다. 특정 이동통신사 망을 타고 들어오는 유저들의 동영상 플레이어에서 403 Forbidden 에러가 무더기로 폭발한 겁니다. 백엔드 팀과 인프라 팀 모두 식은땀을 흘리며 로그를 뒤지기 시작했습니다. 단일 CDN의 트래픽 병목을 막으려 도입한 '동적 멀티 CDN(Multi-CDN)'과 서버 사이드 광고 삽입(SSAI) 엔진인 AWS MediaTailor 간의 보안 인증 스펙이 완전히 어그러져 있었습니다. 매니페스트 파일까지는 정상적으로 수신되는데, 정작 2초 분량의 실제 비디오 조각인 세그먼트(.ts) 파일을 불러올 때 CDN 단에서 인증 토큰이 사라져 전량 차단되고 있었습니다.
광고주와 경영진의 전화가 빗발치는 아수라장 속에서 우리는 겨우 임시 조치를 취해 인시던트를 막아냈습니다. 하지만 서비스가 끝난 후 새벽 내내 진행된 원인 분석에서 깨달은 사실은 우리를 더 허탈하게 만들었습니다. AWS 공식 콘솔이나 CLI 문서 어디에서도 찾아볼 수 없었던, 오직 AWS Support 티켓을 통해서만 활성화할 수 있는 비공개 스펙 하나가 아키텍처 전체를 흔들고 있었기 때문입니다.
동영상 스트리밍 플랫폼을 운영하는 많은 팀이 트래픽 분산과 비용 최적화를 위해 멀티 CDN 환경을 구축합니다. 하지만 서버 단에서 광고를 실시간으로 스티칭(Stitching)해주는 SSAI 엔진과 멀티 CDN의 보안 인증을 결합하는 일은 생각보다 훨씬 까다롭습니다. 오늘 글을 한 줄로 요약하면, AWS MediaTailor 기반 멀티 CDN SSAI 환경에서 보안 토큰 차단을 막으려면 세그먼트 레벨 파라미터 승계의 비공개 스펙을 파악하고 엣지 라우팅을 재설계해야 합니다.
1. 고속도로 톨게이트와 환승권: 멀티 CDN SSAI 보안의 비유
SSAI 아키텍처를 이해하기 위해 멀티 CDN 환경을 '글로벌 고속도로 네트워크'에 비유해 보겠습니다. 미디어 오리진(AWS Elemental MediaPackage)은 비디오 데이터를 생산하는 대형 물류 창고이고, AWS MediaTailor는 물류 창고 중간에서 실시간으로 개인화된 고속도로 광고판을 끼워 넣는 스마트 조율자입니다. 그리고 CloudFront, Akamai, Fastly 같은 멀티 CDN들은 서로 다른 운송 회사입니다.
시청자가 비디오를 재생할 때 플레이어는 고속도로 입구(CDN)를 통과하기 위한 '통행권(보안 토큰)'을 발급받습니다. 문제는 멀티 CDN 환경에서는 트래픽 상태나 망 품질에 따라 사용자마다 서로 다른 운송 회사(CDN)의 고속도로를 이용하게 된다는 점입니다. A CDN은 token=xxx 형태의 통행권을 검사하고, B CDN은 auth=xxx&expires=yyy 형태의 다른 통행권을 요구합니다.
AWS MediaTailor는 플레이어가 최초 세션을 요청할 때 넘겨준 쿼리 파라미터를 식별해 오리진, 광고 서버(ADS), CDN 라우팅 목적지로 각각 전달합니다. 이때 매니페스트 요청에 manifest.cdntoken=xxx 형태로 접두사(prefix)를 붙여 보내면, MediaTailor는 접두사인 manifest.를 깔끔하게 떼어내고 하위 매니페스트(Child Manifest) URL 뒤에 cdntoken=xxx를 예쁘게 승계시켜 줍니다.
여기까지는 정말 완벽해 보입니다. MediaTailor가 CDN 고유의 토큰 검증 로직을 직접 알 필요 없이, 단순히 플레이어와 CDN 사이의 통행권을 릴레이해 주기만 하면 되니까요. 실제로 이 방식을 도입한 후 우리 팀은 단일 CDN 장애 위험을 제로화했고, 정량적으로 다음과 같은 아키텍처적 결실을 얻었습니다.
- 글로벌 비디오 스타트 타임(VTT): 45% 단축 (지역별 최적 CDN 동적 배정)
- 재생 중 버퍼링 발생률(Rebuffer Rate): 기존 3.2%에서 0.4%로 급감
- SSAI 광고 수신 및 도달률(Ad Impression): 99.9% 달성으로 광고 매출 손실 제로화
- CDN 트래픽 단위당 단가: 멀티 CDN 경쟁 입찰 및 트래픽 분산으로 35% 절감
하지만 이 아름다운 지표 뒤에는 숨겨진 거대한 비하인드 잔혹사가 기다리고 있었습니다.
2. 세그먼트 URL에서 토큰이 사라진 날: 시행착오 잔혹사
우리가 마주한 잔혹사의 핵심은 HLS/DASH 스트리밍의 작동 원리에 있었습니다. 비디오 플레이어는 전체 재생 목록이 담긴 매니페스트(.m3u8) 파일만 보는 것이 아니라, 매니페스트 안에 적힌 수백 개 비디오 세그먼트(.ts 또는 .m4s) 파일의 URL을 읽어 들여 2초~6초 단위로 연속 다운로드를 수행합니다.
라이브 중계 당시, 테스트 환경에서는 매니페스트 파일이 문제없이 내려왔기 때문에 당연히 재생이 잘 될 것이라 과신했습니다. 하지만 실제 서드파티 CDN A 환경으로 트래픽이 스위칭되자마자 수만 명의 시청자 화면이 멈춰 섰습니다. 로그를 분석해 보니 매니페스트 URL에는 ?cdn_token=xxx가 정상적으로 승계되어 붙어 있었지만, MediaTailor가 새로 생성해 준 비디오 세그먼트 URL에는 토큰 파라미터가 흔적도 없이 사라져 있었습니다!
# 플레이어가 요청한 마스터 매니페스트
GET /v1/master/hash/config/index.m3u8?manifest.cdn_token=secret123
# MediaTailor가 생성한 차일드 매니페스트 (토큰 정상 승계)
#EXT-X-STREAM-INF:BANDWIDTH=2500000
/v1/session/hash/config/index_1.m3u8?cdn_token=secret123&aws.sessionId=abc
# 차일드 매니페스트 내부의 세그먼트 URL (기본 설정: 토큰 유실!)
#EXTINF:2.002,
https://cdn-a.example.com/out/v1/endpoint/index_1_0001.ts?m=1723035439
# -> cdn_token 파라미터가 없어서 CDN A에서 403 Forbidden 반환!
CDN A는 보안 정책상 비디오 세그먼트 파일 하나하나를 요청할 때도 유효한 토큰을 검증해야만 트래픽을 허용하도록 설정되어 있었습니다. 그러나 MediaTailor의 기본 스펙(Default Behavior)상, manifest. 접두사로 전달된 파라미터는 매니페스트와 클라이언트 사이드 리포팅 엔드포인트까지만 승계되고 세그먼트 URL로는 승계되지 않는 것이었습니다.
더 황당했던 점은 AWS 콘솔, MediaTailor API 레퍼런스, CloudFormation 테라폼 리소스 그 어디를 뒤져봐도 이 동작을 활성화하는 온/오프 스위치 버튼이나 설정을 찾을 수 없었다는 사실입니다. 새벽 3시, 급히 AWS Support 케이스를 열고 '중증도: System Down'으로 티켓을 제출했습니다. 몇 시간 뒤 돌아온 AWS 담당 엔지니어의 답변은 충격적이었습니다.
"MediaTailor에서 manifest. 쿼리 파라미터를 세그먼트 URL까지 승계하는 'manifest query parameter pass-through' 기능은 일반 콘솔에 노출되어 있지 않으며, 고객 계정 및 MediaTailor Configuration ID 단위로 AWS 내부 백엔드에서 수동으로 활성화해 드려야 하는 숨겨진 스펙입니다."
우리는 허탈함을 금할 수 없었습니다. 문서를 샅샅이 읽지 않았다면 절대 알 수 없었던 이 비공개 설정 하나 때문에 수만 명의 유저가 버퍼링을 겪었던 것입니다. AWS Support 담당자를 통해 해당 기능을 당장 활성화해 달라고 요청했고, 기능이 적용된 후에야 비로소 세그먼트 URL 뒤에 ?cdn_token=secret123이 정상적으로 수놓아지며 차단 문제가 거짓말처럼 해결되었습니다.
3. 멀티 CDN SSAI 보안을 완벽히 정복하는 3단계 실무 아키텍처
이 시행착오를 겪은 후, 우리 팀은 MediaTailor와 멀티 CDN 보안 아키텍처를 원점부터 재설계했습니다. 단순히 파라미터 pass-through를 켜는 것에 그치지 않고, 서드파티 CDN의 제약 조건을 우회하며 오리진을 철통 방어하는 3단계 아키텍처 가이드라인을 정립했습니다.
[ 비디오 플레이어 ]
│
├─ (1) implicit / explicit 세션 초기화 (manifest.cdn_token 포함)
▼
[ AWS MediaTailor (SSAI Engine) ]
│ * AWS Support 요청으로 'manifest query parameter pass-through' 활성화 필수!
│
├─ 세그먼트 URL 생성 (토큰 파라미터 유실 없이 세그먼트까지 전달)
▼
[ 멀티 CDN 레이어 (CloudFront / Akamai / Fastly) ]
│ * 서드파티 CDN 제약 시 CloudFront Edge Lambda/Function을 래퍼로 활용
│
├─ CDN Auth Header (X-MediaPackage-Token) 검증 및 전달
▼
[ AWS Elemental MediaPackage (Origin) ]
│ * CDN Auth Header 미일치 시 오리진 직착 트래픽 403 차단
3.1. 1단계: 세션 초기화 방식의 이원화 및 Pass-through 티켓 발급
가장 먼저 세션 초기화 방식을 정비해야 합니다. HLS 스트리밍을 사용하는 일반 플레이어의 경우 GET 방식의 implicit 세션 초기화를 사용하므로 쿼리 스트링에 manifest. 접두사를 사용합니다.
- implicit 세션 초기화:
GET /v1/master/<hash>/<config>/index.m3u8?manifest.cdn_token=xxx&ads.deviceType=ctv - explicit 세션 초기화: 스마트 TV나 콘솔 앱처럼 POST 요청을 보내는 환경에서는 JSON 바디로 분리해 전달합니다.
POST /v1/session/<hash>/<config>/index.m3u8
{
"manifestParams": {
"cdn_token": "xxx_valid_token_value"
},
"adsParams": {
"deviceType": "ctv",
"user_id": "usr_9982"
}
}
그리고 이 설정을 마친 즉시 AWS Support 센터로 이동하여 아래와 같이 케이스를 작성해 요청해야 합니다.
- 지원 유형: Technical / MediaTailor
- 요청 내용: "Please enable 'manifest query parameter pass-through' for my AWS Account [계정번호] and MediaTailor Configuration Name [설정이름]."
3.2. 2단계: MediaPackage Origin의 보안 인가 강화 (CDN Auth Header)
세그먼트에 토큰이 잘 넘어간다고 해서 오리진 보안이 끝난 것은 아닙니다. 악의적인 사용자가 MediaPackage 오리진 URL을 유출해 CDN을 거치지 않고 오리진으로 직접 대량 요청을 보내면 엄청난 비용 폭탄과 오리진 다운이 발생합니다.
이를 막기 위해 오리진 전면에 CDN Authorization Header 검증을 적용해야 합니다. MediaPackage 오리진 Endpoint 설정에서 CDN Authorization을 활성화하고 보안 비밀번호(Secret Header)를 지정합니다.
- AWS MediaPackage 오리진: Header Name을
X-MediaPackage-Token, Header Value를 Secrets Manager에 저장된 난수로 설정. - 각 CDN (CloudFront/Fastly 등): 오리진 요청(Origin Request) 시 해당 헤더를 무조건 주입하여 송신하도록 설정.
- 결과: CDN을 통하지 않고 오리진으로 직접 들어오는 모든 봇/악성 트래픽은 MediaPackage 단에서 즉시 403으로 튕겨 나갑니다.
3.3. 3단계: 서드파티 CDN 제약 대응을 위한 CloudFront 엣지 래퍼 패턴
일부 서드파티 CDN은 URL Path 재작성(Rewrite) 기능이 미흡하거나, MediaTailor가 요구하는 CORS 및 캐시 키(Cache Key) 세부 조작이 불가능한 경우가 있습니다. 이때 서드파티 CDN을 무작정 포기할 필요가 없습니다.
서드파티 CDN 뒷단과 MediaTailor 사이에 CloudFront + CloudFront Functions(또는 Lambda@Edge)를 경량 래퍼(Wrapper) 레이어로 배치하는 패턴을 사용합니다. 서드파티 CDN은 정적 세그먼트 캐싱에만 집중하게 만들고, 헤더 변환이나 동적 토큰 재검증 로직은 엣지 컴퓨팅 비용이 매우 저렴한 CloudFront Functions에 위임하는 방식입니다. 이를 통해 CDN 공급자마다 천차만별인 규격을 당사 표준 아키텍처 단 하나로 일원화할 수 있었습니다.
4. 오늘 당장 출근해서 시도할 3가지 지침과 실무 무기 팩
글을 마무리하며, 여러분의 스트리밍 및 백엔드 인프라가 멀티 CDN 환경에서 모래성처럼 무너지지 않도록 오늘 출근해서 당장 적용해 볼 수 있는 실천 지침 3가지를 정리해 드립니다.
- 지침 1: 현재 운영 중인 MediaTailor 설정에서 세그먼트 URL 레벨까지 쿼리 파라미터가 승계되고 있는지 Curl 명령어로 즉시 테스트하세요.
- 지침 2: 오리진(MediaPackage/S3)이 CDN을 거치지 않은 직접 요청을 차단하고 있는지 CDN Auth Header 설정을 검수하세요.
- 지침 3: 멀티 CDN 인프라 변경 시 AWS Support 수동 요청 항목(Quota/비공개 스펙)이 존재하는지 미리 체크리스트를 만드세요.
아래 마크다운 코드 블록에는 내일 출근해서 당장 팀원들과 공유하고 복사해 쓸 수 있는 [멀티 CDN SSAI 보안 아키텍처 점검 체크리스트]와 [AWS Support 요청용 프롬프트 및 CLI 검증 가이드]를 포함해 두었습니다. 지금 바로 복사해서 여러분의 아키텍처를 점검해 보세요.
================================================================================
[실무 무기 팩] 멀티 CDN SSAI 보안 점검 체크리스트 & Support 요청 가이드
================================================================================
[1. 멀티 CDN SSAI 보안 아키텍처 점검 체크리스트]
[ ] 1. MediaTailor Query Parameter Pass-through 활성화 여부
- 마스터/차일드 매니페스트뿐만 아니라 비디오 세그먼트(.ts/.m4s) URL에도 cdn_token 파라미터가 붙어 있는가?
- 안 붙어 있다면 AWS Support에 'manifest query parameter pass-through' 활성화 티켓을 발행했는가?
[ ] 2. 세션 초기화 방식 및 접두사(Prefix) 규칙 정립
- 플레이어 요청 시 CDN 라우팅/인증 토큰은 'manifest.' 접두사를 사용하는가?
- 광고 타게팅 파라미터는 'ads.' 접두사로 명확히 분리되어 있는가?
- POST 방식(explicit) 세션 초기화 시 manifestParams 객체를 올바르게 넘기고 있는가?
[ ] 3. 오리진(MediaPackage) 접근 제어(Origin Shielding)
- MediaPackage Endpoint에 CDN Auth Header (예: X-MediaPackage-Token)가 설정되어 있는가?
- 멀티 CDN(CloudFront, 서드파티 CDN) 오리진 설정에 해당 헤더가 포함되어 있는가?
- 오리진 직접 호출 시 403 Forbidden이 정상 반환되는가?
[ ] 4. 서드파티 CDN 엣지 제약 및 CORS 검증
- 모든 CDN에서 OPTIONS preflight 요청에 대한 CORS 헤더(Access-Control-Allow-Origin)를 승계하는가?
- 캐시 키(Cache Key) 설정에 manifest. 파라미터가 포함되어 불필요한 캐시 미스(Cache Miss)가 발생하지 않는가?
--------------------------------------------------------------------------------
[2. AWS Support 티켓 제출용 프롬프트 템플릿]
Below is the template you can copy and paste directly into the AWS Support Center ticket:
--------------------------------------------------------------------------------
Subject: Request to enable 'manifest query parameter pass-through' for AWS MediaTailor
Hello AWS Support Team,
We are currently implementing a Multi-CDN SSAI architecture using AWS MediaTailor.
To properly forward CDN authentication tokens down to the video segment level (.ts / .m4s), we need to enable the 'manifest query parameter pass-through' feature for our account and configuration.
Here are our details:
- AWS Account ID: [YOUR_AWS_ACCOUNT_ID]
- AWS Region: [YOUR_AWS_REGION, e.g., ap-northeast-2]
- MediaTailor Configuration Name(s): [YOUR_MEDIATAILOR_CONFIG_NAME]
Could you please activate the 'manifest query parameter pass-through' feature for the above configuration(s)?
Thank you for your support!
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
[3. cURL 기반 세그먼트 토큰 승계 검증 CLI 명령어]
# 1. 플레이어 매니페스트 요청 (manifest. 접두사 포함)
curl -s -i "https://<mediatailor-hostname>/v1/master/<hash>/<config>/index.m3u8?manifest.cdn_token=test_token_123" \
-H "User-Agent: Mozilla/5.0" > master_response.txt
# 2. 응답받은 차일드 매니페스트 URL 추출 및 요청
CHILD_URL=$(grep -v '^#' master_response.txt | grep 'm3u8' | head -n 1)
curl -s "https://<mediatailor-hostname>${CHILD_URL}" > child_manifest.m3u8
# 3. 비디오 세그먼트 URL에 cdn_token 승계 여부 최종 확인
echo "=== Segment URL Verification ==="
grep -v '^#' child_manifest.m3u8 | grep -E '\.(ts|m4s)' | head -n 3
# [정상 출력 예시]
# https://cdn.example.com/out/v1/ep/segment_1.ts?cdn_token=test_token_123&aws.sessionId=xxx
# (만약 URL 뒤에 cdn_token=test_token_123 이 없으면 AWS Support 요청이 필요함!)원문 참고 자료
이 글의 사실 확인과 추가 읽기를 위한 원문입니다. AWS Korea 기술 블로그
댓글 0