HLS 심층 분석: 왜 이 '오래된' 프로토콜이 2025년 스트리밍 세계를 여전히 지배하는가?
RTMP와 WebRTC가 미래라고 생각하십니까? 틀렸습니다. 이 글에서는 HTTP Live Streaming(HLS)의 아키텍처 원리, TS에서 fMP4로의 진화, 그리고 엔지니어링 실무에서 CORS와 캐싱의 함정을 피하는 방법을 심층 분석합니다. HLS를 마스터하는 것이 곧 스트리밍의 미래를 마스터하는 것입니다.

솔직해집시다.
스트리밍 기술의 세계에서 모두가 빛나는 새로운 장난감에 대해 이야기하는 것을 좋아합니다. WebRTC, QUIC, 초저지연(Ultra-Low Latency)… 듣기만 해도 멋집니다.
하지만 사실은 이렇습니다: 전체 인터넷 비디오 트래픽(네, 여러분이 매일 보는 Netflix와 YouTube를 포함해서)을 지탱하는 초석은 여전히 겉보기에 ‘투박한’ HLS(HTTP Live Streaming)입니다.
저도 같은 실수를 저질렀습니다. 저는 HLS가 “이전 세대”의 기술이며, 2009년 iPhone 3GS 시대의 산물이라고 생각했습니다. 너무 느리고, 너무 단순하고, 충분히 “geek”하지 않다고 생각했습니다.
제가 틀렸습니다.
현대 스트리밍 아키텍처를 깊이 연구하고, 프로덕션 환경에서의 실제 장애들로부터 호되게 “교육”받은 후, 저는 하나의 결론에 도달했습니다: HLS의 ‘단순함’이야말로 그것이 세계를 지배할 수 있는 근본적인 이유입니다.
수백만 명의 동시 접속을 처리하고, 어떤 방화벽도 통과하며, 열악한 네트워크 환경에서도 여전히 원활한 비디오 애플리케이션을 구축하고 싶다면, 새로운 프로토콜을 발명할 필요가 없습니다.
여러분이 필요한 것은 HLS를 진정으로 이해하는 것입니다.
오늘, .m3u8 확장자 뒤에 숨겨진 비밀을 파헤쳐 보겠습니다.
오해 1: 스트리밍은 반드시 “스트림(흐름)“이어야 한다
많은 초보자들은 비디오 전송이 수도꼭지를 트는 것처럼 물(데이터)이 클라이언트로 끊임없이 흘러가는 것이라고 생각합니다. RTMP가 바로 그렇게 작동합니다.
하지만 HLS의 천재성은 여기에 있습니다: “스트림”을 “파일”로 바꾼 것입니다.

HLS는 지속적인 긴 연결을 수립하지 않습니다. 무한히 긴 비디오를 짧고 정적인 파일들(초기에는 .ts, 현재는 주로 .m4s)로 잘라냅니다.
이것은 거대하고 자주 간과되는 이점을 가져옵니다: CDN 친화성(CDN Affinity).
이미지를 캐시할 수 있다면, HLS 비디오 세그먼트도 캐시할 수 있습니다.
비싸고 유지 관리가 복잡한 전용 스트리밍 서버가 필요 없습니다. 표준 웹 서버(Nginx/Apache)와 일반적인 CDN만 있으면 됩니다. 이것이 HLS가 극도로 낮은 비용으로 글로벌 배포를 실현할 수 있는 이유입니다.
엔지니어링 인사이트: 자체 스트리밍 서비스를 구축할 생각은 버리십시오. 기존의 HTTP 인프라를 활용하는 것이야말로 가장 현명한 아키텍처 선택입니다.
핵심 진화: 왜 MPEG-2 TS를 버려야 하는가?
오랫동안 HLS와 .ts 파일은 묶여 있었습니다. MPEG-2 TS는 디지털 TV 시대의 산물이며, 내결함성이 강합니다.
하지만 2025년인 지금, 만약 여전히 TS를 사용하고 있다면, 여러분은 대역폭과 성능을 낭비하고 있는 것입니다.
현재의 업계 표준은 fMP4 (Fragmented MP4) 입니다.
왜일까요?
- 더 낮은 오버헤드: TS는 188바이트마다 4바이트의 헤더가 있어, HTTP 전송에서 순수한 낭비입니다. fMP4 구조는 더 콤팩트합니다.
- 브라우저 네이티브 지원: 이것이 결정적입니다. 최신 브라우저는 MSE (Media Source Extensions) API를 통해 fMP4를 네이티브로 지원합니다. 반면 TS를 재생하려면 JS(hls.js 등)로 “재포장(transmuxing)“을 해야 하는데, 이는 특히 저사양 폰에서 많은 CPU를 소모합니다.
- 생태계 통합 (CMAF): fMP4를 사용하면, 동일한 세그먼트 파일로 HLS(iOS)와 DASH(Android)를 동시에 서비스할 수 있습니다. 한 번 인코딩으로, 어디서나 재생 가능합니다.
행동 가이드: 트랜스코딩 워크플로우를 점검하십시오. 만약 여전히 .ts를 생성하고 있다면, fMP4로 전환할 때입니다.
핵심 마법: ABR 알고리즘의 게임 이론
HLS의 가장 매력적인 점은 클라이언트가 “다음 1초에 어떤 화질을 볼지” 결정하는 방식에 있습니다. 이것이 적응형 비트레이트(ABR) 입니다.
초기 플레이어들은 멍청했습니다. 그들은 오직 다운로드 속도만 봤습니다.
- 속도 5Mbps -> 1080p 요청.
- 속도가 갑자기 흔들림 -> 즉시 360p로 전환.
그 결과 화면이 선명했다 흐릿했다를 반복하여 사용자 경험이 최악이었습니다.
현대 플레이어(hls.js 등)는 똑똑해졌습니다. 그들은 BOLA (Buffer Occupancy based Lyapunov Algorithm) 알고리즘을 도입했습니다.
수학적으로 들리나요? 사실 논리는 간단합니다: 내 버퍼에 충분한 비디오(예: 30초)가 남아 있는 한, 지금 네트워크 속도가 갑자기 느려져도 당황하지 않고 고화질을 계속 로드한다.

이것은 저수지와 같습니다. 저수지에 물이 충분하다면, 유입 파이프가 조금 느려져도 상관없습니다.
함정 피하기 가이드: 서버가 합리적인 “인코딩 사다리(Encoding Ladder)“를 제공하는지 확인하십시오. 1080p에 5M 대역폭이 필요한데, 다음 단계가 바로 1M 대역폭의 480p로 떨어진다면, 중간의 거대한 단절은 3M 대역폭을 가진 사용자를 매우 난처하게 만들 것입니다.
엔지니어링 실전: 당신을 멘붕에 빠뜨릴 “함정들”
이론은 완벽하지만, 현실은 냉혹합니다. 프로덕션 환경에 HLS를 배포하면, 반드시 이 세 가지 악마와 마주치게 될 것입니다.

1. 교차 출처 리소스 공유(CORS)의 악몽
현상: 로컬 디버깅에서는 완벽한데, CDN에 배포하자마자 검은 화면이 뜹니다. 콘솔은 빨간 글씨로 가득 찹니다.
원인: HLS 플레이어는 본질적으로 JS를 사용하여 파일을 요청합니다. 브라우저는 교차 출처를 금지합니다.
해결책: 게으름 피우지 마십시오. S3나 Nginx 응답 헤더에 Access-Control-Allow-Origin: *를 추가하십시오. 그리고, 반드시 OPTIONS 프리플라이트 요청을 올바르게 처리하십시오.
2. 캐시 설정(Caching)의 함정
현상: 라이브 방송을 보다가 갑자기 몇 분 전으로 “타임슬립”하거나, 방송이 끝났는데도 사용자는 계속 보고 있습니다.
원인: .m3u8 인덱스 파일을 너무 오래 캐시했습니다.
진실:
- TS/m4s 세그먼트: 이것은 정적이며, 절대 변하지 않습니다. 캐시를 1년으로 설정해도 문제없습니다 (
max-age=31536000). - Live M3U8 인덱스: 이것은 동적으로 업데이트되는 목록입니다. 캐시 시간은 세그먼트 길이의 절반을 초과해서는 안 됩니다. 아니면 아예
no-cache로 설정하십시오.
3. “불연속성”(Discontinuity) 폭탄
현상: 광고 삽입 후, 화면이 멈추고 소리와 영상의 싱크가 맞지 않습니다.
원인: 광고 세그먼트의 타임스탬프(PTS)와 본편의 타임스탬프가 맞지 않습니다. 디코더는 타임스탬프가 1000초에서 갑자기 0초로 점프하는 것을 보고 충돌합니다.
해결책: 반드시 M3U8에 #EXT-X-DISCONTINUITY 태그를 명시적으로 삽입해야 합니다. 이것은 플레이어에게 이렇게 말하는 것과 같습니다: “주의, 다음 타임스탬프가 초기화될 예정이니 준비하십시오.”
결론: HLS를 받아들이는 것은 미래를 받아들이는 것
HLS는 늙지 않았습니다. 진화하고 있습니다.
LL-HLS (Low Latency HLS) 의 성숙과 함께, HLS는 마지막 약점인 ‘지연 시간’을 극복하고 있습니다. 현재의 HLS는 라이브 지연 시간을 초 단위까지 압축할 수 있습니다.
그러니 HLS가 “오래된 프로토콜”이라고 해서 무시하지 마십시오. 그것은 스트리밍 아키텍처의 스위스 아미 나이프입니다—단순하고, 신뢰할 수 있으며, 어디에나 존재합니다.
만약 비디오 엔지니어링 분야의 전문가가 되고 싶다면, 실체 없는 새로운 개념들을 쫓는 것을 멈추십시오.
차분히 앉아서 RFC 8216을 정독하십시오.
.m3u8 안의 모든 텍스트 라인을 진정으로 이해했을 때, 여러분은 스트리밍 세계의 미래로 가는 열쇠를 쥐게 될 것입니다.
이 글이 유용했나요? 아래 댓글에 여러분이 겪은 HLS 함정을 공유하거나, 제 블로그를 구독하여 더 많은 하드코어 기술 정보를 받아보세요.