Capgo의 라이브 업데이트 이해하기
Capacitor 라이브 업데이트 (OTA) 앱 내의 웹 번들을 교체하여, 스토어에 새로운 바이너리를 제출하지 않고도 JavaScript, HTML, CSS 변경 사항을 배포할 수 있습니다. Live Update는 Capacitor 앱의 가장 강력한 기능 중 하나로, 앱 스토어 심사 없이 실시간 업데이트를 가능하게 합니다. 이제 Capgo이 이 기능을 어떻게 구현하는지 자세히 살펴보겠습니다.
핵심 개념
Capacitor 앱은 크게 두 개의 레이어로 구성됩니다:
- 웹 계층: WebView에서 로드되는 HTML, CSS, JavaScript 파일
- 네이티브 계층: 플랫폼별 code (Android는 Java/Kotlin, iOS는 Swift)
Capgo의 live update 시스템은 웹 레이어 파일이 앱 바이너리에 컴파일되지 않는다는 점을 이용해, 런타임 시 웹 레이어를 교체하는 방식으로 작동합니다.
기술적 구현
Capacitor의 서버 경로
Capgo는 두 가지 중요한 경로를 관리합니다:
- 현재 서버 경로: 현재 WebView에 로드된 파일을 가리킴
- 다음 서버 경로: 앱 재시작 시 로드될 파일을 가리킴
Android 구현 방식
Android에서는 Capgo가 다음을 통해 경로를 관리합니다:
// Store next server path
private void setNextCapacitorServerPath(String path) {
SharedPreferences prefs = context.getSharedPreferences("CapWebViewSettings", Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("serverBasePath", path);
editor.apply();
}
// Update current path and reload
private void setCurrentCapacitorServerPath(String path) {
bridge.setServerBasePath(path);
bridge.reload();
}
iOS 구현 방식
iOS에서는 다음을 통해 경로를 관리합니다:
// Store next server path
private func setNextCapacitorServerPath(path: String) {
KeyValueStore.standard["serverBasePath"] = path
}
// Update current path
private func setCurrentCapacitorServerPath(path: String) {
bridge.viewController.setServerBasePath(path: path)
}
보안 조치
Capgo는 종단간 암호화(E2EE)를 통해 군사급 보안을 구현하여, 개발부터 배포까지 앱 업데이트의 완전한 보안을 보장합니다. 당사의 암호화 시스템은 기존의 code 서명을 넘어 진정한 제로 지식(zero-knowledge) 보안을 제공합니다.
종단간 암호화 아키텍처
-
종단간 암호화 (E2EE): 모든 업데이트 번들은 개발 환경을 떠나기 전 AES-256-GCM 방식으로 암호화됩니다. 이 군사급 암호화는 전체 전달 과정에서 앱 업데이트의 프라이버시와 보안을 완벽하게 유지합니다.
-
Zero-Knowledge 아키텍처: 업데이트에 서명만 하는 다른 OTA 업데이트 솔루션과 달리, Capgo은 진정한 Zero-Knowledge 암호화를 사용합니다. 즉:
- 업데이트 콘텐츠는 업로드 전 암호화됩니다
- Capgo 서버는 암호화된 데이터만 저장합니다
- 복호화는 오직 최종 사용자 기기에서만 이루어집니다
- 어떠한 중간 단계에서도 업데이트 콘텐츠에 접근할 수 없습니다
-
안전한 키 관리:
- 암호화 키는 CI/CD 환경에서 생성 및 안전하게 저장됩니다
- 개인 키는 Capgo 서버에 절대 전달되지 않습니다
- 앱 버전마다 고유한 암호화 키를 사용할 수 있습니다
- 보안 강화를 위한 키 로테이션 지원
상세 가이드에서 암호화 시스템에 대해 더 자세히 알아보세요: Capgo Live Updates의 종단간 암호화(E2EE)
업데이트 보안 프로세스
-
업로드 전 암호화:
- CI/CD 파이프라인 단계에서 업데이트 암호화
- 각 파일별 개별 암호화 적용
- 완벽한 프라이버시를 위한 메타데이터 암호화
-
보안 스토리지:
- 암호화된 번들은 Capgo 글로벌 CDN에 저장
- 평문 데이터는 서버에 절대 저장되지 않음
- 서버가 침해되더라도 데이터는 안전하게 보호됨
-
안전한 전송:
- 암호화된 채널을 통한 업데이트 전송
- 각 앱 인스턴스에서 암호화 무결성 검증
- 복호화 실패 시 자동 재시도 메커니즘
-
클라이언트 측 보안:
- 설치 전 업데이트 검증 수행
- 복호화 실패 시 자동 롤백 실행
- 앱 보호 저장소 내 안전한 키 저장
이러한 종합적인 보안 접근 방식을 통해 앱 업데이트를 다음 위협으로부터 보호합니다:
- 중간자 공격 (Man-in-the-middle)
- 서버 측 침해 사고
- 무단 수정
- 재전송 공격 (Replay attacks)
- 콘텐츠 변조
업데이트 라이프사이클
Capgo의 업데이트 프로세스는 기본적으로 자동화되도록 설계되었습니다. 자동 프로세스의 작동 방식은 다음과 같습니다:
1. 자동 업데이트 확인
플러그인은 다음과 같은 상황에서 자동으로 업데이트를 확인합니다:
- 앱 시작 시
이 동작은 다음 autoUpdate 설정으로 제어됩니다:
// capacitor.config.json
{
"plugins": {
"CapacitorUpdater": {
"autoUpdate": true // Enable automatic updates
}
}
}
또한 다음을 통해 수동으로 확인할 수도 있습니다: getLatest()
2. 자동 다운로드
새 버전을 감지했을 때, autoUpdate 이 활성화되어 있다면:
- 다운로드가 자동으로 시작됩니다
- 진행 상황은 내부적으로 추적됩니다
- 다운로드 실패 시 앱을 열 때마다 자동 재시도
- 성공적으로 다운로드된 파일은 앱 스토리지에 저장됩니다
다음 이벤트를 통해 이 프로세스를 모니터링할 수 있습니다:
CapacitorUpdater.addListener('download', (info: DownloadEvent) => {
console.log('Auto-download progress:', info.percent);
});
CapacitorUpdater.addListener('downloadComplete', (info: DownloadCompleteEvent) => {
console.log('Auto-download complete:', info.bundle);
});
3. 자동 설치
설치 시점은 설정에 따라 달라집니다:
// capacitor.config.json
{
"plugins": {
"CapacitorUpdater": {
"autoUpdate": true,
"directUpdate": false // install update on app backgrounding
"resetWhenUpdate": true, // reset live updates on native update (true by default)
"autoDeleteFailed": true, // Auto cleanup failed updates (true by default)
"autoDeletePrevious": true // Auto cleanup old versions (true by default)
}
}
}
설치는 다음 조건에서 실행됩니다:
- 다음 조건일 경우 즉시 실행:
directUpdate이 true인 경우 - 다음 조건일 경우 앱 백그라운드 전환 시 실행:
directUpdate이 false인 경우 - 설치 실패 시 자동 롤백
플러그인이 스토리지도 자동으로 관리합니다:
- 실패한 업데이트를 삭제합니다 (조건:)
autoDeleteFailedtrue인 경우 - 이전 버전을 정리합니다 (조건:)
autoDeletePrevioustrue인 경우
업데이트 지연 설정
지연 조건을 사용하여 업데이트 설치 시점을 제어할 수 있습니다:
// Delay until app goes to background
await CapacitorUpdater.setDelay({
kind: 'background'
});
// Delay until specific date
await CapacitorUpdater.setDelay({
kind: 'date',
value: '2024-03-20T10:00:00.000Z'
});
// Delay until next native version
await CapacitorUpdater.setDelay({
kind: 'nativeVersion'
});
// Multiple conditions
await CapacitorUpdater.setMultiDelay({
delayConditions: [
{
kind: 'background'
},
{
kind: 'date',
value: '2024-03-20T10:00:00.000Z'
}
]
});
사용 가능한 지연 조건:
- background: 앱이 백그라운드로 전환될 때 설치
- date: 특정 날짜/시간 이후에 설치
- nativeVersion: 다음 Native Build 업데이트 후 설치
- kill: 앱 종료 후 설치
다음 상황에서 유용합니다:
- 사용량이 적은 시간대에 업데이트 예약
- 사용자 활동에 맞춰 업데이트 조정
- 매끄러운 업데이트 경험 보장
- 중요 작업 중 중단 방지
업데이트 상태
자동 프로세스 진행 중, bundle은 다음 상태를 거칩니다:
- 다운로드 중: 다운로드 중
- 대기 중: 다운로드 완료, 설치 대기 중
- 성공: 업데이트 설치 및 활성화됨
- 오류: 업데이트 실패 (자동 롤백 실행)
스토어 규정 준수
Apple App Store ✅
Live Updates는 Apple App Store 정책을 완벽히 준수합니다. Apple Developer Program 라이선스 계약에 명시된 내용은 다음과 같습니다:
“해석된 code는 애플리케이션에 다운로드될 수 있지만, 해당 code이 다음 조건을 충족하는 경우에만 가능합니다: (a) App Store에 제출된 애플리케이션의 의도된 목적 및 광고된 목적과 일치하지 않는 기능이나 동작을 제공해 애플리케이션의 주요 목적을 변경하지 않아야 하며, (b) 다른 code 또는 애플리케이션을 위한 스토어나 스토어프론트를 만들지 않아야 하고, (c) OS의 서명, 샌드박스 또는 기타 보안 기능을 우회하지 않아야 합니다.”
Capgo 업데이트는 플랫폼의 모든 보안 경계를 준수하며 웹 레이어만 수정합니다.
Google Play Store ✅
Live Updates는 Google Play 정책을 준수합니다. 특히 '기기 및 네트워크 오용' 정책에 따르면 다음과 같습니다:
“이 제한은 가상 머신이나 인터프리터에서 실행되는 code에는 적용되지 않습니다. 단, 이들 중 하나가 Android API에 간접적으로 접근할 수 있는 경우(예: webview 또는 브라우저의 JavaScript)에 한합니다.”
Capgo는 WebView 콘텐츠만 업데이트하므로, 이러한 허용 가이드라인에 부합합니다.
모범 사례
- 단계적 롤아웃: 업데이트를 단계적으로 배포
- 버전 관리: 배포된 모든 버전 추적
- Rollback 지원: 문제 발생 시 신속한 복구
- Delta Update 방식: 변경된 파일만 다운로드
Live Updates를 사용해야 하는 경우
이럴 때 사용하세요:
- 버그 수정
- UI 개선
- 콘텐츠 업데이트
- 기능 토글
이럴 때는 적합하지 않습니다:
- Native code 변경 사항
- 메이저 버전 업데이트
- Native 변경이 필요한 보안 패치
Capgo의 Live Updates 작동 원리 계속 보기
사용 중인 경우 Capgo의 Live Updates 작동 원리 네이티브 플러그인 작업을 계획하려면, 이를 연결하세요: Capgo 플러그인 디렉토리 Capgo 플러그인 디렉토리의 제품 워크플로우를 보려면, Capgo 제공 Capacitor 플러그인 Capgo 제공 Capacitor 플러그인의 구현 세부 사항을 보려면, 플러그인 추가 및 업데이트 플러그인 추가 또는 업데이트의 구현 상세 내용은 Ionic Enterprise 플러그인 대안 Ionic Enterprise Plugin Alternatives의 제품 워크플로우와 Capgo Native Build Capgo Native Builds의 제품 워크플로우를 위해.