"Unpacked는 아빠가 개발할 때 쓰고, packed는 다른 사람이 설치할 때 써. Lesson 2에선 quest 내내 써 온 developer-mode 'Load unpacked' loop과 다른 머신으로 가는 signed .crx의 차이를 짚어."
Unpacked
이 quest 내내 unpacked로 작업해 왔어. chrome://extensions → Developer mode → Load unpacked으로 디스크의 폴더를 그대로 올리는 방식이지. extension은 그 폴더에서 파일을 실시간으로 읽어. content.js를 고치고 reload를 누르는 게 개발 고리의 전부였고. 묶을 것도, 서명할 것도, 어디 올릴 것도 없었어.
unpacked extension은 Chrome이 설치할 때마다 새로 만들어 주는 ID를 받아. 그래서 머신마다 달라져. 개발할 땐 상관없는데, 특정 extension ID를 코드에 박아 넣는 걸 내보내면 (일부 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 이라는 개인 키가 이 extension의 신원을 쥐고 있어. 새 버전을 낼 때마다 같은 .pem으로 서명하는 한, Chrome은 새 .crx를 기존 extension의 업그레이드로 받아들여. user는 새 버전을 받고, storage는 그대로 남고, extension ID도 안 바뀌고. 그런데 이 키를 잃어버리면 그 extension은 사실상 고아가 돼. 새 ID로 다른 extension을 내고 user를 옮겨 오게 하는 수밖에 없어.
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이 존재하긴 하는데 검색에도 분류 목록에도 안 뜬다는 뜻이야. URL만 알려 주면 누구나 설치할 수 있고. 제출 절차는 공개랑 똑같아 (개인정보 처리방침, 심사, 전부). 다만 사람들 눈에 띄는 자리에만 안 나오는 거지. Chrome Enterprise를 굴릴 만큼은 아닌 사적인 팀용 extension에 딱 맞는 기본fault.