웹페이지가 파일을 내어주기 전에 벌어지는 일
동영상이 눈앞에 보입니다. 웹 브라우저 안에서 바로 재생되고 있죠. 그런데 왜 저장할 방법이 없을까요? 답은 웹페이지가 파일을 직접 건네주는 경우가 드물다는 데 있습니다 — 페이지가 넘겨주는 건 "지침"이고, 브라우저가 그 지침을 따라 조립한 결과물은 애초에 하나의 파일로 존재하지 않을 수도 있습니다.
FoxDL 페이지가 동영상을 전달하는 네 가지 방식, 그중 파일인 건 하나뿐
가장 오래되고 단순한 방식은 직접 파일입니다. 페이지가 .mp4로 끝나는 주소를 가리키고 브라우저가 그걸 가져오는 거죠. 그 주소를 찾을 수 있다면 곧 파일을 손에 넣은 것입니다. 지금도 규모가 작은 사이트, 포럼, 언론사, 파일 호스팅 서비스 대부분이 이 방식으로 동작합니다.
두 번째는 적응형 스트리밍, 즉 HLS나 DASH입니다. 페이지는 여러 화질로 나뉜 수백 개의 짧은 조각을 나열한 재생목록을 불러오고, 플레이어는 이를 이어 붙이면서 재생하다가 연결 상태가 바뀌면 화질도 바꿉니다. 찾아낼 단일 파일이라는 게 애초에 없습니다. 이걸 저장한다는 건 모든 조각을 일일이 받아 하나의 파일로 다시 조립한다는 뜻입니다.
세 번째는 blob URL입니다. 페이지가 이미 JavaScript로 데이터를 받아와서, 브라우저 자체 메모리 안에 있는 무언가에 대한 참조를 플레이어에게 건네준 상태입니다. 눈에 보이는 그 주소(blob:https://…)는 그 페이지, 그 세션을 벗어나면 아무 의미가 없습니다 — 열 수도, 공유할 수도, 다운로드할 수도 없고, 어설픈 "동영상 찾기" 기능 대부분이 여기서 걸려 넘어집니다.
네 번째는 보호된 콘텐츠입니다. DRM 시스템을 통해 재생되는 암호화된 조각들로, 복호화 키는 사본을 남기는 걸 명시적으로 금지하는 조건 아래 브라우저에 발급됩니다. 이건 우회해야 할 걸림돌이 아니라 라이선스 계약 자체를 지탱하는 장치이며, 이를 무너뜨리는 정당한 도구란 존재하지 않습니다.
웹 브라우저가 저장할 게 있다는 걸 알아채는 법
찾아낸 것을 저장하겠다고 나서는 인앱 웹 브라우저는 사실 한 번에 여러 일을 하고 있는 것입니다. 각각이 다른 방식으로는 놓칠 경우를 잡아냅니다.
- 페이지의 미디어 요소 읽기
- 문서를 훑으며
<video>,<audio>,<source>태그와 그 주소를 읽어냅니다. 직접 파일인 경우는 바로 잡아내지만, 페이지가 로드된 뒤 JavaScript가 만들어낸 것은 전부 놓칩니다. - Shadow DOM 내부까지 들여다보기
- 요즘 플레이어들은 내부 구조를 페이지로부터 의도적으로 차단해 둔 커스텀 요소입니다. 일반 문서 수준에서 멈추는 탐색은 동영상이 있어야 할 자리에서 그냥 빈 상자만 보게 됩니다.
- 페이지가 실제로 요청한 것 지켜보기
- 브라우저는 페이지가 가져온 모든 리소스를 알고 있습니다. 어떤 스크립트가 언제 요청했든, 로드된 미디어 파일은 화면에 보이는 페이지 어디에도 그걸 가리키는 게 없어도 여기서는 드러납니다.
- 응답 타입 확인하기
.php로 끝나는 주소가 동영상을 돌려줄 수도 있고,.mp4로 끝나는 주소가 오류 페이지를 돌려줄 수도 있습니다. 어느 쪽인지 알려주는 건 확장자가 아니라 서버가 실제로 보낸Content-Type입니다 — 확장자는 그냥 추측일 뿐입니다.
페이지에서 저장이 제대로 이뤄지는 과정
순서가 중요합니다. 실패의 대부분은 두 번째 단계를 건너뛰고 로그인 페이지를 4기가바이트짜리로 착각해 전송을 시작하는 데서 벌어집니다.
-
먼저 미디어를 몇 초라도 재생해 보기
많은 페이지가 재생이 시작되기 전까지는 아무것도 불러오지 않습니다. 2초 정도 재생해 보는 것만으로 후보 목록이 텅 비어 있는 상태와 꽉 찬 상태의 차이가 갈리는 경우가 많습니다.
-
찾아낸 후보가 실제로 무엇인지 확인하기
다운로드를 확정하기 전에 표시된 크기와 타입을 보세요. 14KB짜리 "영화"는 사실 HTML 페이지입니다.
video/mp4를 기대했는데text/html이라면 링크를 잘못 짚은 것입니다. -
원하는 화질 고르기
스트림은 보통 여러 화질을 제공합니다. 휴대폰에서는 차이가 눈에 잘 안 보이는데 용량은 훨씬 크니, 무조건 최고 화질이 정답은 아닙니다.
-
세션 정보를 그대로 이어가기
보호된 링크는 요청자가 누구인지 확인합니다 — 로그인 세션의 쿠키, 어디서 넘어왔는지, 때로는 브라우저 자체의 정체성까지도요. 이런 정보 없이 시작된 다운로드는 페이지에서는 잘 재생됐어도 403 오류를 받게 됩니다.
-
받은 결과 확인하기
열어보세요. 2초쯤 재생되다 멈추는 파일은 대개 만료된 링크 때문에 잘린 것이니, 그대로 두기보다는 다시 받는 게 낫습니다.
인앱 웹 브라우저가 제대로 해내야 하는 것들
미디어를 찾아내는 것 말고도, 다운로드가 실제로 끝까지 완료되는지를 좌우하는 요소들입니다.
- 세션 정보를 다운로드까지 이어가기
쿠키, 리퍼러, 사용자 에이전트가 요청과 함께 전달되어야 합니다. 이게 없으면 보호된 링크는 페이지에서는 통하고 다운로더에서는 실패합니다.
- 그 인증 정보를 저장소에 남기지 않기
세션 쿠키는 세션이 유효한 동안만큼은 비밀번호나 다름없습니다. 전송이 진행되는 동안만 메모리에 있어야 하고, 그 외에는 어디에도 — 데이터베이스에도, 로그에도 — 남아서는 안 됩니다.
- 링크를 다른 앱에 넘겨주지 않기
iOS는 탭한 링크가 특정 도메인을 처리한다고 등록된 다른 앱이 있으면 그쪽으로 순순히 넘겨버립니다. 미디어 저장을 목적으로 한 웹 브라우저라면 그 이동을 직접 취소하고 다시 처리해야 하며, 그러지 않으면 원하던 페이지가 남의 앱 속으로 사라져 버립니다.
- 렌더링 전에 페이지를 정리하기
여기서 콘텐츠 차단기는 광고만을 위한 게 아닙니다. 트래커와 오버레이가 줄어들수록 미디어 목록에 뜨는 가짜 후보도 줄어듭니다.
- 동영상뿐 아니라 문서도 처리하기
PDF, ZIP, 오피스 파일도 사람들이 웹에서 저장하는 것의 나머지 절반이며, 이런 것들도 다른 모든 것과 같은 라이브러리에 담겨야 합니다.
자주 나오는 질문
Safari는 왜 이걸 스스로 할 수 없나요?
Safari도 파일을 다운로드하기는 합니다 — iOS 13부터 그래 왔습니다. 다만 Safari가 하지 않는 건, 링크가 아니라 스트리밍되고 있는 미디어를 페이지 안에서 찾아내거나, 조각난 스트림을 하나의 파일로 재조립하는 일입니다. Safari는 웹 브라우저이고, 그런 작업은 다운로드 관리자의 몫입니다.
blob URL이 뭐고, 왜 다운로드가 안 되나요?
페이지가 이미 메모리에 들고 있는 데이터를 가리키는 핸들일 뿐입니다. 그 탭 밖에서는 존재하지 않으므로 어디에 붙여넣어도 아무것도 나오지 않습니다. 실제 미디어는 어딘가 진짜 주소에서 가져온 것이고, 찾을 가치가 있는 건 그 blob이 아니라 바로 그 주소입니다.
페이지에서는 잘 재생되는데 다운로드하면 403 오류가 뜹니다. 왜죠?
다운로드 요청이 페이지가 갖고 있던 정보 없이 도착했기 때문입니다 — 세션 쿠키, 어디서 왔는지를 알려주는 리퍼러, 때로는 일치하는 브라우저 정체성까지요. 서버는 정확히 이런 조합을 이용해 실제 시청자와 크롤러를 구분합니다.
뭐든 다 저장할 수 있나요?
아니요, 그리고 이건 의도된 설계입니다. DRM으로 보호된 콘텐츠는 보관을 금지하는 라이선스 조건 아래 발급된 키로 암호화되어 있습니다. 어떤 사이트는 모든 조각마다 짧은 유효기간의 토큰으로 개별 서명을 걸어두기도 합니다. 둘 다 원래 의도한 대로 동작하고 있는 것입니다.
FoxDL 안의 웹 브라우저
평소에 쓰는 브라우저가 아니라, 찾은 것을 내 라이브러리로 가져오는 일이 목적인 평범한 탭 방식 웹 브라우저입니다.
- 여섯 가지 탐지 경로를 사용하며, 여기엔 shadow DOM과 페이지가 실제로 요청한 기록까지 포함되어 있어 JavaScript로만 만들어진 플레이어도 놓치지 않습니다.
- 실제 타입은 확장자로 추측하지 않고 응답에서 직접 확인하며, 가져올 수 없는
blob:후보는 제시했다가 실패하는 대신 아예 걸러냅니다. - 쿠키, 리퍼러, 사용자 에이전트를 다운로드까지 그대로 전달해 보호된 링크도 정상적으로 처리되며, 이 정보들은 디스크에 절대 기록되지 않습니다.
- 콘텐츠 차단기가 렌더링 전에 페이지를 정리해 줍니다.
- PDF, ZIP, 문서 파일도 탭 한 번으로 미디어와 같은 라이브러리에 저장됩니다.
- 탭, 북마크, 그리고 나만의 바로가기로 채운 시작 페이지.
FoxDL은 자체 콘텐츠를 전혀 제공하지 않습니다. 저장하는 것은 사용자가 직접 가져온 것이며, 그것을 보관할 권리가 있는지는 사용자 본인의 책임입니다.
자주 묻는 질문
- 웹페이지에서 파일을 다운로드하려면 어떻게 하나요?
- FoxDL로 HLS(m3u8) 스트림을 다운로드할 수 있나요?
- 앱을 나가도 다운로드가 계속되나요?
- FoxDL이 직접 IPTV 채널이나 영화, 스트림을 제공하나요?