보안·코드 서명·컴플라이언스
Store signing·OTA code signing·secrets·runtime config 네 경계로 본 Expo 보안. expo-updates codesigning, EAS 변수 visibility, App Attest·Play Integrity, 릴리스 승인 체크리스트.
핵심 요약
- Expo 엔터프라이즈 보안은 Store signing(binary), OTA code signing(JS update), Secrets(자격 증명), Runtime config(tenant·flag) 네 경계로 나뉩니다.
- EAS Update code signing은 Production/Enterprise 플랜에서
expo-updates codesigning:generate·configure로 인증서를 발급하고 적용 전 서명을 검증합니다. - private key는 repo 밖에서 생성해 KMS·비밀번호 관리자에 보관하고, certificate는 repo에 두되 만료 전 binary rollout으로 교체합니다.
- EAS 환경 변수는 값별로 plain text·sensitive·secret visibility를 구분하고 Apple API key·Android service account JSON·signing key path는 secret으로 둡니다.
- App Integrity는 Play Integrity·DeviceCheck/App Attest, jailbreak/root 오탐 정책, certificate pinning rotation, deep link hijacking 방지를 threat model에 포함합니다.
보안 경계
Expo 엔터프라이즈 앱의 보안은 네 개의 서명·신뢰 경계로 나뉩니다.
| 경계 | 보호 대상 | Expo/EAS 표면 |
|---|---|---|
| Store signing | 앱 binary 무결성 | EAS Build credentials, App Store/Play signing |
| OTA code signing | JS update 무결성 | expo-updates code signing, EAS Update |
| Secrets | build·submit·backend 자격 증명 | EAS environment variables, CI secrets |
| Runtime config | tenant, API endpoint, feature flag | app config, MDM managed config, remote config |
EAS Update code signing
EAS Update code signing은 Production 또는 Enterprise 플랜에서 쓰며, update가 클라이언트에 적용되기 전에 앱에 내장된 certificate로 서명을 검증합니다.
npx expo-updates codesigning:generate \
--key-output-directory ../keys \
--certificate-output-directory certs \
--certificate-validity-duration-years 3 \
--certificate-common-name "Company Mobile"
npx expo-updates codesigning:configure \
--certificate-input-directory certs \
--key-input-directory ../keys운영 규칙:
- private key는 repo 밖에서 생성하고 KMS 또는 비밀번호 관리자에 보관합니다.
- certificate는 repo에 포함하되 만료 전 binary rollout으로 교체합니다.
- key rotation runbook에는 compromise, expiration, personnel offboarding 상황을 포함합니다.
- signed update 게시 권한은 release manager와 CI service account로 제한합니다.
EAS 환경 변수 visibility
| 값 | 권장 visibility | 주의 |
|---|---|---|
EXPO_PUBLIC_API_URL | plain text | 클라이언트 번들에 들어감 |
| Sentry DSN | plain text 또는 sensitive | public DSN이라도 환경별 분리 |
| Apple API key | secret | submit/build job 전용 |
| Android service account JSON | secret | 로그 출력 금지 |
| OTA signing private key path | secret | CI workspace에 임시 파일로만 materialize |
App Integrity
엔터프라이즈·금융·내부업무 앱은 다음 항목을 별도 threat model에 포함합니다.
- Android Play Integrity / iOS DeviceCheck 또는 App Attest 연계
- jailbreak/root 탐지의 오탐 정책
- MDM managed app configuration 검증
- certificate pinning 적용 범위와 rotation 계획
- deep link hijacking 방지를 위한 scheme·universal links 검증
릴리스 승인 체크리스트
- EAS Build credentials owner와 rotation 날짜 확인
- OTA code signing certificate 만료일 확인
- production EAS environment에서 secret 로그 노출 없음
- sourcemap·dSYM·mapping 파일 업로드 권한 분리
-
runtimeVersion변경이 필요한 native 변경을 OTA로 배포하지 않음 - rollback key와 certificate가 퇴사자 개인 계정에 묶여 있지 않음
EAS Update OTA 배포 전략
SDK 56 Hermes bytecode diff 기본값, 채널·브랜치 매핑, republish·embedded rollback, fingerprint runtimeVersion, 1·10·50·100% rollout gate로 엔터프라이즈 OTA를 운영하는 방법.
성능 모니터링·프로파일링
EAS Observe Open Beta로 cold/warm launch·TTI·TTR·bundle load를 수집하고, Hermes V1·JSI 경계를 실기기로 검증하며 P95 기준 rollout gate를 두는 프로덕션 성능 운영 체계.