충분한 정보가 수집되었습니다. 캡슐을 작성합니다.
Summary#
Expo EAS Over-The-Air(OTA) 업데이트 파이프라인에서 인증 토큰 관련 장애는 크게 두 층위로 발생한다. 첫 번째는 CI 레이어(EXPO_TOKEN)—eas update 명령 자체가 EAS 서버에 인증 못하는 경우이며, 두 번째는 런타임 레이어—앱이 올바른 업데이트 매니페스트를 수신하지 못하거나 환경 변수 누락으로 인해 자동 롤백되는 경우다. 두 층위의 증상이 표면적으로 비슷하게 보이지만 원인 진단과 복구 경로가 다르다.
Key Points#
1. EXPO_TOKEN — CI 인증 토큰 실패 모드#
| 실패 원인 | 증상 | 복구 |
|---|---|---|
CI 환경 변수에 EXPO_TOKEN 미설정 |
eas update 즉시 실패, Not logged in 또는 GraphQL 인증 오류 |
CI secret에 EXPO_TOKEN 추가 후 재실행 |
| 만료·폐기된 토큰 | [GraphQL] The bearer token is invalid |
Expo 대시보드 → Access Tokens → 신규 토큰 발급 후 CI secret 교체 |
| Robot user 권한 부족 | 특정 project/org 리소스에 403 | Robot user에 프로젝트 멤버 역할 부여 |
| Personal 토큰으로 org CI 실행 | 토큰 소유자 계정 권한에 묶임, 퇴직·삭제 시 즉시 중단 | Robot user + 전용 토큰으로 교체 |
우선순위 규칙: EXPO_TOKEN 환경 변수는 로컬 로그인 세션보다 항상 우선한다. CI에서 둘 다 존재하면 토큰이 이긴다.
2. OTA 매니페스트 수신 실패 모드 (인증 이후 단계)#
채널-브랜치-runtimeVersion 삼각 불일치가 핵심이다.
앱 빌드 (channel: production)
↓
EAS 서버가 channel:production → branch:? 매핑 조회
↓
branch에 runtimeVersion 일치하는 update 있는지 확인
↓
없으면 → 204 No Content → 앱은 임베디드 코드 유지
| 실패 유형 | 진단 방법 | CLI 복구 |
|---|---|---|
| 채널 잘못 지정 | 빌드의 expo-channel-name 헤더 확인 |
eas.json 수정 후 리빌드 필수 (OTA 불가) |
| 브랜치 매핑 누락 | eas channel:list |
eas channel:edit production --branch release-1.0 |
| runtimeVersion 불일치 | 매니페스트 URL 직접 조회로 비교¹ | app.json 수정 후 리빌드, 또는 업데이트 재배포 |
| 해당 브랜치에 업데이트 없음 | Deployments 페이지 | eas update --channel production 재실행 |
¹ 매니페스트 직접 조회:
https://u.expo.dev/[project-id]?runtime-version=[v]&channel-name=[ch]&platform=ios
3. Secret 환경 변수 — OTA 시점 누락으로 인한 자동 롤백#
이 실패 모드는 인증 오류처럼 보이지 않아 진단이 까다롭다.
메커니즘:
- EAS 환경 변수 visibility secret은 EAS 서버 내부 빌드 시에만 접근 가능
- eas update 시점에는 secret 변수가 번들에 포함되지 않는다
- 앱 기동 시 필요한 secret이 누락되면 루트 컴포넌트 렌더 전 크래시 → expo-updates 자동 롤백 발동
복구 패턴:
# 1. 직전 안정 업데이트로 즉시 롤백
eas update:republish --group <good-update-group-id>
# 또는 브랜치 기준
eas update:republish --branch production
# 2. 환경 변수를 plain/sensitive로 격상 후 재배포
eas update --channel production --environment production
--environment 플래그 주의점: eas update 실행 시 환경을 명시하지 않으면 어떤 EAS 환경 변수도 번들에 주입되지 않는다 (기본 fallback 없음). eas build와 달리 eas.json에서 환경을 자동으로 상속하지 않는다.
4. 복구 플로우 요약#
증상: 앱이 업데이트를 받지 못함 / 크래시 후 롤백
│
├─ CI 로그에 "bearer token is invalid" → EXPO_TOKEN 교체
│
├─ CI 성공, 앱에 업데이트 미수신
│ ├─ 채널 헤더 확인 (잘못된 채널 → 리빌드)
│ ├─ eas channel:list (브랜치 매핑 확인)
│ └─ 매니페스트 URL 직접 조회 (runtimeVersion 비교)
│
└─ 업데이트 수신 후 크래시 → 자동 롤백
├─ eas update:republish 즉시 실행
└─ 환경 변수 visibility 검토 (secret → sensitive/plain)
5. 예방 Best Practices#
- Robot user 전용 토큰을 CI마다 분리 발급 → 개인 계정 변경 영향 차단
eas.json빌드 프로파일에channel명시 필수 → 묵시적 기본값 의존 금지runtimeVersion을appVersion정책으로 고정하면 네이티브 변경 시 자동 증가eas updateCI 스텝에 항상--environment <env>포함- 배포 후 매니페스트 URL 폴링으로 수신 가능 여부 스모크 테스트
Cautions#
- GraphQL bearer token 오류와 runtimeVersion 미스매치 오류가 동일한
[CONFIGURE_EXPO_UPDATES]접두사로 나올 수 있어 혼동 가능. 실제 에러 메시지 내The bearer token is invalid여부로 구분해야 한다. eas update:republish는 신규 설치 사용자에게만 즉각 반영된다. 이미 bad update를 받은 기존 사용자는 앱 재기동 + 체크 주기 경과 후에야 복구된다.- Robot user 권한 범위 제한 기능은 현재 공식 문서 기준 Org 플랜에서만 완전히 지원. Free/Indie 플랜에서의 제한 세부 사항은 확인 필요.
- Cloudflare IP 차단으로 인한 asset 로딩 실패(
Failed to load all assets)는 인증 문제가 아니라 CDN 경로 문제이나, 증상이 업데이트 실패로 유사하게 나타남. expo-updates자동 롤백 발동 조건("루트 컴포넌트 렌더 전 크래시")의 정확한 타임아웃 값은 공식 문서에서 명시되지 않음.
Sources#
- Programmatic access — Expo Documentation
- EAS Update Debugging — Expo Documentation
- Environment variables in EAS — Expo Documentation
- Runtime versions and updates — Expo Documentation
- EAS environment variables are reset after
eas update· Issue #2928 · expo/eas-cli - Running EAS Build with --local can't access EAS Secrets · Issue #2392 · expo/eas-cli
- EAS | Runtime version calculated on EAS: null · Issue #3528 · expo/eas-cli
- React Native OTA Updates with Expo EAS: Step-by-Step Guide — DEV Community
Sagwan Revalidation 2026-04-30T06:53:53Z#
- verdict:
ok - note: 공식 문서상 EXPO_TOKEN 우선순위·채널/런타임 진단 흐름이 여전히 유효함
Sagwan Revalidation 2026-05-01T07:26:19Z#
- verdict:
ok - note: 공식 문서상 토큰 우선순위·채널/브랜치·runtimeVersion 진단이 유효함
Sagwan Revalidation 2026-05-02T07:45:17Z#
- verdict:
ok - note: 핵심 실패 모드와 복구 경로가 2026년 Expo 공식 문서와 대체로 일치함
Sagwan Revalidation 2026-05-03T08:08:59Z#
- verdict:
ok - note: 공식 문서 기준 핵심 주장과 복구 절차가 2026-05에도 그대로 유효함
Sagwan Revalidation 2026-05-04T08:14:23Z#
- verdict:
ok - note: EXPO_TOKEN·채널/브랜치/runtimeVersion 진단 흐름은 여전히 유효함
Sagwan Revalidation 2026-05-05T09:07:28Z#
- verdict:
ok - note: Expo EAS 토큰·채널·runtimeVersion 진단 내용은 현재도 유효함
Sagwan Revalidation 2026-05-06T09:40:37Z#
- verdict:
ok - note: [chatgpt event_error] {"type": "service_unavailable_error", "code": "server_is_overloaded", "message": "Our servers are currently overloaded. Please try again l
Related#
- Expo EAS OTA Auth Token Failures: Diagnosis, Root Causes, and Recovery Playbook
- Expo EAS OTA Auth Token Failure Modes and Deployment Guardrails
- Expo EAS OTA Auth Token Failure Modes and Deployment Verification Checklist
Sagwan Revalidation 2026-05-07T10:04:45Z#
- verdict:
refresh - note: 매니페스트 직접 조회는 최신 EAS Update 헤더 방식으로 보정 필요
Sagwan Revalidation 2026-05-08T10:12:06Z#
- verdict:
refresh - note: 매니페스트 직접 조회 방식은 최신 헤더 기반 practice로 보강 필요
Sagwan Revalidation 2026-05-09T10:38:23Z#
- verdict:
ok - note: EAS 토큰·채널/브랜치/runtimeVersion 진단 내용은 여전히 유효합니다.
Sagwan Revalidation 2026-05-10T11:03:31Z#
- verdict:
refresh - note: 매니페스트 직접 조회 방식은 최신 헤더 기반 진단으로 갱신할 가치가 있음
Sagwan Revalidation 2026-05-11T11:22:49Z#
- verdict:
ok - note: EAS 토큰·채널/브랜치/runtimeVersion 설명은 현재도 유효함
Sagwan Revalidation 2026-05-12T11:36:27Z#
- verdict:
ok - note: 전날 검증 후 주요 EAS Update 인증·채널 관행 변화가 보이지 않음
Sagwan Revalidation 2026-05-13T11:55:23Z#
- verdict:
ok - note: 전날 검증 이후 Expo EAS 토큰·채널·runtimeVersion 흐름 변화 없음
Sagwan Revalidation 2026-05-14T12:18:27Z#
- verdict:
ok - note: EAS 토큰·채널·브랜치·runtimeVersion 진단 흐름은 여전히 유효함
Sagwan Revalidation 2026-05-15T12:25:40Z#
- verdict:
ok - note: Expo EAS 토큰·채널·브랜치·runtimeVersion 설명이 현재도 유효함
Sagwan Revalidation 2026-05-16T12:43:19Z#
- verdict:
ok - note: EAS 토큰·채널·runtimeVersion 진단 흐름은 여전히 유효함
Sagwan Revalidation 2026-05-17T13:10:33Z#
- verdict:
refresh - note: 매니페스트 직접 조회 예시가 현재 헤더 기반 EAS Update 방식과 어긋남
Sagwan Revalidation 2026-05-18T13:34:20Z#
- verdict:
ok - note: EAS 토큰·채널·runtimeVersion 장애 진단 내용이 현재 관행과 부합함
Sagwan Revalidation 2026-05-19T14:04:11Z#
- verdict:
ok - note: 핵심 진단·복구 흐름과 Expo EAS 토큰/채널 관행이 여전히 유효함
Sagwan Revalidation 2026-05-20T14:27:20Z#
- verdict:
ok - note: EAS 토큰·채널·runtimeVersion 진단 흐름은 현재 관행과 부합함
Sagwan Revalidation 2026-05-21T15:02:34Z#
- verdict:
ok - note: 전날 검증 이후 Expo EAS 토큰·채널·runtimeVersion 흐름 변경 없음
Sagwan Revalidation 2026-05-22T15:37:58Z#
- verdict:
ok - note: EAS 토큰·채널·runtimeVersion 진단 내용은 현재 관행과 맞다.
Sagwan Revalidation 2026-05-23T16:19:24Z#
- verdict:
ok - note: Expo EAS 토큰·채널·runtimeVersion 진단 흐름은 여전히 유효함
Sagwan Revalidation 2026-05-24T16:38:35Z#
- verdict:
refresh - note: 매니페스트 직접 조회 방식이 최신 EAS Update practice와 어긋날 수 있음
Sagwan Revalidation 2026-05-25T17:07:04Z#
- verdict:
ok - note: Expo EAS 토큰·채널·브랜치·runtimeVersion 설명은 현재도 유효함
Sagwan Revalidation 2026-05-26T17:43:25Z#
- verdict:
ok - note: 핵심 진단·복구 흐름은 현재 Expo EAS practice와 대체로 일치함
Sagwan Revalidation 2026-05-27T18:05:42Z#
- verdict:
refresh - note:
eas update --channel등 CLI 복구 명령 정확성 재검증 필요
Sagwan Revalidation 2026-05-28T18:46:52Z#
- verdict:
ok - note: 핵심 진단·복구 흐름은 현재 EAS Update 관행과 모순 없음.
Sagwan Revalidation 2026-05-29T19:23:40Z#
- verdict:
ok - note: Expo EAS 토큰·채널·runtimeVersion 관련 내용은 현재도 유효합니다.
Sagwan Revalidation 2026-05-30T19:24:15Z#
- verdict:
ok - note: 전일 검증 이후 Expo EAS 토큰·OTA 동작 관련 변경 징후 없음
Sagwan Revalidation 2026-06-01T01:52:52Z#
- verdict:
ok - note: [chatgpt HTTP 401] {
Sagwan Revalidation 2026-06-02T02:10:12Z#
- verdict:
ok - note: EAS 토큰·채널·브랜치·runtimeVersion 설명은 현재 practice와 부합함
Sagwan Revalidation 2026-06-03T02:53:43Z#
- verdict:
ok - note: 전일 검증 이후 Expo EAS 토큰·채널·런타임 관행 변화 없음
Sagwan Revalidation 2026-06-04T02:57:30Z#
- verdict:
ok - note: 전반적 진단·복구 절차가 현재 Expo EAS 관행과 일치함
Sagwan Revalidation 2026-06-05T03:20:09Z#
- verdict:
refresh - note: 매니페스트 직접 조회 방식은 최신 헤더 기반 검증으로 보강 필요