다운로드

웹 브라우저는 못 하지만 다운로드 관리자는 하는 일

4기가바이트짜리 파일이 90% 진행되던 중, 전화가 한 통 걸려오거나 그냥 화면이 잠기기만 해도 다운로드는 사라져 버립니다. iOS 다운로드에 대한 불만 중 가장 흔한 유형이지만, 이는 버그가 아닙니다. 운영체제가 설계된 그대로 정확히 동작한 것이고, 바로 그래서 별도의 앱 카테고리가 존재하는 것입니다.

약 6분 업데이트 2026년 7월 29일

  • 30초 일시 중단된 앱이 iOS에 의해 종료되기 전까지 버티는 대략적인 시간
  • 206 재개 자체를 가능하게 만드는 HTTP 상태 코드
  • 1바이트 제대로 재개된 전송에서 다시 다운로드되는 분량

앱을 전환하면 전송이 멈추는 이유

iOS는 앱이 원한다고 해서 계속 동작하도록 내버려 두지 않습니다. 앱을 벗어나면 몇 초 안에 일시 중단되고, 일시 중단된 앱은 CPU 시간도, 네트워크 소켓도, 자신이 멈췄다는 사실을 알아챌 방법도 갖지 못합니다. 메모리에 있던 내용은 여전히 그대로지만 얼어붙은 상태이며, 시스템에 메모리가 더 필요해지면 앱은 아무런 통보 없이 그대로 종료됩니다.

그래서 앱 내부의 일반적인 연결로 진행되던 다운로드는 홈 제스처를 하는 순간 끝나 버립니다. 일부 앱은 몇 초의 추가 백그라운드 시간을 요청해서 이를 감추기도 하는데, 다운로드가 백그라운드에서 살아남는 시간이 딱 사용자가 눈치채지 못할 정도까지만인 이유가 여기 있습니다.

제대로 된 해법은 종류 자체가 다릅니다. iOS는 백그라운드 전송 서비스를 제공합니다 — URL과 저장 위치 목록을 시스템에 넘기면, 시스템이 자신의 프로세스 안에서 자신의 일정에 따라 직접 다운로드를 수행합니다. 앱은 일시 중단되어도, 종료되어도, 아예 실행되고 있지 않아도 상관없습니다. 전송은 계속되고, 보고할 내용이 생기면 그때 앱이 백그라운드에서 다시 실행됩니다. 잠금 화면에서도 살아남는 모든 다운로드의 뒤에는 이 메커니즘이 있으며, 이를 쓸지 말지는 사용자가 켜고 끄는 설정이 아니라 앱이 처음부터 내려야 하는 설계상의 결정입니다.

다운로드의 생사를 가르는 네 가지 요소

범위 요청
파일 전체가 아니라 5,000,000바이트 이후만 요청하는 HTTP 요청입니다. 서버가 206 Partial Content로 응답하면 중간부터 재개할 수 있습니다. 200 OK로 응답하며 처음부터 보내온다면 재개는 불가능하고, 파일을 처음부터 다시 받아야 합니다.
병렬 연결
파일 하나를 여러 범위로 나눠 동시에 받아오는 방식입니다. 이것이 도움이 되는 이유는 소켓을 많이 열수록 인터넷 자체가 빨라져서가 아니라, 단일 연결이 서버 쪽에서 속도 제한을 받거나 왕복 지연 시간의 제약을 받는 경우가 흔하기 때문입니다.
커밋된 오프셋
아직 전송 중인 것이 아니라 디스크에 안전하게 기록된 파일의 분량입니다. 마지막으로 커밋된 바이트부터 재개하는 다운로드는 정확하지만, "받았다고 생각한" 지점부터 재개하는 다운로드는 몇 시간이 지나서야 드러나는 손상된 파일을 만들어냅니다.
백그라운드 세션
위에서 설명한, 시스템이 직접 운영하는 전송입니다. 시작은 느리고, 임의의 커스텀 로직을 넣을 수 없지만, 앱이 실행되고 있지 않을 때도 계속 동작하는 유일한 수단입니다.

다운로드가 실패하는 이유와 각 증상의 모양

"다운로드가 멈췄다"는 제보는 대부분 이 다섯 가지 중 하나이며, 그 모양을 알면 쉽게 구분할 수 있습니다.

눈에 보이는 증상실제로 일어나는 일도움이 되는 방법
앱을 벗어나는 순간 멈춘다전송이 백그라운드 세션이 아니라 앱 프로세스 안에서 진행되고 있었던 것입니다.외부에서 할 수 있는 일은 없습니다 — 앱 설계상의 문제입니다.
매번 0%부터 다시 시작된다서버가 범위 요청을 무시하고 있어서 중간부터 이어갈 방법이 없습니다.안정적인 연결을 쓰거나 더 작은 파일을 받으세요. 일부 서버는 서명된 링크에서만 범위를 허용합니다.
몇 분 뒤 실패하는 일이 반복된다링크가 만료된 것입니다. 많은 서버가 5~10분만 유효한 URL을 발급합니다.원래 페이지에서 링크를 다시 가져와 처음부터 시작하세요. 만료된 링크는 다시 시도해도 절대 작동하지 않습니다.
빠르게 받아졌는데 파일이 열리지 않는다실제로 도착한 것은 동영상 파일 이름을 가진 HTML 오류 페이지나 로그인 페이지였습니다.크기를 확인하세요 — 14KB짜리 "영화"는 사실 웹페이지입니다. 다운로드하기 전에 링크를 먼저 살펴보세요.
연결은 빠른데도 매우 느리다서버 쪽에서 연결마다 속도를 제한하고 있는 것입니다.서버가 허용한다면 병렬 연결을 늘려보세요. 소켓이 아니라 IP 주소 단위로 제한한다면 이것도 도움이 되지 않습니다.

애초에 다운로드할 파일 자체가 없을 때

웹상의 동영상 중 상당수는 파일로 전달되지 않습니다. HLS로 전달됩니다 — .m3u8 플레이리스트가 각각 몇 초 분량인 수백 개의 작은 세그먼트를 나열하며, 흔히 여러 화질 단계로 준비되어 연결 상태가 바뀌면 플레이어가 그 사이를 오갈 수 있게 합니다. 그 영화 전체를 담은 URL은 하나도 존재하지 않습니다. 애초에 영화는 하나의 연속된 시퀀스로만 존재하기 때문입니다.

이런 것을 저장한다는 건 모든 세그먼트를 받아온 뒤 재다중화한다는 뜻입니다 — 영상과 음성 스트림을 그대로 일반 MP4 컨테이너에 써넣는 것입니다. 재인코딩이 전혀 일어나지 않으므로 손실도 없고, 영화 길이가 아니라 몇 초밖에 걸리지 않습니다. 결과물은 어디서나 재생되는 평범한 파일입니다.

이것이 바로 "이 스트림을 다운로드"가 일반 파일을 받는 것보다 시작이 눈에 띄게 늦은 이유이기도 합니다. 플레이리스트를 가져와 해석하고 화질 단계를 선택한 뒤에야 세그먼트가 들어오기 시작하니까요. 그리고 어떤 스트림은 아예 저장할 수 없는 이유도 여기에 있습니다. 세그먼트가 DRM 방식으로 암호화되어 있다면, 그 키는 애초에 얻을 수 없도록 설계되어 있고, 법을 지키는 어떤 도구도 그것을 뚫을 수 없습니다.

진짜 다운로드 관리자와 그냥 다운로드 버튼의 차이

앱을 닫아도 살아남는다

시스템에 넘겨진 백그라운드 전송이 파일을 처음부터 다시 받는 게 아니라, 같은 커밋된 바이트에서 이어받는 방식으로 인계됩니다.

받기 전에 링크의 정체를 알려준다

크기, 종류, 서버의 재개 지원 여부까지 — 모두 HEAD 요청 한 번으로 알 수 있고, 데이터 4기가바이트를 쓰기 전에 알아두면 유용한 것들입니다.

한꺼번에 몰아붙이지 않고 줄을 세운다

한 번에 10개 파일을 받는 것은 3개씩 받는 것보다 오히려 느립니다. 각 연결이 가져가는 몫이 줄고 실패 확률이 곱절로 늘기 때문입니다. 적절한 동시 처리 개수로 줄을 세우는 편이 더 빨리 끝납니다.

도착하는 것은 평범한 파일이다

눈으로 볼 수 있는 폴더 안에, 알아볼 수 있는 이름으로, 어떤 앱으로도 재생할 수 있게 — 그 앱만 열 수 있는 데이터베이스 덩어리가 아닙니다.

대부분의 다운로드 문제를 막아주는 습관

  • 큰 파일은 Wi-Fi에서 시작하고 처음 몇 초는 화면을 켜 두기

    백그라운드 세션으로의 인계는 초반에 일어납니다. 그 이후로는 화면이 꺼져 있어도 상관없습니다.

  • 한 번에 스무 개씩 대기열에 넣지 않기

    거의 모든 연결 환경에서 동시에 3~5개 정도가 가장 효율적인 지점입니다.

  • 여유 공간은 다운로드 후가 아니라 미리 확인하기

    디스크를 가득 채우는 전송은 98%에서 실패하며, 그 무렵엔 iOS가 이미 공간을 확보하려고 캐시를 지웠을 수도 있습니다.

  • 순식간에 "완료"된 결과는 의심하기

    2초 만에 끝난 영화는 오류 페이지입니다. 파일 크기를 확인하세요.

  • 만료된 링크는 원래 페이지에서 다시 가져오기

    죽은 서명 URL은 앱이 아무리 다시 시도해도 영원히 실패합니다.

기기마다 다른 점

iPhone

가장 엄격한 환경입니다. 앱 일시 중단은 공격적이고 저장 공간도 넉넉하지 않습니다. 여기서 백그라운드 세션은 최적화가 아니라 유일하게 작동하는 방법입니다.

iPad

규칙은 같지만 여유가 더 있습니다. 그리고 대형 라이브러리를 내장 저장소가 아닌 외장 드라이브에 합리적으로 둘 수 있는 유일한 iOS 기기이기도 합니다.

Mac

일시 중단 자체가 없으므로 긴 전송도 여느 데스크톱과 똑같이 동작합니다. 실질적인 한계는 운영체제가 아니라 서버 쪽에 있습니다.

자주 나오는 질문

연결을 늘리면 항상 다운로드가 빨라지나요?

아닙니다. 서버가 개별 연결의 속도를 제한하는 경우——흔한 일입니다——에는 도움이 됩니다. 병목이 자신의 회선 자체라면 아무 효과가 없고, 서버가 IP 주소별 소켓 수를 세어 거부하기 시작하면 오히려 상황을 악화시킬 수 있습니다. 유용한 범위는 대략 4~8개 정도이며, 30개는 역효과만 냅니다.

화면이 잠긴 상태에서도 다운로드가 계속되나요?

시스템의 백그라운드 전송 서비스에 맡겨졌다면 그렇습니다. 이 서비스에게 잠금 화면 여부는 무관합니다. 중요한 건 앱이 일시 중단되었는지 여부이고, 이 메커니즘의 존재 이유 자체가 그와 상관없이 계속 진행되는 것이니까요.

왜 재개가 아니라 다시 시작되나요?

서버가 범위 요청을 받아들이지 않은 것입니다. 진행률이 이어지지 않고 0으로 되돌아가는 것으로 알 수 있습니다. 일부 서버는 서명된 다운로드 URL에서만 범위를 지원하고, 일부는 아예 지원하지 않으며, 작은 파일에서만 지원하고 큰 파일에서는 지원하지 않는 곳도 있습니다.

스트림을 MP4로 변환하는 것은 재인코딩과 같은 건가요?

아닙니다. 재다중화는 기존 영상·음성을 손대지 않고 그대로 MP4 컨테이너로 옮기는 것이라 무손실이며 몇 초면 끝날 만큼 빠릅니다. 재인코딩은 다른 코덱으로 영상을 다시 만드는 작업이라 항상 화질이 떨어집니다. 2시간짜리 스트림을 저장하는 데 2시간이 걸린다면, 필요하지도 않은 재인코딩이 벌어지고 있는 것입니다.

FoxDL

FoxDL의 다운로드 방식

엔진에는 두 개의 경로가 있습니다. 하나는 앱이 화면에 떠 있는 동안 빠르게 동작하는 인프로세스 경로이고, 다른 하나는 앱이 화면에 없을 때 같은 바이트에서 이어받는 시스템 백그라운드 세션입니다.

  • 한 파일에 대한 병렬 청크를 나중에 합쳐야 하는 임시 조각이 아니라 디스크상의 최종 위치에 바로 기록합니다.
  • 앱이 화면을 벗어난 뒤에도 이어지는 백그라운드 전송은, 앱이 마지막이라고 "생각한" 바이트가 아니라 실제로 마지막에 커밋된 오프셋에서 이어받습니다.
  • 서버가 범위 요청을 지원하는 한 연결 끊김·재부팅·강제 종료 후에도 재개됩니다. 지원하지 않을 때는 헛되이 반복하는 대신 FoxDL이 그 사실을 알려줍니다.
  • HLS 스트림은 MP4로 재다중화되므로, 라이브러리에 남는 것은 세그먼트가 담긴 폴더가 아니라 평범한 파일입니다.
  • 시작하기 전에 링크의 실제 크기·종류·재개 지원 여부를 알려주는 다운로드 검사기.
  • 모든 결과물은 파일 앱에서 볼 수 있는 평범한 폴더에 저장됩니다.

무료 사용량은 플랫폼마다 다릅니다. iPhone·iPad에서는 직접 시작하는 짧은 리워드 영상으로 채울 수 있는 소량의 이용권이 제공되고, 광고가 전혀 없는 Mac에서는 하루 고정 횟수가 주어집니다. Pro를 이용하면 모든 기기에서 제한이 사라집니다.

자주 묻는 질문

모든 질문

더 읽기

이제 라이브러리 하나로 다 모을 수 있습니다.

무료 다운로드. 계정·가입 없음. 전체 기능이 무료 버전에 포함됩니다.

다운로드 App Store