- South Pole의 인터넷은 제한된 위성 링크에 의존해 하루 몇 시간만 연결됐고, 2023년 10월 기준 커뮤니티 사용자는 높은 지연·낮은 대역폭·간헐적 단절을 감수해야 했음
- 실제 환경은 왕복 지연 약 750ms에 수 초 지터, 수 kbps~2Mbps 속도, 혼잡·큐잉·패킷 손실·서비스 선점이 겹쳐 일반 앱의 네트워크 가정을 쉽게 깨뜨렸음
- 큰 JavaScript 번들, 하드코딩된 타임아웃, 진행률 폐기, 캐시 무효화, 재개 불가능한 내장 다운로더는 느린 링크에서 앱이 스스로 실패하게 만드는 요인이었음
- 바이트가 느리게라도 흐르면 기다리고, 청크 전송·재개·상태 표시·동적 타임아웃·수동 다운로드 링크를 제공하면 텍스트 메시지나 업데이트처럼 작은 목표는 달성 가능했음
- 남극은 극단적 사례지만 해상 선박, 산악 연구지, 불안정한 Wi‑Fi, 품질 낮은 WISP, 전화선 기반 접속자도 비슷한 제약을 겪을 수 있어 사용자 진행을 방해하지 않는 설계가 필요함
South Pole 인터넷 환경의 제약
- South Pole에서 인터넷을 제공하는 일 자체가 비사소한 엔지니어링 과제이며, 극지에서 쓸 수 있는 위성 선택지가 제한적임
- 공개 자료로 South Pole Satellite Communications 페이지가 있음
- 남극 대륙까지 전통적인 광섬유를 연결하는 어려움은 2021 Antarctic Subsea Cable Workshop에서도 다뤄짐
- NSF가 McMurdo와 Palmer의 Starlink 관련 발표를 했지만, 2023년 10월 기준 South Pole Station에는 비슷한 발표가 없었음
- McMurdo는 최근까지 거의 1,000명과 여러 과학·운영 워크로드가 기지 전체의 수십 Mbps 수준 집계 대역폭을 공유했음
- 미국 교외의 일반적인 4G 셀룰러 네트워크에서 개인이 얻을 수 있는 대역폭보다 적은 양을 기지 전체가 나눠 쓰는 상황임
- South Pole은 위성이 지평선 위로 올라오고 기지가 사용 허가를 받은 시간에만 연결됐으며, 위성 일정은 항성시와 태양시 차이 때문에 대체로 하루 약 4분씩 앞당겨짐
- 사용자가 체감한 지연은 일반적인 인터넷 경험과 크게 달랐음
- 미국 본토 목적지까지 왕복 지연은 약 750ms
- 미국 동부·서부 해안 간 왕복 지연 최대 75ms의 약 10배
- 일반 가정의 케이블·광섬유 연결에서 주요 CDN까지 기대되는 최대 25ms의 약 30배
- 사용자의 집 GPON 광섬유에서 Fastly, Cloudflare, CloudFront, Akamai, Google까지 약 3ms였던 것과 비교하면 South Pole은 250배 이상 큼
커뮤니티 사용자가 실제로 마주한 조건
- 2023년 10월 기준 South Pole에서 커뮤니티 용도로 인터넷을 쓰는 개인은 다음 조건을 겪을 수 있었음
- 평균 왕복 지연 약 750ms, 수 초를 넘는 패킷 간 지터
- 최종 사용자 단말 기준 수 kbps에서 아주 좋은 날 2Mbps까지의 속도
- 심한 혼잡, 큐잉, 패킷 드롭
- 제한된 가용성, 잦은 드롭아웃, 가끔 발생하는 서비스 선점
- 특정 상황에서는 40kbps, 1,000ms 지연, 최대 2,000ms 지터, 10% 패킷 손실, 몇 분마다 15초 완전 단절 같은 조건도 나타났음
- 운영 트래픽이 강하게 우선순위를 받기 때문에, 커뮤니티 사용자는 남는 용량에 의존했음
- 실시간 화상회의 같은 기능은 기대하기 어렵지만, 일부 앱에서는 몇 바이트짜리 텍스트 송수신이 가능했음
- 느리거나 간헐적인 링크를 고려하지 않은 웹·앱 엔지니어링이 사용성을 더 악화시켰음
20MB JavaScript를 요구한 협업 웹앱 사례
- 한 엔터프라이즈 협업 플랫폼은 메인 화면을 렌더링하기 위해 JavaScript만 거의 20MB를 내려받아야 했음
- 이전 접속 이후 앱이 업데이트돼 브라우저 캐시 자산이 모두 오래되었고, 다시 다운로드해야 했음
- 브라우저와 프로토콜은 느린 인터넷에서 혼잡 제어를 어느 정도 처리하지만, 이 앱은 자체 실패 조건으로 로딩을 끊어버렸음
- 개발자가 정한 시간이나 재시도 횟수 안에 완전히 로드되지 않으면 앱이 중단됨
- 에러 페이지로 리다이렉트됨
- 이미 진행한 로딩 상태가 사라짐
- 다음 재시도 때 강한 캐시 무효화 조치가 적용됨
- 이 앱은 본질적으로 메시징 앱이었고, 실행 후 친구와 채팅할 때 실제 콘텐츠 페이로드는 바이트 단위였음
- South Pole의 인터넷 성능은 개발자가 “허용 가능”하다고 본 경계에 걸쳐 있었고, 사용자는 여러 번 새로고침하며 같은 JavaScript를 다시 내려받아야 했음
- 필요한 전송을 그대로 두면 15분 안에 끝낼 수 있었지만, 실제로는 몇 시간이 걸릴 때가 있었음
- 성공 사례에서는 809개 HTTP 요청, 51.4MB 전송, 26.5분 로딩 뒤 1.8KB HTTPS POST로 6바이트 메시지를 보냈음
- 앱이 데이터가 느리게라도 흐르는 동안 계속 기다리도록 설계됐다면 불필요한 재전송과 대역폭 낭비를 줄일 수 있었음
하드코딩된 타임아웃과 큰 단일 전송의 문제
- 페이로드가 얼마나 빨리 전송될지, 한 요청에서 얼마나 많이 보낼 수 있을지에 대한 고정 가정은 느린 링크에서 앱을 망가뜨릴 수 있음
- 바이트가 흐르고 있음을 측정할 수 있다면 아무리 느려도 전송을 중단하지 말고, 현재 상황을 UI로 보여주는 편이 나음
- HTTPS 호출이 실패하면 더 긴 타임아웃으로 재시도하고, 큰 데이터는 작은 청크로 나눠 전송해야 함
- 청크별 진행 상황을 추적해야 함
- 실패한 작은 부분만 재시도하거나 재개할 수 있어야 함
- 큰 데이터를 한 번에 보내려는 시도보다 느리고 꾸준한 증분 진행이 더 안전함
- HTTPS 호출이 계속 실패하면 같은 호출을 맹목적으로 반복하기보다 DNS, ICMP, TLS 없는 HTTP, 알려진 정상 상태 엔드포인트로의 HTTPS 등을 점검해 사용자에게 상태를 알려야 함
-
시작 시 메타데이터 다운로드 실패
- 한 인기 데스크톱 앱은 시작할 때 벤더 웹사이트에서 설정 정보를 내려받으며, HTTPS 호출에 하드코딩된 타임아웃을 사용했음
- 이 호출이 실패하면 앱은 로드되지 않고 같은 파라미터로 영원히 재시도했으며, 로딩 화면은 원인을 알려주지 않았음
- South Pole에서는 계속 시도하면 결국 통과할 수 있었지만, 단일 타임아웃 값 하나가 엔터프라이즈급 앱을 거의 사용할 수 없게 만들었음
- 더 나은 동작은 긴 타임아웃으로 단계적 후퇴, 연결 상태 점검, 원인 표시, 캐시·기본 설정 사용, 수동 다운로드와 설치 경로 제공이었음
-
채팅 앱 두 개의 대비
- 한 인기 채팅 앱은 WebSocket 초기화에 10초 하드코딩 타임아웃을 사용했음
- TCP 핸드셰이크, TLS 세션, WebSocket 설정, 초기 시그널링이 모두 필요해 South Pole처럼 각 왕복이 여러 초 걸리는 조건에서는 10초를 넘길 수 있었음
- 타임아웃이 지나면 앱이 동작하지 않고 긴 백오프 상태에 들어갔으며, UX는 상황을 명확히 보여주지 않았음
- 경쟁 채팅 앱은 극도로 나쁜 네트워크 조건에서도 더 잘 동작했음
- 여러 네트워크 요청 전략을 사용함
- 열린 연결을 적극 재사용함
- 타임아웃을 동적으로 조정함
- 실패 시 재시도 간격을 지능적으로 선택함
- 현재 네트워크 상태를 명확하게 보여줌
- 두 앱 모두 실제로는 일반 텍스트 몇 바이트를 전송했지만, 네트워크 가정의 차이 때문에 사용할 수 있는 조건이 달라졌음
증분 전송과 재개 가능한 업로드
- brr.fyi는 정적 Jekyll 블로그이며, 자산은 S3에 저장되고 CloudFront로 제공됨
- 정적 파일은 로컬 노트북에서 빌드됨
- S3로 직접 업로드됨
- 서버, QA 환경, 빌드 시스템, 자동 훅, 동적 요소는 없음
- South Pole의 제약을 고려해 만든 Python 게시 스크립트는 S3 API로 자산을 작은 청크 단위로 업로드했음
- 실패한 업로드를 감지하고 진행 상황을 잃지 않고 재개함
- 모든 파일이 안전하게 업로드될 때까지 새 버전을 게시하지 않음
- 약 200줄의 Python으로 구현됨
- 상용 블로그 플랫폼이나 소셜 미디어에 큰 파일을 올리는 사용자는 위성 창 안에서 한 번에 성공할 가능성에 맞춰 시간을 조절해야 했음
- 실패하면 여러 번 재시도해야 했음
- 콘텐츠가 올라갔는지, 업로드가 끝났는지, 다시 “Post”를 눌러도 되는지 명확하지 않은 경우가 있었음
- 청크 POST가 실패해도 나중에 최소한의 손실로 재시도·재개할 수 있으면, 몇 KB씩이라도 편한 시간에 모아 업로드할 수 있음
내장 다운로더가 충족해야 하는 기준
- 앱이 자체 다운로더를 만들려면 높은 수준의 품질이 필요하며, 그렇지 않으면 느린 인터넷에서 심하게 불편하거나 치명적으로 실패함
- 가능한 경우 사용자가 내장 다운로더를 벗어나 직접 파일을 받을 수 있어야 함
- 수동 다운로드 링크 제공이 유용함
- 가능하면 전체 설치 파일보다 앱이 받으려던 차등 패치 파일 링크가 더 좋음
- 수동 다운로드 링크의 장점은 명확함
- 사용자가 브라우저처럼 더 견고한 다운로더를 선택할 수 있음
- 파일을 한 번 받아 여러 장치에 공유할 수 있음
- 앱이 실행되는 컴퓨터가 아닌 다른 컴퓨터에서 받을 수 있음
- 사용자가 자신의 제약에 맞춰 다운로드를 예약하거나 관리할 수 있음
- South Pole에는 24시간 인터넷이 없으므로, 매일 4시간 다운로드 창이 있더라도 그 시간 동안 받을 수 있는 데이터가 페이로드 크기보다 작으면 한 번에 완료할 방법이 없음
- 많은 내장 다운로더는 일시정지·재개, 상태 알림, 재시도 로직, 진행률 추적이 부족하고, 다운로드 시간 제한 같은 제약도 있어 느린 인터넷에서 앱 전체의 사용 가능성을 좌우함
브라우저 다운로드 관리자가 기준점인 이유
- 현대 웹 브라우저의 다운로드 관리자는 내장 다운로더가 비교될 수밖에 없는 높은 기준을 제공함
- 중단, 일시정지, 재개 기능
- 실패한 다운로드 재시도
- 현재 상태, 속도, 남은 시간 표시
- 저장 위치 선택과 파일 복사 가능성
- 임의의 성능 컷오프 없음
- 사용자가 60kbps로 수 GB 파일을 받겠다고 해도 브라우저는 이를 허용함
- 앱이 브라우저 수준의 기능을 구현하지 못한다면, 최소한 사용자가 브라우저로 받을 수 있는 원본 URL을 제공하는 편이 나음
macOS 업데이트 사례
- macOS 업데이트는 South Pole에서 특히 부담이 컸음
- 마이너 OS 업데이트 패치 크기는 보통 0.5~1.5GB
- 메이저 OS 업그레이드 패치는 때때로 6GB 이상
- Xcode 같은 추가 도구도 여러 GB인 경우가 많음
- 모든 macOS 장치가 Apple에서 직접 업데이트를 받으면 대역폭이 크게 낭비됨
- macOS 내장 업데이터는 제어가 적고, 기저 패치 파일을 쉽게 얻을 방법이 없었음
- 취소하거나 실패하면 항상 지능적으로 재개하지 않았고, 진행 상황을 잃는 경우가 있었음
- Apple의 macOS 캐싱 서버 기능은 이론상 각 패치를 한 번만 South Pole로 내려받게 해 부담을 줄일 수 있었음
- 실제로는 각 클라이언트 MacBook이 캐시 파라미터 협상을 위해 Apple에 HTTPS 호출을 성공시켜야 했음
- 이 호출이 실패하면 클라이언트 Mac은 알림이나 재시도 없이 공용 Apple 서버에서 직접 패치를 받았음
- South Pole에서는 이 초기 협상 호출이 자주 실패해 캐싱 기능이 유용하지 않았음
- 전체 설치 파일은 Mr. Macintosh에 모인 링크를 통해 Apple에서 받을 수 있었고, 이를 느리지만 신중하게 받아 기지 내 배포할 수 있었음
- 전체 설치 파일은 12GB였고, 다운로드에는 며칠이 걸릴 수 있었지만 신뢰성은 있었음
- Apple Silicon Mac은 전체 설치 파일로 업데이트해도 펌웨어나 Rosetta 업데이트 등 추가 콘텐츠 1~2GB를 Apple에서 직접 내려받으려 했음
- 이를 우회하거나 캐시할 방법이 없었음
- 다운로드가 macOS의 별도 구성요소로 넘어가 설치 UI에 진행률이 반영되지 않는 경우도 있었음
- “32분 남음” 화면이 몇 시간 동안 유지되며 백그라운드에서 1GB를 내려받는 상황이 발생했음
- 필요한 패치 링크 제공, 일시정지·재개와 상태 관리 강화, 전체 설치 파일에 Apple Silicon용 추가 항목 포함, 캐싱 서버의 신뢰성과 제어권 개선이 필요했음
Samsung Android OS 업데이트 사례
- Samsung Android 폰의 OS 업데이트 도구는 느리거나 간헐적인 인터넷을 고려하지 않은 사례였음
- 업데이트 UI에는 속도 표시, 숫자 진행률, 일시정지, 취소, 파일 크기 표시, 별도 다운로드용 파일 접근 방식이 없었음
- 다운로드가 실패하면 재개할 수 없고 처음부터 다시 시작했음
- South Pole에서는 한 번의 위성 패스 안에 전체 OS 업데이트를 받을 수 없어, 연결이 끊기면 반드시 실패하고 처음부터 다시 해야 했음
- 실제로는 인터넷이 끊기기 직전 폰을 완전히 끄고, 다음 위성 패스 때 다시 켜는 방식으로 다운로드 실패 판정을 피했음
- 이 방식으로 여러 위성 패스에 걸쳐 다운로드를 나눠 완료할 수 있었음
- 이런 우회는 필요하지 않아야 하는 비정상적인 해결책이었음
- Verizon의 macOS·Windows용 업데이트 앱은 이론상 컴퓨터에서 OS 업데이트를 플래시할 수 있게 하지만, 실제로는 버그가 많고 신뢰성이 낮으며 자체 내장 다운로더를 사용했음
- 문제의 핵심은 벤더가 제공하는 일반 사용자용 도구가 느린 인터넷 사용자에게 부족한 기능을 제공한다는 점임
작은 앱 업데이트와 Microsoft Office for Mac의 대비
- 한 작은 데스크톱 앱의 내장 업데이터는 느린 링크에서 필요한 기본 기능이 부족했음
- 일시정지 버튼
- 취소 버튼
- 진행률 표시
- 속도나 남은 시간 표시
- 원본 URL 접근
- 진행률 추적과 중단된 다운로드의 자연스러운 재개
- 이 앱은 수동 다운로드 링크만 제공해도 South Pole 사용자에게 크게 나아질 수 있었음
- 다른 앱의 자동 업데이터는 취소 버튼과 시각적 진행률 표시는 있었지만, 일시정지, 숫자 진행률·속도, 원본 URL 접근, 재개 기능이 부족했음
- Microsoft Office for Mac의 자동 업데이터는 South Pole에서도 좋은 사례였음
- 일시정지 버튼
- 취소 버튼
- 진행률 표시
- 속도와 남은 시간 표시
- 중단된 다운로드의 자연스러운 재개
- 원본 URL을 제공했다면 더 좋았겠지만, 인터페이스가 충분히 좋아 South Pole에서도 사용하기 괜찮았음
느린 인터넷 사용자를 위한 실무적 설계 원칙
- 빠른 인터넷 환경에서는 작은 누락처럼 보이는 기능도 느린 인터넷에서는 주요 장애가 될 수 있음
- 앱은 고정 타임아웃 하나 때문에 사용자가 몇 바이트의 텍스트도 보내지 못하는 루프에 빠지지 않도록 설계돼야 함
- 가능한 설계 원칙은 단순함
- 바이트가 움직이면 중단하지 않음
- 큰 페이로드는 청크로 나눔
- 실패해도 진행 상황을 보존함
- 네트워크 상태를 사용자에게 명확히 보여줌
- 내장 다운로더가 부족하면 수동 다운로드 링크를 제공함
- South Pole은 엣지 케이스지만, 해상 선박의 Inmarsat 환경, 산악 연구지의 Thales MissionLink와 Iridium Certus, 불안정한 Wi‑Fi, 잘못 구성된 라우터, 품질 낮은 WISP, 낡은 전화선 기반 다이얼업 사용자도 비슷한 제약을 겪을 수 있음
- 개발자가 모든 극단 상황을 최적화할 필요는 없지만, 제품이 느린 연결 사용자의 진행을 적극적으로 방해하지 않도록 만드는 노력은 필요함