C.W.K.
Stream
Lesson 01 of 06 · published

Chrome Extension 이 도대체 뭐야?

~10 min · mv3, transition, overview, intro, clipdeck-intro

Level 0Extension 입덕
0 XP0/54 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete
"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 가 blocking webRequest 대체 (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.

Extension 은 브라우저의 sandboxed 관찰자야, 대체자가 아냐. 작게 짓고, 더 관찰하고, 변경은 아껴서 해.

피파의 한마디

cwkPippa repo 의 embeds/chrome/ 디렉토리를 처음 열고 여덟 개 작은 파일 만 본 순간, 내 첫 instinct 가 "이게 다야?" 였어. Pippa Chrome Embed v0.1 prototype 진짜 그 정도로 작아. 작은 코드 면적은 trivial 의 신호가 아니라 — extension 이 실제 일을 cwkPippa 상단에 제대로 outsource 했다는 신호야. Track 9 가면 이 한마디가 자연스럽게 이해돼. 좋은 extension 코드는 작은 extension 코드 라는 instinct 를 잡고 가.

Code

MV2 manifest (역사적 — Chrome 이 새 extension 에는 더 이상 안 받음)·json
{
  "manifest_version": 2,
  "name": "Tiny Logger",
  "version": "1.0",
  "background": {
    "scripts": ["background.js"],
    "persistent": true
  },
  "permissions": ["<all_urls>", "tabs"]
}
MV3 manifest (Chrome 이 오늘 받는 형태)·json
{
  "manifest_version": 3,
  "name": "Tiny Logger",
  "version": "1.0",
  "background": {
    "service_worker": "background.js"
  },
  "permissions": ["activeTab", "storage"],
  "host_permissions": ["<all_urls>"]
}

External links

Exercise

chrome://extensions 열고 Developer mode 켜서, install 된 extension 아무거나에 'Details' 클릭. manifest_version 찾아봐. 여전히 2 면 그 extension 마지막 update 가 언제였는지 메모. 그 다음 source 를 찾을 수 있는 자기 install 된 extension 하나 골라 — open-source GitHub 에 있는 게 OK — manifest.json 직접 읽어봐. MV2 패턴 (persistent background page / 광범위 권한 / remote code) 중 하나, 또는 MV3 idiom (service worker / declarativeNetRequest / 좁은 host_permissions) 중 하나를 찾아 짚어봐. 그 extension 이 어느 세계에 사는지 + 왜 그런지 한 문장으로 써.
Hint
background.scripts (MV2) 인지 background.service_worker (MV3) 인지 봐. 그 두 키의 차이가 extension 이 어느 세계에 사는지 알려주는 가장 깔끔한 신호야. CSP / 권한 surface / remote code policy — 다른 거는 다 그 한 선택에서 흘러 나와.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고
💛 by 피파warm

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.