본문 바로가기

Capgo에서 Live Updates가 작동하는 방식

Capgo의 라이브 업데이트 기술 구현 방식을 심층 분석하고, iOS와 Android에서 내부적으로 어떻게 작동하는지 알아봅니다.

'Capgo의 Live Updates 작동 방식' Capgo 블로그 일러스트

Capgo의 라이브 업데이트 이해하기

Capacitor Live Updates (OTA) 앱 내부의 웹 번들을 교체해 스토어에 새 바이너리를 제출하지 않고도 JavaScript, HTML, CSS 변경 사항을 배포할 수 있습니다. 라이브 업데이트는 Capacitor 앱의 가장 강력한 기능 중 하나로, 앱 스토어 제출 없이 실시간 업데이트를 가능하게 합니다. Capgo이 이 기능을 어떻게 구현하는지 자세히 살펴보겠습니다.

핵심 개념

Capacitor 앱은 크게 두 개의 레이어로 구성됩니다:

  1. 웹 레이어: WebView에서 로드되는 HTML, CSS, JavaScript 파일을 포함합니다.
  2. 네이티브 레이어: 플랫폼별 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는 개발부터 배포까지 앱 업데이트가 완전히 안전하게 유지되도록 종단 간 암호화를 통해 군용 등급의 보안을 구현합니다. 우리의 암호화 시스템은 전통적인 code 서명을 넘어 진정한 제로 지식 보안을 제공합니다.

종단 간 암호화 아키텍처

  1. 종단 간 암호화 (E2EE): 모든 업데이트 번들은 개발 환경을 떠나기 전에 AES-256-GCM 암호화를 사용하여 암호화됩니다. 이 군용 등급의 암호화는 전체 전달 과정에서 앱 업데이트가 완전히 비공개되고 안전하게 유지되도록 보장합니다.

  2. Zero-Knowledge 아키텍처: 업데이트에 서명만 하는 다른 OTA 업데이트 솔루션과 달리, Capgo은 진정한 Zero-Knowledge 암호화를 사용합니다. 즉:

    • 업데이트 콘텐츠는 업로드 전에 암호화됩니다
    • Capgo 서버는 암호화된 데이터만 저장합니다
    • 복호화는 오직 최종 사용자 기기에서만 이루어집니다
    • 어떤 중간자도 업데이트 콘텐츠에 접근할 수 없습니다
  3. 안전한 키 관리:

    • 암호화 키는 CI/CD 환경에서 생성되고 안전하게 저장됩니다
    • 개인 키는 Capgo 서버에 절대 저장되지 않습니다
    • 앱 버전마다 고유한 암호화 키를 사용할 수 있습니다
    • 보안 강화를 위한 키 로테이션 지원

자세한 가이드에서 암호화 시스템에 대해 더 알아보세요: Capgo Live Updates의 종단 간 암호화

업데이트 보안 프로세스

  1. 업로드 전 암호화:

    • 업데이트는 CI/CD 파이프라인에서 암호화됩니다
    • 각 파일은 개별적으로 암호화됩니다
    • 완전한 프라이버시를 위해 메타데이터도 암호화됩니다
  2. 보안 스토리지:

    • 암호화된 번들은 Capgo의 글로벌 CDN에 저장됩니다
    • 평문 데이터는 당사 서버에 절대 저장되지 않습니다
    • 서버가 침해되더라도 데이터는 안전하게 보호됩니다
  3. 안전한 전송:

    • 업데이트는 암호화된 채널을 통해 전송됩니다
    • 각 앱 인스턴스가 암호화 무결성을 검증합니다
    • 복호화 실패 시 자동 재시도 메커니즘
  4. 클라이언트 측 보안:

    • 설치 전에 업데이트가 검증됩니다
    • 복호화 실패 시 자동 롤백
    • 앱 보호 저장소에 안전한 키 저장

이 포괄적인 보안 접근 방식은 앱 업데이트가 다음으로부터 보호되도록 보장합니다:

  • MITM(중간자) 공격
  • 서버 측 침해
  • 무단 수정
  • 리플레이 공격
  • 콘텐츠 변조

업데이트 라이프사이클

Capgo의 업데이트 프로세스는 기본적으로 자동화되어 있습니다. 자동 프로세스 작동 방식은 다음과 같습니다:

1. 자동 업데이트 확인

플러그인은 다음 상황에서 자동으로 업데이트를 확인합니다:

  • 앱 시작 시

이 동작은 다음 설정으로 제어됩니다: autoUpdate 설정:

// capacitor.config.json
{
  "plugins": {
    "CapacitorUpdater": {
      "autoUpdate": true // Enable automatic updates
    }
  }
}

또한 다음 명령어로 수동으로 확인할 수 있습니다: getLatest()

2. 자동 다운로드

새 버전이 감지되면, 다음이 활성화되어 있으면: autoUpdate 활성화 시:

  1. 다운로드가 자동으로 시작됩니다
  2. 진행 상황은 내부에서 추적됩니다
  3. 다운로드 실패 시 앱을 열 때마다 자동 재시도됩니다
  4. 다운로드 성공 시 앱 스토리지에 저장됩니다

다음 이벤트를 통해 이 과정을 모니터링할 수 있습니다:

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인 경우
  • 설치 실패 시 자동 롤백

플러그인은 스토리지도 자동으로 관리합니다:

  • 다음 조건일 때 실패한 업데이트 삭제: autoDeleteFailed true인 경우
  • 다음 조건일 때 이전 버전 정리: autoDeletePrevious true인 경우

업데이트 지연

지연 조건을 사용하여 업데이트 설치 시점을 제어할 수 있습니다:

// 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: 다음 네이티브 업데이트 후 설치
  • kill: 앱 종료 후 설치

다음 상황에서 유용합니다:

  • 사용량이 적은 시간대에 업데이트 예약
  • 사용자 활동에 맞춰 업데이트 조정
  • 원활한 업데이트 경험 보장
  • 중요 작업 중 중단 방지

업데이트 상태

자동 프로세스 진행 중 bundle은 다음 상태를 거칩니다:

  1. 다운로드 중: 다운로드 진행 중
  2. 대기 중: 다운로드 완료, 설치 대기 중
  3. 성공: 업데이트 설치 및 활성화됨
  4. 오류: 업데이트 실패 (자동 롤백 트리거)

스토어 규정 준수

Apple App Store ✅

Live Updates는 Apple App Store 정책에 완전히 부합합니다. Apple Developer Program License Agreement에 명시된 바와 같이:

“해석된 code는 Application에 다운로드될 수 있지만, 해당 code이 다음을 충족하는 경우에만 가능합니다: (a) App Store에 제출된 앱의 의도된 목적 및 광고된 목적과 일치하지 않는 기능이나 기능성을 제공함으로써 Application의 주요 목적을 변경하지 않아야 하며, (b) 다른 code 또는 애플리케이션을 위한 스토어나 스토어프론트를 만들지 않아야 하고, (c) OS의 signing, sandbox 또는 기타 보안 기능을 우회하지 않아야 합니다.”

Capgo 업데이트는 모든 플랫폼 보안 경계를 준수하면서 웹 레이어만 수정합니다.

Google Play 스토어 ✅

Live Updates는 Google Play 정책을 준수합니다. 특히 '기기 및 네트워크 악용' 정책에는 다음과 같이 명시되어 있습니다:

“이 제한은 가상 머신 또는 인터프리터에서 실행되는 code에는 적용되지 않습니다. 이때 가상 머신 또는 인터프리터가 Android API에 간접 액세스를 제공하는 경우(예: WebView 또는 브라우저의 JavaScript)가 해당됩니다.”

Capgo는 WebView 콘텐츠만 업데이트하므로, 이러한 허용 가이드라인에 부합합니다.

모범 사례

  1. 단계적 배포(Phased Rollouts): 업데이트를 단계적으로 배포
  2. 버전 관리: 배포된 모든 버전 추적
  3. Rollback 지원: 문제 발생 시 신속한 복구
  4. Delta 업데이트: 변경된 파일만 다운로드

Live Update 사용 시점

이런 경우에 적합:

  • 버그 수정
  • UI 개선
  • 콘텐츠 업데이트
  • 기능 토글

적합하지 않은 경우:

  • 네이티브 code 변경
  • 메이저 버전 업데이트
  • 네이티브 변경이 필요한 보안 패치

Capgo의 Live Update 작동 원리에서 계속

사용 중이라면 Capgo에서 Live Updates가 작동하는 방식 네이티브 플러그인 작업을 계획하려면, 이를 다음 항목과 연결하세요: Capgo 플러그인 디렉토리 Capgo Plugin Directory의 제품 워크플로우에 맞춰, Capgo의 Capacitor 플러그인 Capgo의 Capacitor 플러그인 구현 상세 내용에 대해서는, 플러그인 추가 또는 업데이트 플러그인 추가 또는 업데이트의 구현 세부 사항은, Ionic Enterprise 플러그인 대안 Ionic Enterprise 플러그인 대안의 제품 워크플로우와, Capgo Native Build Capgo Native Builds의 제품 워크플로우를 위해.

Capacitor 앱용 Live updates

웹 레이어 버그가 라이브 상태라면, 앱 스토어 승인을 며칠씩 기다리지 말고 Capgo를 통해 수정 사항을 배포하세요. 네이티브 변경 사항은 정상 리뷰 절차를 그대로 따르는 반면, 사용자는 백그라운드에서 업데이트를 받습니다.

블로그 최신 글

Capgo는 정말 프로페셔널한 모바일 앱을 만드는 데 필요한 최고의 인사이트를 제공합니다.