TECH 으로 돌아가기
TECH HACKER NEWS 오늘 7분 읽기 26 READS

대용량 다운로드가 99%에서 끊겼다면? 브라우저 이어받기의 원리와 실전 복구법

무슨 일이 있었나

몇 GB짜리 파일을 받다가 거의 다 와서 네트워크가 끊기고, 결국 처음부터 다시 받아본 경험 다들 있으시죠? Firefox에서 큰 다운로드가 끊겨도 이어받을 수 있게 만드는 방법을 정리한 짧은 TIL 글이 공유됐어요. 팁 자체는 짧지만, 그 밑에 깔린 HTTP 동작 원리를 알면 Firefox뿐 아니라 어떤 환경에서든 응용할 수 있어요. 그래서 이번엔 원리와 실전 복구법을 같이 정리해볼게요.

이어받기는 어떻게 가능할까: HTTP Range 요청

HTTP에는 '처음부터 말고 특정 위치부터 주세요'라고 요청하는 기능이 있어요. 요청 헤더에 Range: bytes=1000000-처럼 쓰면 '1,000,000번째 바이트부터 끝까지 주세요'라는 뜻이에요. 서버가 이걸 지원하면 206 Partial Content 상태 코드와 Content-Range 헤더를 붙여서 나머지 부분만 보내줘요. 지원하지 않으면 그냥 200 OK로 파일 전체를 처음부터 보내고요.

서버가 지원하는지는 응답 헤더의 Accept-Ranges: bytes로 알 수 있어요. 터미널에서 curl -I 파일주소를 실행해보면 바로 확인돼요.

하나 더 중요한 게 있어요. 이어받는 사이에 서버의 파일이 바뀌었다면? 앞 절반은 옛 버전, 뒤 절반은 새 버전인 '프랑켄슈타인 파일'이 만들어지겠죠. 이걸 막는 게 ETag(파일의 지문 같은 값)와 Last-Modified예요. 이어받을 때 이 값을 If-Range 헤더에 담아 보내면, 서버는 파일이 그대로일 때만 나머지를 주고 바뀌었으면 전체를 새로 보내줘요.

브라우저 이어받기는 왜 실패할까

Firefox는 다운로드 중인 데이터를 .part 파일에 쓰고, 다운로드 패널에서 일시정지와 재개를 지원해요. 재개는 원리적으로 위의 Range 요청이고요. 그런데 현실에선 이어받기가 실패하는 경우가 많아요.

첫째, 서버가 Range를 지원하지 않는 경우예요. 애플리케이션 서버가 파일을 직접 스트리밍하면서 Range 헤더를 무시하는 일이 흔해요. 둘째, 서명된 URL이 만료된 경우예요. S3 presigned URL이나 CDN 토큰 URL은 유효시간이 지나면 403을 돌려줘요. 셋째, 로그인 세션에 의존하는 경우예요. 재요청할 때 인증 정보가 맞지 않으면 실패하죠. 그리고 상황에 따라 '다시 시도'가 이어받기가 아니라 처음부터 새로 받는 동작이 되기도 해요.

실전 복구법: 브라우저 밖에서 이어받기

브라우저가 포기하더라도 .part 파일이 남아 있다면 살릴 방법이 있어요. 먼저 .part 파일을 다른 이름으로 복사해두세요. 브라우저가 정리하면서 지워버릴 수 있거든요. 다음으로 개발자 도구(F12)를 연 상태에서 다운로드를 다시 시작하면 네트워크 탭에 요청이 보이는데, 이걸 우클릭해 'cURL로 복사'를 선택해요. 쿠키와 헤더가 포함된 명령어가 통째로 복사돼요. 마지막으로 그 명령 뒤에 -C - -o 복사한파일명을 붙여 실행하면 돼요. -C -는 '기존 파일 크기를 보고 그다음부터 알아서 받아라'라는 옵션이에요.

비슷하게 wget -c나, 여러 연결로 병렬 다운로드하면서 이어받기도 지원하는 aria2c도 좋은 선택이에요. 단, 이 방법은 부분 파일이 처음부터 순서대로 기록돼 있을 때만 의미가 있으니, 다 받은 뒤엔 배포처가 제공하는 SHA-256 체크섬으로 무결성을 꼭 확인하세요.

서비스를 만드는 입장이라면

파일 다운로드 기능을 만드는 백엔드 개발자라면 이 부분이 사용자 경험을 크게 좌우해요. nginx나 Apache로 정적 파일을 서빙하면 기본으로 Range를 지원해요. Express의 res.sendFile, Spring MVC에서 컨트롤러가 Resource를 반환하는 경우도 Range 요청을 처리해주고요. 하지만 스트림을 직접 복사하는 코드를 짜면 Range를 무시하기 쉬우니 꼭 테스트해보세요. presigned URL을 쓴다면 파일 크기와 사용자 회선 속도를 고려해 유효시간을 넉넉히 잡고, 대용량 파일엔 체크섬을 함께 제공하는 게 좋아요.

한국 개발자에게 주는 시사점

요즘은 수십 GB짜리 AI 모델 가중치, 도커 이미지, 데이터셋을 받을 일이 많아요. 해외 서버나 불안정한 사내 VPN을 거치면 끊기는 일도 잦고요. Hugging Face 공식 CLI처럼 이어받기를 지원하는 도구를 쓰는 것도 방법이지만, 원리를 알고 있으면 어떤 도구에서든 문제를 진단할 수 있어요. 다음에 다운로드가 끊기면 브라우저 탓하기 전에 Accept-Ranges 헤더부터 확인해보세요.

마무리

한 줄 정리: 이어받기는 브라우저의 마법이 아니라 HTTP Range 요청과 서버의 협조로 만들어지는 기능이에요.

여러분 서비스의 다운로드 API는 Range 요청을 지원하고 있나요? 대용량 파일 받을 때 쓰는 나만의 꿀팁이 있다면 공유해주세요!


🔗 출처: Hacker News

SOURCE · HACKER NEWS
원문 전체 보기 → https://lunarwatcher.codeberg.page/til/firefox/resumable-big...
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기 →
처리 중...