web/etc

크롬 익스텐션 Autoupdating 번역.

qkqhxla1 2017. 2. 28. 22:09

원문 : https://developer.chrome.com/extensions/autoupdate


자동 업데이트.

개발자들은 본인이 개발한 익스텐션이나 앱들을 자동으로 업데이트하길 원합니다. 버그나 보안취약점을 고치고, 기능을 추가하고, 성능을 향상시키고 유저 인터페이스 등을 개선하기 위해서죠.


혹시 이미 Chrome Developer Dashboard를 이용해서 배포할줄 안다면, 더이상 안 읽어보셔도 됩니다. 왜냐하면 Chrome Developer Dashboard를 이용하면 크롬 웹스토어와 똑같이 앱을 업데이트하고 배포할수 있기 때문이죠. 


스토어말고 다른곳에서 호스팅하고 싶으면 계속 읽으세요. HostingPacking도 읽어야 할 겁니다.

주의 : M33이후로 윈도우 유저들은 크롬 웹 스토어에서만 익스텐션을 다운받을 수 있습니다. 여기를 보고 더 참조하세요.


이전에 웹스토어가 아닌 다른 곳에서도 익스텐션이 지원되었을때 업데이트 할수 있는 네이티브한 바이너리를 갖는 익스텐션을 만드는게 가능했습니다. 하지만 현재는 개발자가 컨트롤할 수 없는 크롬의 업데이트 메카니즘에 의해 업데이트되는 크롬 웹 스토어에 의해 호스팅되고 있습니다. 그러므로 익스텐션 개발자들은 NPAPI같은 네이티브한 바이너리에 의존성이 있는 익스텐션을 업데이트하는데 더 신중해야 합니다. 


살펴보기.

1. manifest파일은 업데이트 체크 위치를 가진 update_url이라는 필드를 가지고 있을 것입니다.

2. update manifest XML문서에 있는 최신 버전에서 콘텐츠가 다운로드받아져 업데이트됩니다.


매일 몇시간동안 브라우저는 설치된 익스텐션이나 앱이 업데이트가 있는지 확인합니다. 각각 하나씩 해당 url에 업데이트할만한 manifest XML파일이 있는지 요청을 보냅니다. 새 업데이트가 있으면 브라우저는 새 버전을 다운받습니다. 그리고 crx파일에서 현재 설치된 버전과 같은 키값을 가지고 있는지 확인합니다.


주의 : 유저의 프라이버시를 보호하기 위해 자동 업데이트 확인 정보 요청시 쿠키 등을 보내지 않고, 쿠키를 달라는 요청에도 무시합니다.


url업데이트하기.

혹시 본인의 익스텐션이나 앱을 호스팅하고 있다면 아래와 같은 manifest.json의 update_url필드를 살펴봐야 합니다.

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

manifest 업데이트하기.

업데이트된 manifest는 아래와 같은 형식의 XML형식의 문서를 받습니다.

<?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' />
  </app>
</gupdate>

이러한 구조는 구글의 업데이트 인프라를 빌려온 것입니다. 더 자세한 사항을 알고 싶으면 여기를 참조하세요. 익스텐션은 manifest의 <app>과 <updatecheck>를 업데이트하기 위해 아래를 사용합니다. 


appid

익스텐션 또는 앱의 아이디이며 Packaging에 소개된 대로 공개 키의 해쉬를 기반으로 만들어집니다. 익스텐션 페이지로 가서 익스텐션이나 크롬 앱의 id를 볼 수 있습니다. (chrome://extensions)


codebase

crx파일이 있는 url입니다.


version

codebase에 기술된 crx파일을 다운로드받아야 하는지 아닌지 결정합니다. crx파일 내부의 manifest.json의 version과 맞아야 합니다.


manifest XML파일을 업데이트하는것에 <app>인자로 다른 여러가지 익스텐션의 정보가 포함될 수 있습니다.


테스트.

몇시간마다 업데이트 체크를 합니다. 하지만 지금 익스텐션을 업데이트하라고 요청할 수 있습니다.


또다른 옵션은 요청 빈도를 늘리기 위해 --extensions-update-frequency command-line flag를 사용하는 겁니다. 예를 들어 매 45초마다 체크를 하기 위해 크롬을 아래처럼 실행하세요.


chrome.exe --extensions-update-frequency=45


위의 명령어가 설치된 익스텐션과 앱에 영향을 미치니 서버의 대역폭 등도 생각하세요. 아마도 테스트하는동안 테스트하는 앱 빼고는 잠시 전부 끄고 싶으실지도 모르겠는데, 테스트할때 이 옵션을 일반 브라우저와 같이 실행하면 안됩니다.


더 나아간 사용 : 인자를 이용한 요청.

기초적인 자동 업데이트 메카니즘은 서버에서 XML파일을 던져주면 이것을 이용해서 익스텐션을 업데이트하는 것입니다.


더 개발해본 개발자들은 요청 시에 인자를 보내서 더 조작하고 싶어질 지 모릅니다. 그럼 모든 익스텐션에 대해 같은 url로 업데이트 할수도 있고, static한 XML파일 대신 dynamic한 서버의 코드를 받아서 실행할 수도 있습니다.


요청의 인자는 아래처럼 줄 수 있습니다.


?x=<extension_data>


extension_data가 url로 인코딩된 형태입니다.


id=<id>&v=<version>


예를 들어 동일한 url에서 업데이트되는 두개의 익스텐션을 가지고 있다고 가정해봅시다.

서버 : http://test.com/extension_updates.php


extension 1.

ID: aaaaaaaaaaaaaaaaa

Version: "1.1"


extension 2.

ID: bbbbbbbbbbbbbbbbbbbbbb

Version: "0.4"


각각 익스텐션의 업데이트 요청은 아래와 같을 것이다.

  • http://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaa%26v%3D1.1
  • http://test.com/extension_updates.php?x=id%3Dbbbbbbbbbbbbbbbbb%26v%3D0.4

여러개의 요청은 한줄로 나열될 수 있다. 위의 예를 가져오면 아래처럼 한줄로 보낼 수 있다. 

http://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaa%26v%3D1.1&x=id%3Dbbbbbbbbbbbbbbbbb%26v%3D0.4

만약 url이 너무 길어서 GET으로 받을 수 있는 최대길이보다 길면 업데이트시 여러 번의 GET요청을 보낼것이다. 


미래에는 아마 여러번의 GET보다 POST바디에 한번에 인자들이 모여서 한번의 POST요청으로 끝날것이다.


더 나아간 사용 : 최소 브라우저 버전. 

익스텐션에 api를 더 추가하기 위해 특정 버전 이후로 동작하는 api를 사용하기 위해 브라우저 업데이트를 진행할수 있습니다. 크롬이 자동 업데이트되는동안 브라우저가 주어진 버전으로 업데이트 되기까지 몇일이 걸릴수 있습니다. 크롬에 업데이트를 적용하기 위해 manifest의 <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>

사용자가 크롬 3.0.193.0버전 이상을 사용하면 익스텐션의 버전을 2로 자동 업데이트함을 보증합니다.

'web > etc' 카테고리의 다른 글

크롬 익스텐션 Content Scripts 번역  (1) 2017.02.23
크롬 익스텐션 Overview 번역  (0) 2017.02.20
웹 브라우저 동작 원리  (0) 2017.02.17
크롬 익스텐션 Getting Started Tutorial 번역  (1) 2017.01.31