본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 05. 27. 13:02

Ungoogled Chromium을 위한 자가 치유형 확장 프로그램 안정화 도구 제작 (직접 사용해 보세요)

요약

Ungoogled Chromium 사용 시 발생하는 확장 프로그램 관리의 어려움을 해결하기 위해 제작된 'Ungoogle Extension Stabilizer'를 소개합니다. 사용자가 선언한 확장 프로그램 ID 목록을 기반으로 누락된 프로그램을 자동 설치하고 삭제된 프로그램을 복구하는 자가 치유 기능을 제공합니다.

핵심 포인트

  • Ungoogled Chromium의 확장 프로그램 관리 문제 해결
  • 선언적 목록 기반의 확장 프로그램 자동 관리
  • Manifest V3 기반의 감시자(Watchdog) 기능 구현
  • 프로필 손실 및 실수로 인한 삭제 시 자동 복구 지원

저는 한동안 Ungoogled Chromium을 데일리 드라이버(daily driver)로 사용해 왔습니다. 속도가 정말 놀랍습니다. 텔레메트리(telemetry) 오버헤드도 없고, 집으로 전화를 거는(phoning home) 백그라운드 서비스도 없으며, 그저 사용자의 방해를 하지 않는 가볍고 빠른 브라우저입니다.

하지만 문제가 있습니다. 사실, 여러 가지 문제가 있죠.

문제점: 확장 프로그램 관리의 지옥

Ungoogled Chromium을 사용해 보셨다면 어떤 상황인지 아실 겁니다. Chrome 웹 스토어(Chrome Web Store)가 통합되어 있지 않습니다. 그냥 "Chrome에 추가"를 클릭해서 바로 작동하게 만들 수 없습니다. ungoogledextensions.com 같은 사이트들이 구원 투수 역할을 해주긴 합니다. 확장 프로그램을 수동으로 찾아보고 설치할 수 있게 해주니까요. 하지만 확장 프로그램이 몇 개 이상 늘어나는 순간, 상황이 엉망이 되기 시작합니다.

저에게 일어났던 일입니다. 두 번이나 말이죠:

  1. 프로필 손실 — 무언가가 제 Chrome 프로필 디렉터리를 손상시켰습니다. 모든 확장 프로그램이 사라졌습니다. 저는 저녁 내내 확장 프로그램 ID를 찾아다니고, 수십 개의 웹 스토어 탭을 열고, 설치 대화 상자를 하나씩 클릭하며 시간을 보냈습니다.

  2. 실수로 인한 삭제 — 브라우저 문제를 디버깅(debugging)하던 중 확장 프로그램 몇 개를 비활성화했습니다. 마우스를 잘못 움직인 결과, uBlock Origin이 삭제되었습니다. 저는 3일 동안이나 알아채지 못했습니다. 3일 동안 광고를 보게 된 것이죠.

두 번째 사건 이후, 저는 생각했습니다. 더 나은 방법이 분명히 있을 거야.

아이디어: 선언적 확장 프로그램 관리 (Declarative Extension Management)

제가 원하는 확장 프로그램이 무엇인지 적어두기만 하면, 도구가 나머지를 처리해 준다면 어떨까요?

cjpalhdlnbpafiamejdnhcphjbkeiagm    # uBlock Origin
gcbommkclmclpchllfjekcdonpmejbdp    # HTTPS Everywhere
nngceckbapebfimnlniiiahkandclblb    # 내가 필요한 또 다른 것

목록을 저장합니다. 끝입니다. 도구는 누락된 것은 설치하고, 있어서는 안 될 것은 제거하며, 설정이 어긋나지 않도록 계속 확인합니다. 만약 uBlock이 다시 삭제된다면, 자동으로 다시 설치됩니다. 컴퓨터를 바꾸더라도 똑같은 목록을 붙여넣기만 하면 됩니다.

그것이 바로 안정화 도구(stabilizer)입니다.

기능

저는 브라우저 확장 프로그램의 일관성을 감시하는 감시자(watchdog) 역할을 하는 Manifest V3 기반 Chrome 확장 프로그램인 Ungoogle Extension Stabilizer를 제작했습니다.

핵심 기능:

기능작동 방식
선언적 목록 (Declarative list)확장 프로그램 ID를 한 줄에 하나씩 붙여넣으세요. 이것이 신뢰할 수 있는 단일 원천(source of truth)이 됩니다.
...

아키텍처 개요:

┌───────────────┐     ┌────────────────────┐     ┌──────────────────┐
│   Popup UI    │────▶│  Service Worker     │────▶│  Chrome APIs     │
│  (user input) │     │  (install/monitor)  │     │  management,     │
...

왜 CRX 직접 다운로드인가?

첫 번째 버전은 Chrome Web Store를 자동화하려고 시도했습니다. "Chrome에 추가" 버튼을 찾아 클릭하도록 스크립트를 주입하는 방식이었죠. 하지만 이는 매우 취약했습니다. Web Store의 DOM 구조는 수시로 변경되고, Shadow DOM은 요소 선택을 까다롭게 만들며, 솔직히 말해 모래 위에 성을 쌓는 기분이었습니다.

그러다 CRX 직접 다운로드 URL을 발견했습니다:

  ?response=redirect
  &prodversion=130.0.0.0
...

이 URL로 이동하면 Chrome의 네이티브 확장 프로그램 설치 흐름이 트리거됩니다. DOM 파싱도, 버튼 찾기도, 취약한 셀렉터(selector)도 필요 없습니다. 브라우저가 설계된 대로 작동하게 만드는 것입니다. 우리는 그저 올바른 URL을 가리키기만 하면 됩니다.

사용자 제스처(User Gesture)의 난관

어렵게 배운 교훈이 하나 있습니다. Chrome은 chrome.management.uninstall()을 실행할 때 **사용자 제스처 (user gesture)**를 요구합니다. 서비스 워커(service worker)에서 단순히 호출한다고 해서 작동할 것이라고 기대할 수 없습니다. 에러 메시지는 아주 무책임하게도 다음과 같습니다:

chrome.management.uninstall requires a user gesture.

해결책은 무엇일까요? 삭제 작업을 팝업(popup) 컨텍스트로 옮기는 것입니다. 팝업에서는 모든 버튼 클릭이 곧 사용자 제스처가 됩니다. 각 삭제 작업은 브라우저 확인 대화 상자를 트리거하며, 사용자가 "삭제"를 클릭할 때 발생하는 동작이 다음 작업을 위한 새로운 제스처를 제공합니다. 완벽한 무인(zero-touch) 방식은 아니지만, Chrome의 보안 모델이 허용하는 범위 내에서 가장 근접한 방식입니다.

시작하기

# 리포지토리 클론
git clone https://github.com/TingyuShare/ungoogle-extension-stabilizer.git

...

Web Store URL에서 확장 프로그램 ID를 찾으세요:
https://chromewebstore.google.com/detail/cjpalhdlnbpafiamejdnhcphjbkeiagm

해당 ID를 팝업(popup)에 붙여넣고 저장하면 완료됩니다.

향후 계획

현재 버전은 v1.0입니다. 추가하고 싶은 기능이 많이 있습니다:

  • 프로필 내보내기/가져오기 (Export/import profiles) — 확장 프로그램 목록을 JSON 또는 간단한 링크로 공유
  • 확장 프로그램 이름 확인 (Extension name resolution) — ID와 함께 사람이 읽을 수 있는 이름을 표시
  • Firefox 포팅 (Firefox port)browser.management API가 유사하므로, 포팅 작업이 크게 어렵지는 않을 것입니다
  • 멀티 프로필 지원 (Multi-profile support) — 업무용과 개인용 브라우징을 위한 서로 다른 확장 프로그램 세트 구성
  • CLI 컴패니언 (CLI companion) — 설정 파일로부터 확장 프로그램 목록을 생성하는 Node.js 도구

도움을 주고 싶으신가요?

이 프로젝트는 MIT 라이선스를 따르며 기여에 열려 있습니다. 코드, 버그 보고, 문서화, 또는 번역 등 무엇이든 환영합니다.

리포지토리를 확인하세요: github.com/TingyuShare/ungoogle-extension-stabilizer

특히 다음과 같은 분야에서 도움을 주시면 감사하겠습니다:

  • 🌐 팝업 UI를 위한 번역 (Translations)
  • 🧪 다양한 Chromium 포크(fork) 브라우저에서의 테스트 (Testing) (Brave, Edge, Vivaldi)
  • 🎨 UX 개선 (UX polish) — 더 나은 상태 표시기, 다크/라이트 테마 지원
  • 📦 자동화된 릴리스 패키징을 위한 CI/CD

이것이 중요한 이유

Ungoogled Chromium 커뮤니티는 독립성을 가치 있게 여깁니다. 계정 동기화 없음, 클라우드 프로필 없음, 벤더 종속(vendor lock-in) 없음. 하지만 이러한 독립성에는 유지 관리의 부담이 따릅니다. 모든 확장 프로그램은 사용자의 책임입니다 — 직접 설치하고, 업데이트하고, 관리해야 합니다.

제가 이 안정화 도구(stabilizer)를 만든 이유는 개인정보 보호와 편의성 사이에서 하나를 선택할 필요가 없어야 한다고 믿기 때문입니다. 텍스트 파일에 브라우저의 정체성을 정의하고, 그것이 일관되게 유지된다고 신뢰할 수 있어야 합니다.

이 내용에 공감하신다면 — 프로젝트에 ⭐를 눌러주시거나, 직접 사용해 보시거나, 기여해 주세요. 확장 프로그램 관리를 다시 지루할 정도로 단순하게 만들어 봅시다.

ungoogled Chromium 커뮤니티를 위해 ❤️를 담아 제작되었습니다. MIT 라이선스가 적용됩니다. GitHub에서 보기 →

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
1

댓글

0