[CDN] HLS 프로토콜이란?

Asher·2025년 7월 30일

CDN

목록 보기
1/4
post-thumbnail

0. 도입

실무를 수행하며 HLS라는 단어를 처음 들어봤습니다. CDN 업무를 수행하며 OVP(Online Video Platform)을 운영하고 있는데요 처음에 HLS에 대한 정보도 부족하고 어떻게 실제 작동하는지에 대한 지식이 부족해 어려움을 겪었습니다. 지금은 어느정도 HLS에 대해 이해하고 있지만 알고 있는 내용을 한번 정리해 보기 위해 이 글을 씁니다.

1. HLS란?

  • HTTP Live Streaming(HLS)는 Apple에서 개발한 미디어 스트리밍 프로토콜로 비디오 콘텐츠를 인터넷을 통해 실시간 또는 On-demand로 스트리밍 하는데 사용됩니다. 현재 널리 사용되는 Adaptive Bitrate StReaming(ABR) 입니다.

  • HLS의 특징으로는

    • HTTP 기반의 스트리밍
    • 적응형 비트레이트(Adaptive Bitrate) 지원
    • 파일 분할 및 플레이리스트 구조
    • 높은 호환성 및 접근성
    • CDN과의 통합 용이
    • VOD, Live 모두 사용 가능

    이 있습니다.

2. HLS의 구조

  • Master Playlist(.m3u8)
    • 여러 개의 미디어 플레이리스트를 참조하는 최상단 m3u8, 서로 다른 해상도, 비트레이트를 포함합니다.
  • Media Playlist(.m3u8)
    • 각 세그먼트들의 위치(URL), 순서, 길이 등의 정보를 담고 있는 메타데이터 파일 입니다.
  • Media Segment(ts)
    • 전체 영상이 수 초 단위로(보통 2~10초) 분할된 미디어 조각입니다. MPEG-TS 포맷을 주로 사용합니다.

그림을 보면 조금 더 이해가 쉬워 그림을 한번 봐볼까요?

위의 그림처럼 Master Playlist 안에는 다양한 품질의 Media Playlist가 있으며 그 안에는 미디어 조각들인 Media Segment가 존재합니다.

예시를 보며 조금 더 자세히 알아보겠습니다.

실제 HLS 영상을 분석할때, Chrome 개발자 도구를 사용해서 Master Playlist, Media Playlist, Media Segment를 다운로드 하는 것을 볼 수 있습니다.

먼저 Master Playlist의 내용을 보겠습니다.
(여기에서는 playlist.m3u8)

#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=3513750,RESOLUTION=1920x1080,FRAME-RATE=25.000,NAME="1080P",CLOSED-CAPTIONS=NONE
https://test/good_1080P/v/chunklist.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=1241250,RESOLUTION=1280x720,FRAME-RATE=25.000,NAME="720P",CLOSED-CAPTIONS=NONE
https://test/good_720P/v/chunklist.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=351250,RESOLUTION=640x360,FRAME-RATE=25.000,NAME="360P",CLOSED-CAPTIONS=NONE
https://test/good_360P/v/chunklist.m3u8

앞서 설명드렸던 것처럼 다양한 품질의 Media Playlist들의 URL을 가지고 있는것을 알 수 있습니다.

이 URL을 바탕으로 사용자들의 대역폭(Bandwidth)를 측정하여 대역폭에 맞는 동영상을 재생하게 됩니다.

그러면 사용자의 대역폭은 어떻게 알 수 있을까요?
➡️ 플레이어(HLS.js, Safari 등)가 일부 세그먼트를 다운로드해보고, 그 속도와 크기를 기반으로 실제 네트워크 대역폭을 계산해서 알맞은 해상도를 선택합니다.

위의 Master Playlist의 태그의 의미는
#EXTM3U : 파일이 M3U8 형식(HLS playlist)임을 나타내는 태그
#EXT-X-STREAM-INF : 미디어 플레이리스트에 대한 정보를 제공하는 태그


두번째로 Media Playlist 입니다.
(여기서는 chunklist.m3u8)

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10.0,
/test/good_1080P/v/0.ts
#EXTINF:10.0,
/test/good_1080P/v/1.ts
#EXTINF:10.0,
/test/good_1080P/v/2.ts
#EXTINF:7.28,
/test/good_1080P/v/3.ts
#EXT-X-ENDLIST

Media Playlist안에는 전체 영상에서 특정 시간 초로 분리된 미디어 조각들의 정보가 있습니다.
이 미디어 조각들을 다운로드 하며 영상을 재생하는 구조로 설명할 수 있습니다.

위의 Media Playlist의 태그의 의미는

#EXTM3U : 파일이 M3U8 형식(HLS playlist)임을 나타내는 태그
#EXT-X-VERSION:3 : HLS 버전 3 사용
#EXT-X-TARGETDURATION:10 : 가장 긴 세그먼트의 재생 시간 (초) 기준값
#EXT-X-MEDIA-SEQUENCE:0 : 첫 세그먼트의 순번 (시작 인덱스)
#EXTINF:10.0 : 다음 세그먼트의 재생 시간 (초 단위)
#EXT-X-ENDLIST : 더 이상 세그먼트가 없음을 의미 (VOD 완료 표시)
입니다.


마지막으로 Media Segmnet입니다.
(여기에서는 0.ts)

이 Segment 는 실제 미디어이기 때문에 실제 브라우저 창에 0.ts의 요청 URL을 입력하게 되면 10초로 분리 된 동영상이 다운로드 됩니다.

실제 .ts 파일을 URL에 입력했을 경우

위의 그림과 같이 조각난 동영상의 일부가 다운로드 되게 됩니다.
이 동영상들을 조합하게 된다면 하나의 완전한 동영상이 완성되게 됨으로서 스크린 녹화를 하지 않고도 원본 동영상을 얻을 수 있습니다.
이러한 악용사례를 방지하기 위해 DRM 솔루션들이 있는데, 그 부분은 다음번에 다뤄보겠습니다.


3. HLS의 동작방식

그러면 HLS는 어떻게 동작할까요?

1. 인코딩 & 패키징

  • 원본 미디어 파일을 여러 품질(해상도/비트레이트)로 인코딩합니다.
  • 인코딩된 파일들을 짧은 세그먼트(기본 6초, 보통 2~10초)로 분할(Segmenting)합니다.
  • 각 품질마다 개별 Playlist 생성
  • Master Playlist에 각각의 M3U8들을 링크로 연결

2. 전송

  • 모든 세그먼트와 플레이리스트 파일들을 HTTP 서버에 업로드
  • Master Playlist를 받아 적절한 품질의 M3U8을 선택하고 스트리밍을 시작

3. 재생

  • 클라이언트는 M3U8을 파싱해 세그먼트를 순차적으로 요청하며 다운로드하고 재생
  • 네트워크 상황에 따라 다른 해상도의 스트림으로 자동 전환

이러한 순서로 동작하게 됩니다.

그림으로 보면 조금 이해하기 쉬울것 같습니다!

HLS는 HTTP 형식이기 때문에 앞서 말한것 처럼 CDN 적용이 가능하여 아직까지도 많은 사랑을 받고 있습니다!


참고문헌

https://developer.apple.com/library/archive/referencelibrary/GettingStarted/AboutHTTPLiveStreaming/about/about.html
https://www.cloudflare.com/ko-kr/learning/video/what-is-http-live-streaming/
https://developer.apple.com/documentation/http-live-streaming

profile
System Engineer의 발전기록

1개의 댓글

comment-user-thumbnail
2025년 8월 28일

유익해요

답글 달기