프라이버시 우선 Firefox 새 탭 확장 프로그램을 만든 방법 (데이터 수집 없음, 절대)

발행: (2026년 5월 4일 AM 04:53 GMT+9)
8 분 소요
원문: Dev.to

I’m happy to help translate the article, but I don’t have the article’s content in your message. Could you please paste the text you’d like translated (excluding the source line you’ve already provided)? Once I have the content, I’ll translate it into Korean while preserving the original formatting, markdown, and any code blocks or URLs.

대부분의 브라우저 확장 프로그램의 문제점

Browser extensions have a reputation problem. Many popular extensions — weather apps, new tab replacements, productivity tools — quietly collect your browsing data, sell it to advertisers, or require accounts that tie activity to your identity.

브라우저 확장 프로그램은 평판 문제가 있습니다. 많은 인기 확장 프로그램—날씨 앱, 새 탭 교체, 생산성 도구—은 조용히 사용자의 브라우징 데이터를 수집하고, 광고주에게 판매하거나, 활동을 사용자의 신원과 연결하는 계정을 요구합니다.

When I built the Weather & Clock Dashboard for Firefox, I made a different choice: zero data collection, no accounts, no tracking. Here’s exactly how that works technically.

제가 Firefox용 Weather & Clock Dashboard를 만들었을 때, 저는 다른 선택을 했습니다: 데이터 수집 전혀 없음, 계정 없음, 추적 없음. 다음은 기술적으로 그것이 어떻게 작동하는지 정확히 설명합니다.

“프라이버시‑우선”이 실제 의미하는 바

이 용어는 자주 사용됩니다. 이 확장 프로그램에서는 다음을 의미합니다:

  • No network requests to my servers — 날씨 데이터는 브라우저에서 직접 Open‑Meteo의 API로 전송됩니다
  • No analytics or telemetry — Mixpanel도, GA4도, PostHog도 사용되지 않습니다
  • No account required — 설정이 localStorage를 통해 로컬에 저장되며, 절대 동기화되지 않습니다
  • Minimal permissionsstoragegeolocation만 필요합니다 (날씨를 활성화한 경우)

아키텍처

[Your Browser] → [Open-Meteo API] (weather data)
[Your Browser] → [localStorage] (your settings)

That's it. No middleman.

백엔드 없이 날씨 처리하기

대부분의 날씨 확장 프로그램은 여러분의 위치를 자체 서버를 통해 라우팅합니다. 이를 통해 다음과 같은 작업을 할 수 있습니다:

  • IP 주소를 기록합니다
  • 위치를 계정과 연결합니다
  • 데이터를 판매합니다

Open‑Meteo를 사용하면 이 모든 것을 건너뛸 수 있습니다:

// Browser requests weather directly — no proxy server
async function fetchWeather(lat, lon) {
  const url = `https://api.open-meteo.com/v1/forecast
    ?latitude=${lat}
    &longitude=${lon}
    &current_weather=true
    &daily=temperature_2m_max,temperature_2m_min,weathercode
    &forecast_days=3`;

  const response = await fetch(url);
  return response.json();
}

Open‑Meteo는 API 키가 필요 없는 무료 오픈소스 날씨 API입니다. 여러분의 IP가 그들의 서버에 접속하게 되지만(이는 모든 날씨 서비스에서 피할 수 없는 일입니다), 계정 연동은 없습니다.

위치 정보: 사용자 동의 우선

function requestWeatherPermission() {
  navigator.geolocation.getCurrentPosition(
    position => {
      // User approved — fetch weather
      fetchWeather(position.coords.latitude, position.coords.longitude);
    },
    error => {
      // User denied — show a default city selector
      showCitySearch();
    }
  );
}

브라우저의 기본 위치 정보 권한 대화 상자는 사용자가 완전한 제어권을 가집니다. 권한이 거부되면 확장 프로그램은 기본 도시 선택기로 전환되어 정확한 위치를 공유하지 않아도 날씨 정보를 얻을 수 있습니다.

설정 저장소: localStorage 전용

모든 설정 — 테마, 선택한 도시, 온도 단위 — 은 localStorage에 저장됩니다. 데이터는 어디에도 전송되지 않습니다.

const SETTINGS_KEY = 'wcd_settings';

function saveSettings(settings) {
  localStorage.setItem(SETTINGS_KEY, JSON.stringify(settings));
}

function loadSettings() {
  const raw = localStorage.getItem(SETTINGS_KEY);
  return raw ? JSON.parse(raw) : DEFAULT_SETTINGS;
}

이는 설정이 기기 간에 동기화되지 않음을 의미합니다 — 이는 의도된 트레이드오프입니다. 동기화를 위해서는 서버가 필요하고, 서버를 위해서는 계정이 필요하며, 이는 프라이버시 흔적을 남기게 됩니다.

권한 매니페스트

Firefox 확장 프로그램은 manifest.json에 권한을 미리 선언합니다. 우리의 경우는 다음과 같습니다:

{
  "permissions": [
    "storage"
  ],
  "optional_permissions": [
    "geolocation"
  ]
}

storagelocalStorage를 위한 권한이며, geolocation은 선택적 권한으로 “날씨 사용”을 클릭했을 때만 요청됩니다. tabs, history, browsingData, webNavigation과 같이 핵심 기능에 실제로 필요하지 않은 권한을 요청하는 확장 프로그램과 비교해 보세요.

오픈 소스와 책임성

이 확장은 MIT 라이선스를 사용하며 소스 코드는 검토를 위해 제공됩니다. 프라이버시 주장은 쉽게 할 수 있지만, 소스 코드를 위조하기는 어렵습니다.

사용자가 코드를 읽을 수 있을 때, 다음을 확인할 수 있습니다:

  • 숨겨진 API 호출이 없음
  • 난독화된 추적 코드가 없음
  • 권한이 실제로 주장하는 용도로 사용됨

결과

Weather & Clock Dashboard는 새 탭 대체 기능으로 작동합니다:

  • 실시간 날씨 및 3일 예보
  • 여러 시간대에 대한 세계 시계
  • 검색창 (원하는 엔진 선택)
  • 다크/라이트 모드

여러분의 데이터를 단 한 바이트도 수집하지 않습니다.

설치: Weather & Clock Dashboard on AMO

브라우저 확장 프로그램을 개발 중이라면 같은 방식을 고려해 보세요. 사용자는 프라이버시에 대해 점점 더 까다로워지고 있습니다 — 진정으로 프라이버시를 최우선으로 하는 것은 윤리적일 뿐만 아니라 경쟁력도 됩니다.

0 조회
Back to Blog

관련 글

더 보기 »