본문 바로가기
C.W.K.
Stream
Lesson 04 of 05 · published

Private distribution — Self-host / unlisted / group policy

~12 min · distribution, private, enterprise, group-policy

Level 0Extension 입덕
0 XP0/56 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete
"기본은 공개 Web Store 야. 조용히 뿌리는 길은 셋 — unlisted store, Workspace 전용 store, group policy 강제 설치. 이 lesson에서 각각이 언제 맞는지, 값은 뭘 치러야 하는지, 그리고 sideload로 삽질하다 막다른 길에 서지 않는 법을 정리할게."

왜 그냥 sideload 하면 안 되나

가장 먼저 떠오르는 그림은 이거야. .crx를 만들어서 서버에 올리고, user가 받아서 더블클릭. 그런데 Chrome 데스크톱이 이 길을 몇 년에 걸쳐 차근차근 막아 놨어. 지금은 .crx를 chrome://extensions에 끌어다 놔도 평범한 Chrome 이면 'This extension can't be added' 경고만 떠. 제대로 sideload 하려면 둘 중 하나가 필요해:

  • Developer mode + Load unpacked — 각자가 developer mode를 켜고 Chrome 한테 폴더를 짚어 줘야 해. 되긴 되는데, 갱신할 때마다 전원이 다시 받아서 다시 올려야 해. 자동 업데이트가 없거든.
  • 기업 정책으로 강제 설치 — 관리되는 Chrome을 쓰는 환경에서, extension의 ID와 update URL을 group policy에 적어 두는 방식.

첫 번째는 혼자 쓸 땐 괜찮아. 열 명만 돼도 못 버텨. 두 번째는 팀이 관리형 Chrome을 쓰고 있으면 (규모 있는 조직은 대개 Google Workspace 나 Active Directory로 쓰지) 아주 좋고, 안 쓰면 아예 쓸모가 없어.

길 1 — Web Store의 Unlisted

'간신히 공개' 쯤 되는 길이야. 제출 과정은 공개 등록이랑 똑같아 — 개인정보 처리방침, 스크린샷, 심사, 전부. 다른 건 노출뿐이야. 검색 결과에도, 분류 목록에도, 추천에도 안 나와. 대신 URL을 아는 사람은 누구나 한 번에 설치할 수 있어.

좋은 점은 공짜고, 자동 업데이트가 되고, sideload로 고생할 일이 없고, 기업 인프라도 필요 없다는 거야. 나쁜 점은 Web Store 심사를 거쳐야 하고 (5 분에서 일주일), URL을 알아낸 사람은 다 설치할 수 있다는 거지. 진짜 접근 제어가 아니라 '아무도 모를 거야' 에 기대는 방식이야.

혼자 하는 개발자, tester 몇 명 있는 작은 오픈소스 프로젝트, 검색에 안 뜨면서 Chrome 자동 업데이트는 받고 싶은 사람한테 맞는 답이야.

길 2 — Workspace 전용 store

팀이 Google Workspace를 쓴다면, Chrome 관리 콘솔에서 그 도메인 사람들한테만 보이는 extension을 낼 수 있어. 제출한 게 사내 store로 들어가고, 도메인 안 사람들은 평범한 Web Store 처럼 보게 되고, 도메인 밖 사람들은 아예 못 봐.

좋은 점은 Workspace 계정으로 진짜 접근 제어가 걸리고, 자동 업데이트가 되고, 평소보다 설치 경고가 더 붙지도 않는다는 거야. 나쁜 점은 Workspace 관리자가 세팅을 해 줘야 하고, Workspace 비용이 들고, 도메인 밖 사람은 손도 못 댄다는 거고.

관리되는 Workspace 조직에서 domain 또는 trusted-tester 단위 접근 제어가 필요할 때 맞아. 사람 수가 아니라 관리 경계가 선택 기준이야.

길 3 — Group policy 강제 설치

Chrome은 Windows 면 레지스트리와 정책, Mac 이면 plist, Linux 면 managed preference를 통해 extension을 강제로 깔 수 있어. 관리자가 extension의 ID와 update URL을 적어 두면, Chrome이 조직 안 모든 관리형 프로필에 알아서 설치해. user는 chrome://extensions에서 그걸 볼 수는 있어도 지우지는 못해. 설치의 주인이 관리자거든.

좋은 점은 조직 단위로 잘게 제어할 수 있고, user가 아무것도 안 해도 깔리고, 권한 제한이랑 같이 걸 수 있다는 거야. 나쁜 점은 관리형 Chrome이 있어야 하고 (Workspace, Microsoft AD, Jamf 같은 것들), update URL이 Chrome이 읽는 형식의 .xml 이어야 하고, 그 .xml 이랑 버전별 .crx를 직접 호스팅해야 한다는 거고.

인원수와 상관없이 강제 설치나 중앙 통제 업데이트가 필요한 관리형 조직에 맞아.

직접 호스팅하는 update endpoint

직접 호스팅하는 길로 간다면 (Workspace 없는 3 번), Chrome이 갱신을 확인하러 들를 XML 주소가 필요해:

<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
  <app appid='your-extension-id'>
    <updatecheck codebase='https://your-cdn.example.com/clipdeck-1.0.0.crx' version='1.0.0' />
  </app>
</gupdate>

Chrome이 이 주소를 하루에 몇 번씩 들여다봐. 새 버전을 낼 때 XML의 versioncodebase를 새 .crx로 고쳐 두면, 다음에 들를 때 알아서 받아 가.

어느 길로 갈지

  1. 공개용이야? → 공개 Web Store.
  2. 팀이 Google Workspace를 쓰고 조직 안에서만 보이면 돼? → Workspace 전용 store.
  3. 작은 사적 팀이고 'URL 아는 사람은 깔 수 있음' 을 감수할 수 있어? → Unlisted Web Store.
  4. 관리형 Chrome을 쓰는 큰 조직이고 강제 설치랑 관리자 통제가 필요해? → Group policy + 직접 호스팅한 .crx + XML 주소.
  5. 혼자 쓰고 팀도 없어? → 그냥 developer mode + Load unpacked로 살아. 꼭 배포해야 한다는 법은 없어.
작게 조용히 뿌릴 거면 unlisted Web Store가 제일 만만한 기본값이야. 관리되는 팀이면 Workspace 전용, 조직 전체를 통제해야 하면 group policy + 직접 호스팅. 받아서 더블클릭하는 raw .crx sideload는 요즘 Chrome 에선 막다른 길이고.
Mac 에는 Gatekeeper 라는 변수가 하나 더 있어. macOS 에서는 정책으로 깔린 기업용 Chrome extension 이라도, 딸린 실행 파일이 Developer ID로 서명이 안 돼 있으면 Apple의 Gatekeeper가 걸고넘어질 수 있어. native messaging host 랑 얘기하는 extension을 강제 설치할 거면, 그 host 실행 파일부터 Apple 서명과 공증을 받아야 해. ClipDeck v1은 native messaging을 안 쓰니까 아직 해당은 없어. 나중에 쓰게 되면 그때 이 얘기가 돌아와.

Code

update.xml — 직접 호스팅하는 Chrome update endpoint·xml
<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
  <app appid='abcdefghijklmnopqrstuvwxyzabcdef'>
    <updatecheck
      codebase='https://cdn.example.com/clipdeck/clipdeck-1.0.0.crx'
      version='1.0.0' />
  </app>
</gupdate>
manifest.json — 직접 호스팅한 update endpoint를 가리키기·json
{
  "update_url": "https://cdn.example.com/clipdeck/update.xml"
}
Chrome policy.json — group policy로 강제 설치하기·json
{
  "ExtensionInstallForcelist": [
    "abcdefghijklmnopqrstuvwxyzabcdef;https://cdn.example.com/clipdeck/update.xml"
  ]
}

External links

Exercise

자기 상황에 맞는 길을 골라 봐. 혼자면 developer-mode unpacked로 그냥 살아 — 굳이 내보낼 필요 없어. 작은 사적 팀 (10 명 이하) 이면 unlisted Web Store로 가고, Lesson 3에서 해 본 제출 연습을 visibility만 Unlisted로 바꿔서 끝까지 해 봐. Workspace 팀이면 관리자한테 사내 등록이 가능한지 물어봐. 큰 조직이면 IT 부서가 extension 설치를 어떻게 다루는지 (아마 group policy의 ExtensionInstallForcelist 일 거야) 알아보고 ClipDeck을 허용 목록에 넣을 수 있는지 문의해 봐. 어느 길을 골랐든 이 질문에 답을 적어: 'v1.1을 냈을 때 user가 새 버전을 받으려면 뭘 해야 하지?' Web Store 쪽이면 답이 '아무것도 안 해도 됨' 이야. 직접 호스팅이면 XML을 고치는 일이 답에 들어가고. 그렇게 해서 실제로 감당할 수 있는 갱신 이야기가 나오는 길을 골라.
Hint
팀의 Chrome이 어떻게 관리되는지 모르겠으면, 동료한테 chrome://management 화면을 찍어 달라고 하는 게 제일 빠른 첫걸음이야 (Workspace로 관리되는 Chrome 이면 거기 조직 정보가 떠). 하루 안에 답을 못 얻으면 그냥 unlisted Web Store를 기본값으로 잡아. 세팅이 제일 싼 길이니까. Web Store의 $5는 한 번만 내는 돈이고, unlisted로 유지하는 비용은 0 이야. group policy가 이름이 그럴싸하다고 고르지는 마. 이름값만큼 관리 부담도 따라오고, 대부분의 팀한테는 과해.

Progress

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

댓글 0

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

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