Linux는 Chrome 사용자가 Chrome 웹 스토어 외부에 호스팅된 확장 프로그램을 설치할 수 있는 유일한 플랫폼입니다. 이 도움말에서는 범용 웹 서버에서 crx
파일을 패키징, 호스팅, 업데이트하는 방법을 설명합니다. Chrome 웹 스토어를 통해서만 확장 프로그램 또는 테마를 배포하는 경우 웹 스토어 호스팅 및 업데이트를 참고하세요.
패키지
확장 프로그램 및 테마는 .crx
파일로 제공됩니다. Chrome 개발자 대시보드를 통해 업로드하면 대시보드에서 crx
파일을 자동으로 만듭니다. 개인 서버에 게시된 경우 crx
파일을 로컬에서 만들거나 Chrome 웹 스토어에서 다운로드해야 합니다.
Chrome 웹 스토어에서 .crx 다운로드
확장 프로그램이 Chrome 웹 스토어에 호스팅된 경우 개발자 대시보드에서 .crx
파일을 다운로드할 수 있습니다. '내 등록정보'에서 확장 프로그램을 찾아 '추가 정보'를 클릭합니다. 팝업 창에서 파란색 main.crx
링크를 클릭하여 다운로드합니다.
다운로드한 파일은 개인 서버에 호스팅할 수 있습니다. 확장 프로그램의 콘텐츠가 Chrome 웹 스토어에서 서명되므로 확장 프로그램을 로컬에서 호스팅하는 가장 안전한 방법입니다. 이렇게 하면 잠재적인 공격과 조작을 감지하는 데 도움이 됩니다.
로컬에서 .crx 만들기
확장 프로그램 디렉터리는 확장 프로그램 관리 페이지에서 .crx
파일로 변환됩니다. 검색주소창에서 chrome://extensions/
로 이동하거나 Chrome 메뉴를 클릭하고 '도구 더보기' 위로 포인터를 가져간 다음 '확장 프로그램'을 선택합니다.
확장 프로그램 관리 페이지에서 개발자 모드 옆에 있는 전환 스위치를 클릭하여 개발자 모드를 사용 설정합니다. 그런 다음 PACK EXTENSION 버튼을 선택합니다.
확장 프로그램 루트 디렉터리 필드에 확장 프로그램 폴더의 경로를 지정한 다음 PACK EXTENSION 버튼을 클릭합니다. 최초 패키지의 경우 비공개 키 필드는 무시합니다.
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 헤더를 사용해야 합니다.
Google Chrome에서는 다음 중 하나라도 해당하는 경우 파일을 설치 가능한 것으로 간주합니다.
- 파일의 콘텐츠 유형이
application/x-chrome-extension
입니다. - 파일 확장자가
.crx
이고 다음 중 둘 다 참입니다.- HTTP 헤더
X-Content-Type-Options: nosniff
로 파일이 제공되지 않습니다. - 파일은 다음 콘텐츠 유형 중 하나로 게재됩니다.
- 빈 문자열
"text/plain"
"application/octet-stream"
"unknown/unknown"
"application/unknown"
"\*/\*"
- HTTP 헤더
설치 가능한 파일을 인식하지 못하는 가장 일반적인 이유는 서버에서 X-Content-Type-Options: nosniff
헤더를 전송하기 때문입니다. 두 번째로 일반적인 이유는 서버가 이전 목록에 없는 알 수 없는 콘텐츠 유형을 전송하기 때문입니다. HTTP 헤더 문제를 해결하려면 서버 구성을 변경하거나 다른 서버에서 .crx
파일을 호스팅해 보세요.
업데이트
브라우저는 몇 시간마다 설치된 확장 프로그램에서 업데이트 URL을 확인합니다. 각각에 대해 해당 URL에 업데이트 매니페스트 XML 파일을 찾도록 요청합니다.
- 업데이트 확인에서 반환되는 콘텐츠는 확장 프로그램의 최신 버전을 나열하는 업데이트 매니페스트 XML 문서입니다.
업데이트 매니페스트에 설치된 버전보다 최신 버전이 언급되면 브라우저는 새 버전을 다운로드하여 설치합니다. 수동 업데이트와 마찬가지로 새 .crx
파일은 현재 설치된 버전과 동일한 비공개 키로 서명되어야 합니다.
업데이트 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입니다.- version
- 클라이언트에서
codebase
로 지정된.crx
파일을 다운로드해야 하는지 결정하는 데 사용합니다. 이 값은.crx
파일의manifest.json
파일에 있는 '버전' 값과 일치해야 합니다.
업데이트 매니페스트 XML 파일에는 여러 <app>
요소를 포함하여 여러 확장 프로그램에 관한 정보가 포함될 수 있습니다.
테스트
기본 업데이트 확인 빈도는 몇 시간이지만 확장 프로그램 관리 페이지의 지금 확장 프로그램 업데이트 버튼을 사용하여 업데이트를 강제할 수 있습니다.
그러면 설치된 모든 확장 프로그램에 대한 검사가 시작됩니다.
고급 사용: 요청 매개변수
기본 자동 업데이트 메커니즘은 Apache와 같은 일반 웹 서버에 정적 XML 파일을 배치하고 새 확장 프로그램 버전이 출시될 때 해당 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: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- 버전: '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 자체는 자동 업데이트되지만, 대부분의 사용자층이 특정 새 버전으로 업데이트되기까지 며칠이 걸릴 수 있습니다. 특정 업데이트가 특정 버전 이상의 Google Chrome 버전에만 적용되도록 하려면 업데이트 응답의 <app>
요소에 'prodversionmin' 속성을 추가합니다.
<?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로 자동 업데이트됩니다.