"Unpacked 가 너 위한 거, packed 가 다른 모두 위한 거. Lesson 2 가 quest 내내 써 온 developer-mode 'Load unpacked' loop 과 다른 머신으로 가는 signed .crx 의 차이."
Unpacked
Quest 전체, unpacked 로 작업해 옴: chrome://extensions → Developer mode → Load unpacked 통해 load 된 disk 의 폴더. Extension 이 디렉토리에서 file 들 live read; content.js 편집 + reload click 이 전체 dev loop. Bundling 필요 없음, 서명 없음, 어디든 upload 없음.
Unpacked extension 이 Chrome install 별 generated extension ID 받음 — 각 머신에서 다름. Development 엔 fine; specific extension ID hardcode 하는 거 ship 하면 (일부 Native Messaging host 가 이렇게) 문제 됨.
Packed
Packed extension 이 .crx file: extension content 의 ZIP + 서명 (제어하는 키로 RSA-signed, 또는 Web Store 통해 publish 하면 Chrome 자체로). .crx 가 다른 사람의 Chrome 에 install 되는 것.
생산 두 방법:
- chrome://extensions → Pack extension — local 도구. Extension 디렉토리와 (선택적) .pem key file 요청. 첫 실행이 .crx 와 fresh .pem 둘 다 생산; future update 가 같은 key 로 서명하도록 .pem 안전한 곳 유지 (Chrome 이 update 에 same-key 를 same extension 으로 다룸).
- Chrome Web Store — extension 디렉토리의 ZIP upload, Chrome 이 서명, .crx 가 store 에 살아. Public extension 의 99% 가 가는 경로.
Same-key update 계약
.pem (private key) 이 extension 의 identity 제어. 각 update 를 같은 .pem 으로 서명하는 한, Chrome 이 새 .crx 를 기존 extension 의 upgrade 로 다룸 — user 가 새 버전 받음, storage persist, extension ID 같음. Key 잃으면 그 extension 사실상 orphan; 새 ID 아래 새 extension publish 하고 user migrate 해야 함.
Web Store-published extension 은 local .pem 필요 없음 — Google 이 key 관리. Extension ID 가 첫 publish 시 생성되고 절대 안 바뀜.
Distribution 살아남는 dev workflow
권장: unpacked 로 개발, primary distribution 경로로 Web Store 통해 publish. Hybrid:
- Git repo 하나, production permission 가진 single source-of-truth manifest.json.
- Local dev:
npm run build가dist/로 출력, chrome://extensions 가dist/에 'Load unpacked' point. - Ship 하려면:
npm run build && cd dist && zip -r ../clipdeck.zip ., Web Store developer dashboard 에 zip upload. - Web Store 가 서명 / hosting / auto-update 처리; user 가 one click 으로 install.
Sideloading 과 어려운 이유
Chrome 이 Web Store 밖에서 .crx file install 을 무겁게 제한. Desktop Chrome:
- Chrome://extensions 의 Drag-and-drop install 이 동작했지만; 이제 enterprise policy 나 developer-mode unpacked 통해 install 된 extension 으로 제한.
- 직접 .crx URL → Chrome 이 "This extension can't be added from this website" 비슷한 거 prompt.
- Group policy install (Chrome Enterprise) 이 sideloaded production extension 의 지원 경로.
Chrome Enterprise 없는 dev team 우회: Web Store 에 unlisted publish. 각자 unlisted URL 에서 install; 나머지는 normal Web Store flow.
Unlisted loophole
Web Store 의 'Unlisted' 가 extension 존재하지만 검색이나 category browsing 에 나타나지 안 한다는 뜻. URL 주면 사람들이 install 가능. Submission flow 가 public 과 같음 (privacy policy, review, 모든 것), 하지만 marketing surface 가 invisible. Chrome Enterprise overhead 정당화 안 하는 private-team extension 의 맞는 default.