패키지형 앱는 웹 자원 (HTML, CSS, JavaScript, 앱 매니페스토 등)을 Web 서버상에 두는 대신 모든 파일을 하나의 ZIP 파일에 정리한 오프라인 웹앱입니다. 패키지형 앱는 루트 디렉토리에 앱 매니페스토를 포함한 단순한 ZIP 파일입니다. 매니페스토에는 manifest.webapp
라는 파일명을 붙여야 합니다.
참고: 현재 (2013년 1월 시점) Firefox Marketplace는 Firefox OS 용 패키지형 앱만을 지원하고 있습니다.
패키지형 앱의 목적
패키지형 앱의 목적은 단말기의 보안상 민감한 API에 접근 할 수 있는 앱를 제공하기 좋은 방법을 제공하는 것입니다. 웹앱을 배포하는 스토어 (Firefox OS Marketplace 등)에 의해서 검증되어야 합니다. 스토어는 앱를 심사하고 조건을 충족했다고 판단하면, 암호를 사용해 그 ZIP 파일에 디지털 서명을 실시합니다. 이를 통해 잠재적인 보안, 개인 정보, 기능 문제에 관해서 신중한 심사를 했다는 보증을 앱의 사용자에게 제공할 수 있습니다.
패키지형 앱의 종류
패키지형 앱에는 3 가지 종류가 있습니다.
- 특별 권한 앱
-
특별 권한 앱은 특별한 프로세스를 거쳐 Firefox OS Marketplace에 의해 승인된 것입니다. 이것은 앱이 단말기의 보안상 민감한 API 에 접근를 필요로 하는 경우에, 사용자에 대해서 보다 높은 안전성을 제공하는 것을 목적으로 하고 있습니다. iOS 나 Android 등의 플랫폼 양식 전용으로 개발된 네이티브 앱와 같습니다. 개별 권한 앱에는 이하와 같은 특징이 있습니다.
- 코드 리뷰나 거기에 상당하는 심사를 거치고, 앱 스토어에 의해서 승인된다.
- 앱의 자원은 앱 스토어에 의해서 서명된다.
- 신뢰할 수 없는 내용에서는 접근 할 수 없는 특정의 센시티브인 API를 사용하는 것이 허가된다.
- Content Security Policy (CSP)를 강제당한다. 사용하는 CSP는 이하와 같습니다.
"default-src *; script-src 'self'; object-src 'none'; style-src 'self' 'unsafe-inline'"
- 보안에 관한 자세한 요건을 구비한다. 자세한 것은 보안 정보를 참조해 주십시오.
- 인증 앱
-
인정 앱는 스마트폰 상 전화나 시스템 설정 앱 등 중요한 시스템 기능을 대상으로 한 것입니다. 이 종류의 앱는 Firefox OS 단말상에서 중요한 기능을 사용합니다. 서드파티 앱 전용은 아니기 때문에 대부분의 앱 개발자는 이 종류 앱에 대해 신경쓸 필요는 없습니다. 인증 앱은 특별 권한앱과 유사한 패키지형 앱이나 단말의 모든 허가 설정이 묵시적이라는 점이 다릅니다. 즉, 사용자에 의한 명시적인 승인을 필요로 하지 않습니다. 인증 앱는 중요한 API를 사용할 때 묵시적인 승인을 얻으려면 OEM 혹은 통신사에 의해서 단말 마다 승인 해야 합니다. 이하는 인증 앱의 CSP 로, 특별 권한 앱의 CSP 와는 약간의 차이가 있습니다.
"default-src *; script-src 'self'; object-src 'none'; style-src 'self'"
이것은 인증 앱와 비교했을 경우, 특별 권한 앱의 CSP 보다 다소 완만한 구칙이 적용됩니다. 이 이유에 대해 자세하게 알고 싶다면 Default CSP policy와 Bug 768029를 참조해 주십시오. - 단순 패키지형 앱
- 단지 하나의 ZIP 파일에 패키지 한 원래의 앱를 작성하는 것도 가능합니다. Marketplace는 그러한 앱에 서명합니다만, 특별 권한 및 인증앱에 이용되는 특별한 인증 프로세스는 실행하지 않습니다. 이러한 단순한 패키지형 앱는 특정 Web API를 사용할 수 없습니다.
호스트형 앱과 차이점
패키지형 앱는 원래의 웹 사이트 형식의 Open Web Apps ( 「호스트형」앱)와 같은 기능을 가집니다만, 이하와 같은 몇 가지 차이가 있습니다.
- 인터넷 서비스 위치 없음: 호스트형 앱는 「인터넷 서비스 원 위치 마다 하나의 앱」라는 정책을 패키지형 앱에는 적용하지 않습니다.
- ZIP 파일내에서
app://<uuid></uuid>
라는 특별한 프로토콜이 사용됩니다. 예를 들면, 패키지형 앱로/index.html
라는 내용를 읽어들일 때는 실제로는 이하와 같은 URL를 읽어들이게 됩니다 (UUID는 앱 마다 다릅니다).app://550e8400-e29b-41d4-a716-446655440000/index.html
- 매니페스토 파일은
manifest.webapp
라는 파일명으로 해야합니다. - 자원은 ZIP 파일에서 접근 됩니다. ZIP 파일은 앱이 설치 된 단말에 저장됩니다.
installPackage()
라는 다른mozApps
함수로 설치 됩니다.- 모든 애플리케이션 내용에 특정 CSP로 강제합니다 (호스트형 앱도 CSP를 사용할 수 있습니다만 필수가 아닙니다).
- 원격 내용를 인 라인 프레임으로서 묻을 수 있으나, 내용은 특별 권한 API 에는 접근 하지 못하고, 기존 CSP 도 적용하지 않습니다.
- 앱의 새 버전을 받으려면 업데이트 프로세스가 있습니다. 호스트형 앱에는이 프로세스는 필요 없습니다.
패키지형 앱는 원래 호스팅형 앱와 같게, 웹 서버상의 데이타베이스로 접근 등 조작은 가능합니다.
민감한 Web API의 사용
악용되는 우려가 있는 Web API 도 있고, 이에 대한 사용 제어는 관리할 필요가 있습니다. 앱에서 접근 하고 싶은 모든 민감한 API에 대해 앱의 매니페스토안의 permissions
항목을 추가 해야 합니다.
일부 보안에 민감한 API는 호스트형 앱에서도 접근 할 수 있으나, 다른 API를 사용하려면 패키지형 앱 (특별권한·인증 앱)로 할 필요가 있습니다. 이 요건을 설명한 표가 앱의 허가 설정에 실려 있습니다.
패키지형 앱와 Firefox OS Marketplace
Firefox OS Marketplace는 패키지형 앱에 대해 호스트형 앱와는 다른 취급을 합니다. 패키지형 앱를 등록하는 경우, 그 ZIP 파일은 Marketplace의 서버상에 저장되어 패키지형 앱의 ZIP 파일에 포함되는 앱 매니페스토에 근거해 「미니 매니페스토」라고 불리는 새로운 매니페스토를 Marketplace가 생성합니다. 사용자가 앱를 설치 할 때, 그 미니 매니페스토가 installPackage()
함수에게 건내져서 앱의 설치을 합니다. 미니 매니페스토는 설치이나 업데이트를 위해서 생성되는 것으로, 앱의 실행시에는 사용하지 않습니다.
패키지형 앱의 설치 테스트
패키지형 앱의 설치을 로컬로 테스트하고 싶은 경우는 한 가지 방법이 있습니다. 아래 순서에 따르면, 로컬 네트워크상에 있는 웹 서버에서 단말에 패키지형 앱를 설치 할 수 있습니다. 개발 머신상에서 움직이고 있는 웹 서버에서도 상관하지 않습니다. 패키지형 앱의 설치가 어떻게 되는지 대략 알 수 있습니다.
필수 요건
- 웹 서버는 단말과 같은 네트워크상에 있어야 합니다. 또 로컬 네트워크에서 요청를 송신할 수 있어야 합니다.
- 단말은 Firefox OS를 실행하고 Wi-Fi에 접속하고 있어야 합니다.
- 아래 샘플 코드로 사용되어 있는 파일 경로를 여러분의 서버에 맞추어 편집합니다.
- 서버의 IP 주소를 취득하고 아래와 같이 고쳐 씁니다. 서버가 비표준 포토를 사용하고 있는 경우는 그것도 설명합니다. 비표준 포토의 IP 주소의 예는 이러한 것입니다.
10.10.12.1:8080
순서
패키지형 앱의 설치 페이지
<script> var manifestUrl = '/package.manifest'; var req = navigator.mozApps.installPackage(manifestUrl); req.onsuccess = function() { alert(this.result.origin); }; req.onerror = function() { alert(this.error.name); }; </script>Packaged app installation page
<script> var manifestUrl = '/package.manifest'; var req = navigator.mozApps.installPackage(manifestUrl); req.onsuccess = function() { alert(this.result.origin); }; req.onerror = function() { alert(this.error.name); }; </script>- 패키지형 앱의 ZIP 파일을 생성해
package.zip
라는 이름을 붙입니다. 이 파일에는 매니페스토를 포함해 앱의 resource file 모두가 포함되어 있습니다. package.manifest
라는 파일을 작성하고 이하와 같은 내용으로 저장합니다. 이것이 패키지형 앱의 설치용으로 사용되는 미니 매니페스토입니다. ZIP 파일내에 있는 앱의 주요 매니페스토가 아닙니다. 미니 매니페스토에 대한 자세한 정보는 미니 매니페스토의 항목을 참조해 주십시오.{ "name": "My App", "package_path": "https://<server-ip></server-ip>/package.zip", "version": "1.0" }
install.html
라는 이하와 같은 내용의 파일을 작성합니다. 이것에는 패키지형 앱를 호출하는 JavaScript와 성공 여부의 알림를 받는 콜백 함수가 포함됩니다.<html> <body> <p>Packaged app installation page</p> <script> var manifestUrl = '/package.manifest'; var req = navigator.mozApps.installPackage(manifestUrl); req.onsuccess = function() { alert(this.result.origin); }; req.onerror = function() { alert(this.error.name); }; </script> </body> </html>
package.zip
,package.manifest 및 install.html
를 웹 서버의 문서 루트 폴더에 복사합니다.- 단말상의 브라우저로
https://<server-ip></server-ip><서버 ip>/install.html
를 열어, 앱의 설치 확인을 승인합니다. 스크립트가 설치의 성공 여부를 표시합니다.
주의: 인증 앱의 API (상기 참조)를 테스트하고 싶은 경우는 앱를 설치 하고 싶은 단말 (Firefox OS) 상에서 「개발자 모드」를 사용 해 manifest.webapp
파일내에서 적절한 type
를 지정합니다.
미니 매니페스토의 항목
이하가 미니 매니페스토의 예입니다.
{ "name": "My app", "package_path": "https://thisdomaindoesnotexist.org/myapp.zip", "version": "1.0", "size": 172496, "release_notes": "First release", "locales": { "fr_FR": { "name": "Mon application" }, "se_SE": { "name": "Min balla app" } }, "icons": { "16": "/icons/16.png", "32": "/icons/32.png", "256": "/icons/256.png" } }
Firefox OS Marketplace가 여러분 앱용으로 미니 매니페스토를 생성하는 경우, 일부 항목에 대해서는 앱의 매니페스토에서 정보를 취득합니다. 그러한 항목에 대해서는 앱 매니페스토의 문서를 참조해 주십시오.미니 매니페스토 고유의 항목은 package_path
,release_notes
,size
입니다.
로컬로의 테스트에 관련하는 미니 매니페스토의 정보는 이하와 같습니다.
-
name
- (필수) 앱의 명칭.최장 128 문자.
-
package_path
- (필수) 앱의 ZIP 파일이 놓여진 URL.
-
version
- 앱의 버전.
-
size
- 앱의 ZIP 파일의 크기 (아르바이트).이것은 로컬로의 테스트에는 불필요합니다만, 설명해 두면 설치중에 진척 바가 표시됩니다.
-
release_notes
- 앱의이 버전에 관한 정보.Marketplace 에서는 등록 프로세스중에 표시되는 페이지로 입력된 정보가 사용됩니다.
-
locales
- 로컬라이즈의 정보.
-
icons
- 앱가 사용하는 아이콘.
패키지형 앱 업데이트
앱의 업데이트에 관한 정보는 앱의 업데이트을 참조해 주십시오.