개발자라면 Reddit을 단순한 커뮤니티 이상으로 보게 됩니다. 특히 Reddit의 비디오 스트리밍 인프라는 매우 정교하게 설계되어 있으며, 일반적인 '파일 다운로드' 방식으로는 접근하기 어려운 구조를 가지고 있습니다.
이번 프로젝트인 Reddit 비디오 다운로더를 개발하며 겪은 기술적 도전 과제와 Reddit 비디오의 밑바닥 구조를 어떻게 분석했는지 공유하고자 합니다.
1. Reddit 비디오의 핵심: 왜 직접 다운로드가 불가능한가?
대부분의 현대적 플랫폼과 마찬가지로 Reddit은 비디오를 단일 .mp4 파일로 서빙하지 않습니다. 대신 MPEG-DASH (Dynamic Adaptive Streaming over HTTP) 또는 HLS (HTTP Live Streaming) 프로토콜을 사용합니다.
1.1 비디오와 오디오의 분리 (Separation of Tracks)
Reddit 비디오(주로 v.redd.it 도메인)의 가장 큰 특징은 비디오 트랙과 오디오 트랙이 완전히 분리되어 있다는 점입니다.
• Video Track: 240p, 360p, 720p, 1080p 등 해상도별 무음 영상 스트림.
• Audio Track: 별도의 저대역폭 오디오 전용 스트림.
따라서 단순히 네트워크 탭에서 비디오 URL을 찾아 다운로드하면 소리가 나오지 않는 영상만 얻게 됩니다.
1.2 매니페스트 파일 (Manifest Files)
Reddit은 .m3u8 또는 .mpd 파일을 통해 이러한 분리된 세그먼트들을 관리합니다. 다운로더를 구현하기 위해서는 이 매니페스트를 파싱하여 현재 세션에서 유효한 비디오와 오디오의 엔드포인트를 찾아내야 합니다.
2. 역공학을 통한 메타데이터 추출
자동화된 다운로더를 구축하기 위해 가장 먼저 한 일은 Reddit의 내부 데이터 트리를 분석하는 것이었습니다.
2.1 JSON 인터페이스 활용
Reddit은 모든 게시물 뒤에 .json을 붙여 구조화된 데이터를 제공합니다. data.children[0].data.secure_media.reddit_video 경로를 추적하면 다음과 같은 핵심 필드를 얻을 수 있습니다:
• fallback_url: 기본 비디오 주소.
• dash_url: DASH 매니페스트 주소.
• scrubber_media_url: 프리뷰 및 가변 비트레이트 정보.
2.2 인증 및 403 Forbidden 해결
Reddit 서버는 User-Agent와 Referer 헤더를 검증합니다. 봇으로 감지될 경우 즉시 403 Forbidden 에러를 반환합니다. 저희 시스템은 브라우저 환경을 완벽히 모사하는 헤더 에뮬레이션 레이어를 통해 이를 극복했습니다.
3. 시스템 아키텍처 및 구현 기술
Reddit Video Downloader는 다음과 같은 기술적 최적화를 거쳤습니다.
3.1 비동기 병렬 세그먼트 다운로드
HLS/DASH 비디오는 수백 개의 작은 .ts 또는 .m4s 조각으로 나뉩니다. 이를 하나씩 다운로드하면 속도가 매우 느립니다. 저희는 Node.js의 Worker Threads와 비동기 풀링을 사용하여 병렬 다운로드를 구현, 전체 프로세스 속도를 400% 이상 개선했습니다.
3.2 FFmpeg.wasm을 활용한 클라이언트 측 병합
서버 사이드에서 비디오와 오디오를 합치는 방식은 서버 비용과 개인정보 보호 측면에서 불리합니다. 저희는 FFmpeg WebAssembly를 도입하여 사용자의 브라우저 내에서 직접 인코딩 없이 합치는(Remuxing) 방식을 채택했습니다.
• 장점: 서버 리소스 절약, 원본 화질 유지(1:1 복사), 다운로드 즉시 병합 완료.
4. CORS 및 프록시 네트워크 설계
브라우저의 보안 정책(CORS)으로 인해 클라이언트가 직접 v.redd.it에서 바이너리 데이터를 긁어오는 것은 불가능합니다. 이를 해결하기 위해 저희는 고성능 프록시 레이어를 구축했습니다.
• Transparent Proxy: 트래픽을 저장하지 않고 스트림 형태로 전달만 하여 프라이버시를 보호합니다.
• Header Stripping: 타겟 서버의 보안 정책을 클라이언트 친화적으로 변환하여 전달합니다.
5. 결론: 엔지니어링이 해결하는 사용자 경험
단순히 비디오를 받는 도구를 만드는 것을 넘어, 복잡한 스트리밍 아키텍처를 이해하고 이를 웹 기술로 풀어내는 과정은 매우 흥미로운 엔지니어링 과제였습니다.
고화질(1080p 이상) 지원과 완벽한 싱크의 오디오 결합을 원하신다면, 저희가 만든 도구를 직접 경험해 보세요.
👉 Reddit 비디오 다운로더 (한국어판)
주요 특징
- 무손실 품질: 리인코딩 없이 원본 스트림을 그대로 결합합니다.
- 속도 최적화: 다중 스레드 파싱 엔진을 통해 수 초 내에 분석을 완료합니다.
- 편의성: 복잡한 설치 없이 브라우저에서 바로 사용 가능합니다. 이러한 HLS/DASH 파싱 로직이나 WebAssembly를 활용한 미디어 처리에 대해 궁금한 점이 있다면 댓글로 의견을 나눠주세요!
Tags: #JavaScript #NodeJS #WebDev #FFmpeg #Reddit #HLS #Streaming

Top comments (0)