Linux용 자체 호스트

Linux는 Chrome 사용자가 Chrome 웹 스토어 외부에서 호스팅되는 확장 프로그램을 설치할 수 있는 유일한 플랫폼입니다. 이 도움말에서는 범용 웹 서버에서 crx 파일을 패키징, 호스팅, 업데이트하는 방법을 설명합니다. Chrome 웹 스토어를 통해서만 확장 프로그램이나 테마를 배포하는 경우 웹 스토어 호스팅 및 업데이트를 참고하세요.

패키지

확장 프로그램 및 테마는 .crx 파일로 제공됩니다. Chrome 개발자 대시보드를 통해 업로드하면 대시보드에서 crx 파일이 자동으로 생성됩니다. 개인 서버에 게시한 경우 crx 파일을 로컬에서 만들거나 Chrome 웹 스토어에서 다운로드해야 합니다.

Chrome 웹 스토어에서 .crx 다운로드

확장 프로그램이 Chrome 웹 스토어에 호스팅된 경우 개발자 대시보드에서 .crx 파일을 다운로드할 수 있습니다. '내 등록정보' 아래에서 확장 프로그램을 찾아 '추가 정보'를 클릭합니다. 팝업 창에서 파란색 main.crx 링크를 클릭하여 다운로드합니다.

개발자 대시보드에서 .crx 다운로드

다운로드한 파일은 개인 서버에서 호스팅할 수 있습니다. 이 방법은 Chrome 웹 스토어에서 확장 프로그램의 콘텐츠에 서명하므로 로컬에서 확장 프로그램을 호스팅하는 가장 안전한 방법입니다. 이를 통해 잠재적인 공격과 조작을 감지할 수 있습니다.

로컬에서 .crx 만들기

확장 프로그램 디렉터리는 확장 프로그램 관리 페이지에서 .crx 파일로 변환됩니다. 검색주소창에서 chrome://extensions/로 이동하거나 Chrome 메뉴를 클릭하고 포인터를 '도구 더보기' 위로 가져간 후 '확장 프로그램'을 선택합니다.

확장 프로그램 관리 페이지에서 개발자 모드 옆에 있는 전환 스위치를 클릭하여 개발자 모드를 사용 설정합니다. 그런 다음 광고 확장 추가 버튼을 선택합니다.

개발자 모드를 선택한 후 확장 프로그램 패키지를 클릭합니다.

확장 프로그램 루트 디렉터리 필드에 확장 프로그램 폴더 경로를 지정한 후 확장 프로그램 압축 버튼을 클릭합니다. 최초 패키지의 경우 비공개 키 필드는 무시합니다.

확장 프로그램 경로를 지정한 다음 '확장 프로그램 압축'을 클릭합니다.

Chrome은 확장 프로그램의 비공개 키가 포함된 .crx 파일과 .pem 파일, 이렇게 두 개의 파일을 만듭니다.

패키지화된 확장 파일

비공개 키를 잃어버리지 마세요. .pem 파일은 안전한 장소에 보관해야 합니다. 확장 프로그램을 업데이트하는 데 필요합니다.

.crx 패키지 업데이트

manifest.json에서 버전 번호를 늘려 확장 프로그램의 .crx 파일을 업데이트합니다.

{
  ...
  "version": "1.5",
  ...
  }
}
{
  ...
  "version": "1.6",
  ...
  }
}

확장 프로그램 관리 페이지로 돌아가서 확장 프로그램 압축 버튼을 클릭합니다. 확장 프로그램 디렉터리의 경로와 비공개 키의 위치를 지정합니다.

확장 프로그램 파일 업데이트 중

업데이트된 패키지 확장 프로그램의 경로가 페이지에 표시됩니다.

확장 프로그램 파일 업데이트 중

명령줄을 통해 패키징

chrome.exe를 호출하여 명령줄에서 확장 프로그램을 패키징합니다. --pack-extension 플래그를 사용하여 확장 프로그램 폴더의 위치를 지정하고 --pack-extension-key 플래그를 사용하여 확장 프로그램의 비공개 키 파일의 위치를 지정합니다.

chrome.exe --pack-extension=C:\myext --pack-extension-key=C:\myext.pem

호스트

.crx 파일을 호스팅하는 서버는 적절한 HTTP 헤더를 사용하여 사용자가 링크를 클릭하여 확장 프로그램을 설치할 수 있도록 해야 합니다.

Chrome은 다음 중 하나에 해당하는 경우 파일을 설치할 수 있는 것으로 간주합니다.

  • 파일의 콘텐츠 유형은 application/x-chrome-extension입니다.
  • 파일 서픽스가 .crx이고 다음 사항이 모두 true입니다.
    • 파일이 HTTP 헤더 X-Content-Type-Options: nosniff와 함께 제공되지 않습니다.
    • 파일은 다음 콘텐츠 유형 중 하나로 제공됩니다.
    • 빈 문자열
    • "text/plain"
    • "application/octet-stream"
    • "unknown/unknown"
    • "application/unknown"
    • "\*/\*"

설치 가능한 파일을 인식하지 못하는 가장 일반적인 이유는 서버가 헤더 X-Content-Type-Options: nosniff를 전송하기 때문입니다. 두 번째로 가장 일반적인 이유는 서버가 이전 목록에 없는 알 수 없는 콘텐츠 유형을 전송하기 때문입니다. HTTP 헤더 문제를 해결하려면 서버 구성을 변경하거나 다른 서버에서 .crx 파일을 호스팅해 보세요.

업데이트

브라우저에서는 몇 시간마다 설치된 확장 프로그램에 업데이트 URL이 있는지 확인합니다. 각 객체에 대해 해당 URL에 요청을 보내 업데이트 매니페스트 XML 파일을 찾습니다.

  • 업데이트 검사에서 반환되는 콘텐츠는 확장 프로그램의 최신 버전을 나열하는 업데이트 매니페스트 XML 문서입니다.

업데이트 매니페스트에 설치된 버전보다 최신 버전이 언급되면 브라우저가 새 버전을 다운로드하여 설치합니다. 수동 업데이트와 마찬가지로 새 .crx 파일은 현재 설치된 버전과 동일한 비공개 키로 서명해야 합니다.

참고: 사용자 개인 정보 보호를 위해 Chrome은 자동 업데이트 매니페스트 요청이 포함된 쿠키 헤더를 전송하지 않으며 이러한 요청에 대한 응답에서 모든 Set-Cookie 헤더를 무시합니다.

URL 업데이트

Chrome 웹 스토어 외부의 서버에서 호스팅되는 확장 프로그램은 manifest.json 파일에 update_url 필드를 포함해야 합니다.

{
  "name": "My extension",
  ...
  "update_url": "https://myhost.com/mytestextension/updates.xml",
  ...
}

매니페스트 업데이트

서버에서 반환하는 업데이트 매니페스트는 XML 문서여야 합니다.

<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
  <app appid='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'>
    <updatecheck codebase='https://myhost.com/mytestextension/mte_v2.crx' version='2.0' />
  </app>
</gupdate>

이 XML 형식은 Google의 업데이트 인프라인 Omaha에서 사용하는 형식을 차용한 것입니다. 확장 프로그램 시스템은 업데이트 매니페스트의 <app><updatecheck> 요소에 다음 속성을 사용합니다.

appid
확장 프로그램 ID는 패키징에 설명된 대로 공개 키의 해시를 기반으로 생성됩니다. 확장 프로그램의 ID는 확장 프로그램 관리 페이지에 표시됩니다.
코드베이스
.crx 파일의 HTTPS URL입니다.
버전
클라이언트에서 codebase로 지정된 .crx 파일을 다운로드해야 하는지 결정하는 데 사용됩니다. .crx 파일의 manifest.json 파일에 있는 'version'의 값과 일치해야 합니다.

업데이트 매니페스트 XML 파일에는 여러 <app> 요소를 포함하여 여러 확장자에 관한 정보가 포함될 수 있습니다.

테스트

기본 업데이트 확인 빈도는 몇 시간이지만 확장 프로그램 관리 페이지의 지금 확장 프로그램 업데이트 버튼을 사용하여 강제로 업데이트할 수 있습니다.

지금 확장 프로그램 업데이트

이렇게 하면 설치된 모든 확장 프로그램의 검사가 시작됩니다.

고급 사용법: 요청 매개변수

기본 자동 업데이트 메커니즘은 서버 측 작업이 간단하게 Apache와 같은 일반 웹 서버에 배치되고 새 확장 프로그램 버전이 출시될 때 XML 파일을 업데이트하는 것만큼 쉽게 작동하도록 설계되었습니다.

여러 확장 프로그램을 호스팅하는 개발자는 업데이트 요청에서 확장 프로그램 ID와 버전을 나타내는 요청 매개변수를 확인할 수 있습니다. 이러한 매개변수를 포함하면 정적 XML 파일 대신 동적 서버 측 코드를 실행하는 동일한 URL에서 확장 프로그램을 업데이트할 수 있습니다.

요청 매개변수의 형식은 다음과 같습니다.

?x=EXTENSION_DATA

여기서 EXTENSION_DATA는 다음과 같은 형식의 URL 인코딩된 문자열입니다.

id=EXTENSION_ID&v=EXTENSION_VERSION

예를 들어 두 개의 확장 프로그램이 동일한 업데이트 URL (https://test.com/extension_updates.php)을 가리킵니다.

  • 확장 프로그램 1
    • ID: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
    • 버전: '1.1'
  • 확장 프로그램 2
    • ID: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
    • 버전: '0.4'

각 개별 확장 프로그램을 업데이트하는 요청은

https://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1

https://test.com/extension_updates.php?x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4

고유한 업데이트 URL마다 하나의 요청에 여러 개의 광고 확장을 표시할 수 있습니다. 이전 예에서 사용자가 두 확장 프로그램을 모두 설치한 경우 두 요청이 단일 요청으로 병합됩니다.

https://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1&x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4

동일한 업데이트 URL을 사용하는 설치된 확장 프로그램 수가 GET 요청 URL이 너무 길면 (2,000자 이상) 업데이트 확인은 필요에 따라 추가 GET 요청을 실행합니다.

고급 사용: 최소 브라우저 버전

확장 프로그램 시스템에 더 많은 API가 추가되면 최신 버전의 브라우저에서만 작동하는 확장 프로그램의 업데이트된 버전이 출시될 수 있습니다. Chrome 자체는 자동 업데이트되지만, 대부분의 사용자층이 새 버전으로 업데이트되려면 며칠이 걸릴 수 있습니다. 특정 업데이트가 특정 버전 이상의 Chrome 버전에만 적용되도록 하려면 'prodversionmin' 속성을 업데이트 응답의 <app> 요소에 추가합니다.

<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
  <app appid='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'>
    <updatecheck codebase='http://myhost.com/mytestextension/mte_v2.crx' version='2.0' prodversionmin='3.0.193.0'/>
  </app>
</gupdate>

이렇게 하면 사용자가 Chrome 3.0.193.0 이상을 실행하는 경우에만 버전 2로 자동 업데이트됩니다.