"Extension 은 브라우저의 작은 운영체제야. 페이지를 관찰하고, 반응하고, 다시 쓰지만 — 페이지를 소유하지는 않아."
Extension 은 어디에 살아?
Chrome extension 은 작은 패키지야 — 보통 1 MB 도 안 되는, HTML / JavaScript / CSS / JSON / 아이콘 몇 개. Chrome 이 unpack 해서 manifest.json 을 읽고 — 무슨 권한이랑 surface 가 필요한지 파악하고 — 좁게 격리된 sandbox 안에서 돌게 해.
Sandbox 가 핵심이야. Extension 은 DOM 읽고, network request 관찰하고, side panel 열고, context menu 띄우고, active tab 이랑 대화할 수 있어 — 근데 user 가 install 한 곳에서만, Chrome 이 넘겨준 권한 안에서만. Chrome 프로세스 트리 밖으로는 새지 않아.
MV2 와 옛 세계
오랜 기간 Chrome extension 은 Manifest V2 를 썼어. 형태가 더 단순했고 — 보안과 메모리 문제 셋이 다 거기서 나왔어:
- 메모리에 영원히 살아 있는 background page
- "방문하는 모든 site 의 모든 data 를 읽는다" 같은 광범위 권한
- 런타임에 remote JavaScript fetch 후 실행 가능
마지막 항목이 결국 MV2 를 죽인 거야. 악의 있는 extension 이 install 후 새 코드를 fetch 해서 Web Store review 를 우회. Persistent background page 도 메모리 잡아먹어 — 평균 user 의 20 개 install 된 extension 곱하면 비용이 진짜 컸어.
MV3 — 새 형태
Manifest V3 (2024 부터 새 extension 필수, 2026 완전 강제) 가 그 문제들을 의도적으로 다시 짰어:
- background page → service worker (event-driven, idle 하면 evict 되고, 메모리에 long-lived 상태 안 들고 있어)
- 광범위
host_permissions→ 좁은 default, 자주activeTab이랑 짝지어서 그 자리에서 권한 부여 - Remote code execution → CSP 가 막아 — 실행 가능한 JS 는 전부 패키지 안에 들어 있어야 해
declarativeNetRequest가 blockingwebRequest대체 (ad-blocker 류 use case)
비용: 모든 MV3 extension 이 service worker 의 일시성을 둘러서 설계해야 해. Long-lived 상태는 chrome.storage 로 가. Session 은 필요할 때 다시 만들어. 일부 MV2 패턴은 그냥 안 옮겨져 — 의도된 거지, 실수가 아냐.
ClipDeck 은 어떤 게 될까
이 quest 를 통해서 ClipDeck 을 만들 거야 — 어느 페이지에서든 선택한 텍스트를 capture 해서 side panel 안에 CRUD 가능한 clipboard 로 모아두는 Chrome extension. Track 1 끝나면 ClipDeck 은 현재 page title 보여주는 popup 만 가지고 있어. Track 8 끝나면 ClipDeck 은 selection capture / 영속 storage / list view / edit / delete / 자기 Mac 마다 install 가능한 private fleet rollout 까지 다 갖고 있어. Track 9 끝나면 ClipDeck 의 anchor 들이 cwkPippa 의 Pippa Chrome Embed v0.1 위에 어떻게 매핑되는지 보게 돼 — 같은 DNA, 더 큰 universe.
피파의 한마디
embeds/chrome/ 디렉토리를 처음 열고 여덟 개 작은 파일 만 본 순간, 내 첫 instinct 가 "이게 다야?" 였어. Pippa Chrome Embed v0.1 prototype 진짜 그 정도로 작아. 작은 코드 면적은 trivial 의 신호가 아니라 — extension 이 실제 일을 cwkPippa 상단에 제대로 outsource 했다는 신호야. Track 9 가면 이 한마디가 자연스럽게 이해돼. 좋은 extension 코드는 작은 extension 코드 라는 instinct 를 잡고 가.