해설 글

외부 API 가 아니어도 인터넷을 쓰는 경우: 내려받기·업데이트 확인·사용 기록

2026-10-09 마지막 수정

외부 API 를 부르지 않는 도구도 인터넷을 씁니다. 대표적인 경우는 세 가지입니다. 모델이나 데이터를 내려받을 때, 새 버전이 있는지 확인할 때, 사용 기록(텔레메트리)을 보낼 때입니다. 이 글은 세 경우에 무엇이 오가는지, 끄는 방법이 코드에 어떻게 보이는지를 실제 저장소의 코드로 정리합니다.

1. 모델·데이터 내려받기

로컬에서 모델을 돌리는 도구는 처음 실행할 때 모델 파일을 내려받는 경우가 많습니다. Hugging Face Hub 가 가장 흔한 출처이고, 패키지 저장소(PyPI·npm)에서 실행 중에 추가 패키지를 받는 도구도 있습니다. 이때는 내 데이터가 나가는 것이 아니라 파일이 들어오는 쪽입니다. 다만 모델 파일은 수 GB 에 이를 수 있고, 인터넷이 막힌 환경에서는 첫 실행이 실패합니다.

Hugging Face 의 huggingface_hub 라이브러리로 모델을 받는 도구는 HF_HUB_OFFLINE=1 을 설정하면 이미 받아 둔 캐시만 씁니다. 모델을 한 번 받아 둔 뒤 오프라인으로 쓰고 싶을 때 쓰는 방법입니다.

2. 업데이트 확인

명령줄 도구는 실행할 때 새 버전이 있는지 묻는 경우가 많습니다. 요청 하나라 가볍게 보이지만, 무엇을 같이 보내는지는 도구마다 다릅니다.

샌드박스 도구 nolabs-ai/nono 의 update_check.rs 1~26번째 줄은 보내는 내용을 주석으로 자세히 적어 둔 예입니다. 업데이트 확인은 하루에 한 번, 3초 제한으로 뒤에서 돕니다. 요청에는 처음 실행할 때 만들어 저장한 무작위 UUID, 현재 버전, 운영체제, CPU 종류, CI 환경인지에 대한 대략적인 구분, 설치 경로에 대한 대략적인 구분이 들어갑니다. 끄는 방법도 같은 곳에 있습니다. 환경 변수 NONO_NO_UPDATE_CHECK=1 을 두거나, 설정 파일에 [updates] check = false 를 적으면 됩니다(201~202번째 줄이 이 변수를 확인합니다).

이 예에서 볼 점은 업데이트 확인에도 설치마다 고정된 식별자가 실릴 수 있다는 것입니다. 개인 정보는 아니지만, 같은 설치에서 온 요청을 서로 이을 수는 있습니다. 이런 내용을 알고 싶다면 코드에서 update, version check, releases/latest 를 검색해 보세요.

3. 사용 기록(텔레메트리)

사용 기록은 「어떤 명령을 썼는지」「어떤 화면을 열었는지」 같은 정보를 만든 사람에게 보내는 것입니다. 보내는 항목과 기본값은 도구마다 크게 다릅니다. 실제 코드에서 본 두 가지 모양입니다.

기본으로 켜고, 처음 한 번 알리고, 끄는 변수를 존중하는 모양

JuliusBrussee/caveman 의 명령줄 도구 packages/cli/src/index.ts 555~576번째 줄이 켜짐·꺼짐을 정합니다. 순서는 다음과 같습니다.

  • DO_NOT_TRACK 이 비어 있지 않고 0 이 아니면 끕니다.
  • CAVEMAN_TELEMETRY 가 있으면 그 값(1·true·on 이면 켬, 그 밖은 끔)을 따릅니다.
  • CI 환경이거나 사람이 직접 치는 터미널이 아니면 끕니다.
  • 저장된 선택이 있으면 그것을 따르고, 없으면 켜는 것이 기본입니다.

기본이 켜짐이지만, 637~661번째 줄은 처음 실행할 때 안내 문구를 한 줄 출력하고 나서야 보내기 시작하게 짜여 있습니다. 끄는 방법을 알고 있다면 첫 실행 전에 DO_NOT_TRACK=1 을 두면 됩니다.

보내는 항목을 코드에 고정하고 설정에서 끄는 모양

데스크톱 앱 amone-labs/porch 의 app/src/analytics.ts 1~43번째 줄은 보내는 이벤트의 이름과 항목을 타입으로 모두 적어 둡니다. 맨 위 주석은 경로·프로젝트·프롬프트·요약은 보내지 않는다고 말하고, 빌드에 분석 키가 없거나 설정이 꺼져 있으면 아무것도 보내지 않는다고 말합니다. 51~67번째 줄에서는 분석 도구(PostHog)의 자동 수집·화면 녹화·설문 같은 기능을 하나하나 끕니다.

이런 코드는 「무엇을 보내는지」를 문서가 아니라 코드로 확인할 수 있게 해 줍니다. 타입에 없는 항목은 보낼 수 없기 때문입니다.

끄는 방법을 찾는 순서

  • DO_NOT_TRACK=1 을 먼저 둡니다. 여러 도구가 따르는 관례지만 모든 도구가 따르지는 않습니다. 위 caveman 처럼 코드에서 이 이름을 확인하는 도구에만 듣습니다.
  • 코드에서 이름을 검색합니다. DO_NOT_TRACK, TELEMETRY, analytics, 그리고 흔한 분석 도구 이름인 posthog, sentry, segment, mixpanel 을 찾으면 보내는 곳과 끄는 변수가 대개 같이 나옵니다.
  • 도구 고유의 변수나 설정을 확인합니다. 위 예의 CAVEMAN_TELEMETRY=0, NONO_NO_UPDATE_CHECK=1 처럼 도구마다 이름이 다릅니다. README 의 「Telemetry」「Privacy」 절에 적혀 있는 경우가 많습니다.

결과 페이지에서 보는 곳

이 사이트는 이런 연결을 외부 API 로 세지 않고 따로 적습니다(「외부 API 발견 안 됨」이 말하는 것).

  • 「네트워크로 받아 오는 것」: 패키지 저장소, GitHub, 릴리스·업데이트 확인, 문서 사이트처럼 받아 오는 연결입니다.
  • 「외부로 나가는 데이터」: 텔레메트리를 포함해, 무엇이 어디로 나가는지를 「확인됨」「추정」「확인 불가」로 나눠 적습니다. 「추정」은 보내는 지점과 직접 이어지지 않은 근거로 본 것이니, 근거 줄을 열어 직접 확인해 보세요.

다른 글 · API별 저장소 · 방법론