이 글 요약
- 빌드 업로드부터 "심사를 위해 제출"까지, App Store Connect에서 채운 화면을 순서대로 정리한다
- 칸마다 무엇을 넣었는지, 왜 그 값을 골랐는지 적었다. 처음 내는 사람이 그대로 따라 할 수 있게
- Apple 로그인을 쓰는 앱이라면 꼭 필요한 '토큰 해지 키' 만들기까지
3편까지 앱을 만들고, 지우고, 고친 이야기를 했다. 이번 편은 그 앱을 앱스토어 심사에 내는 과정이다.
처음 내는 사람에게 App Store Connect는 칸이 너무 많다. 무엇이 필수인지, 어떤 값을 골라야 거절당하지 않는지 한눈에 안 보인다. 그래서 이번 편은 따라 하기 글로 정리했다. 내가 실제로 채운 화면을 순서대로 캡처했고, 칸마다 무엇을 넣었는지와 이유를 적었다. 예시는 Expo로 만든 아이폰 앱 기준이다.
0. 시작 전에 준비할 것
| 준비물 | 설명 |
|---|---|
| Apple Developer Program | 1년 99달러. 가입해야 앱을 올릴 수 있다 |
| 빌드 파일 | 앱스토어에 올릴 앱 파일. Expo라면 EAS로 만든다 |
| 개인정보 처리방침 URL | 필수. 웹에서 누구나 열 수 있어야 한다 |
| 지원 URL | 필수. 문의 방법이 적힌 페이지 |
| 스크린샷 | 최소 한 크기. 아래 3단계에서 자세히 |
1. 개발자 약관부터 동의한다
Apple Developer 사이트에 새 약관이 올라오면, 동의하기 전까지 빌드 업로드가 막힌다. 업로드 도구는 403 ... required agreement 같은 오류만 보여 준다. 무엇이 문제인지 써 있지 않아서 처음엔 헤맨다.
developer.apple.com에 로그인했을 때 맨 위에 약관 동의 배너가 있으면 먼저 동의한다. 동의하고도 바로 풀리지 않는다. 나는 10분쯤 지나서야 업로드가 됐다.
2. 빌드를 올린다
Expo 앱은 EAS로 빌드하고 제출한다.
# 내 컴퓨터에서 빌드 (클라우드 빌드 대기 없이)
npx eas-cli build --platform ios --profile production --local
# 만들어진 .ipa 파일을 App Store Connect로 올리기
npx eas-cli submit --platform ios --path build.ipa
- 왜 두 번 나눴나: 클라우드 빌드라면
--auto-submit하나로 빌드와 제출이 이어진다. 그런데 내 컴퓨터에서 빌드(--local)하면 자동 제출이 안 된다. 그래서 빌드와 제출을 따로 했다. - 빌드 번호: 같은 번호로 두 번 올릴 수 없다. EAS 설정에서 빌드 번호를 자동으로 올리게 해 두면 신경 쓸 일이 없다.
- 암호화 질문 피하기:
app.json의 iOS 설정에"ITSAppUsesNonExemptEncryption": false를 넣어 두면, 빌드마다 "암호화를 쓰나요" 질문에 답하지 않아도 된다. HTTPS만 쓰는 일반 앱은 false가 맞다.
올린 빌드는 10분쯤 처리된 뒤 TestFlight 탭에 나타난다.

TestFlight에 올라간 빌드. 처리가 끝나면 '제출 준비 완료'가 된다
3. 개인정보 처리방침과 지원 페이지를 만든다
둘 다 URL이 필수다. 따로 웹사이트가 없어서 앱 서버에 정적 페이지로 띄웠다.

서버에 띄운 개인정보 처리방침 페이지
처리방침에는 이것들을 적었다.
- 수집하는 항목: 로그인 정보(카카오·Apple), 운동·신체 기록, 몸 사진
- Apple 건강(HealthKit) 데이터는 허용한 경우에만 읽고, 광고나 제3자 제공에 쓰지 않는다는 문장. HealthKit을 쓰는 앱은 이 문장이 사실상 필수다
- 보관 기간과 앱 안에서 계정을 삭제하는 방법
- 데이터를 맡기는 곳(서버, 백업)과 문의 이메일
지원 페이지는 문의 이메일과 자주 묻는 질문 세 개(계정 삭제, 건강 연동 끄기 등)만 넣었다.
4. Apple 로그인을 쓴다면: 토큰 해지 키를 만든다
앱 안에서 계정을 만들 수 있으면 앱 안에서 계정을 지울 수도 있어야 한다. 여기에 더해, Apple로 로그인한 계정을 지울 때는 Apple 쪽 로그인 연결(토큰)도 끊어야 한다. 서버 데이터만 지우면 심사에서 거절될 수 있다.
끊으려면 Apple 서버에 해지 요청을 보내야 하고, 이 요청에 Apple 개발자 계정에서 만드는 키(.p8 파일)가 필요하다.
① Keys 화면에서 + 를 누르고 이름을 넣은 뒤 Sign in with Apple을 체크한다.

① 새 키 등록: Sign in with Apple 체크
② Configure를 눌러 Primary App ID에 내 앱을 고르고 저장한다.

② Configure: Primary App ID 고르기

② 내 앱을 고른 모습
③ Register를 누르면 다운로드 화면이 나온다. 이 키는 한 번만 내려받을 수 있다. 받은 뒤에는 서버 설정에 넣고, 비밀번호 관리자 같은 곳에 따로 백업해 둔다.

③ 다운로드: 한 번만 받을 수 있다
다 만들면 키 목록에 보인다. 화면의 Key ID와 팀 ID도 서버 설정에 같이 넣는다.

Keys 목록. 만든 키가 보인다
토큰 해지는 어떻게 동작하나요
호텔 체크아웃과 비슷하다. 로그인할 때 Apple이 앱에 출입 카드를 한 장 내준다. 회원 탈퇴는 짐을 빼는 것이고, 토큰 해지는 그 카드를 프런트에 반납하는 것이다. 반납해야 사용자의 Apple ID 설정에서도 이 앱이 사라진다.
키가 제대로 됐는지는 Apple 토큰 서버에 일부러 가짜 코드를 보내 확인했다. "코드가 틀렸다(invalid_grant)"가 돌아오면 키는 통과한 것이다. "키가 틀렸다(invalid_client)"가 돌아오면 키 설정을 다시 봐야 한다.
5. 버전 페이지: 스크린샷, 설명, 빌드
App Store Connect에서 앱을 열면 배포 탭의 버전 페이지가 나온다. 심사에 필요한 것 대부분이 여기 있다.

App Store Connect 버전 페이지. 왼쪽 위에 심사 상태가 보인다
스크린샷

스크린샷 6장. 슬롯마다 받는 크기가 정해져 있다
- 크기가 정해져 있다. 슬롯마다 받는 해상도가 두세 개뿐이다. 6.9인치용으로 찍은 1320×2868을 다른 슬롯에 올렸더니 거절됐다. 그 슬롯은 1206×2622 같은 크기만 받았다. 같은 사진을 그 크기로 줄여서 다시 올렸다.
- 내 실제 기록은 넣지 않았다. 앱을 웹으로 빌드하고 예시 데이터를 넣어서, 브라우저 자동화 도구로 아이폰 크기에 맞춰 찍었다.
- 순서는 앱의 핵심 기능부터. 검색 결과에는 앞의 몇 장만 보인다.
프로모션 텍스트, 설명, 키워드, URL

설명, 키워드, 지원 URL
- 프로모션 텍스트(170자): 언제든 바꿀 수 있는 한두 줄 소개. 심사 없이 수정된다.
- 설명: 기능 목록. 지운 기능이 설명에 남아 있지 않은지 확인한다. 없는 기능을 적으면 거절 사유가 된다.
- 키워드(100자): 쉼표로 구분하고 띄어쓰기는 넣지 않는다. 앱 이름에 이미 있는 단어는 빼도 된다.
- 지원 URL: 3단계에서 만든 지원 페이지.
빌드 고르기
빌드 칸의 "빌드 추가"를 누르면 TestFlight에 올라간 빌드 목록이 나온다. 심사에 낼 빌드를 고른다.

빌드 추가. 심사에 낼 빌드를 고른다

고른 빌드가 버전에 붙은 모습
6. 앱 심사 정보
심사관이 앱을 써 볼 때 필요한 정보다.

앱 심사 정보. 로그인 필요는 해제, 메모는 영어로
- 로그인 필요: 체크 해제. 이 앱은 첫 화면의 Apple 로그인으로 누구나 새 계정을 만들 수 있다. 로그인을 체크하면 심사관용 데모 아이디와 비밀번호를 줘야 한다. 데모 계정을 만들지 않아도 되는 경우라면 해제하고, 메모에 이유를 적는다.
- 연락처: 이름, 전화번호, 이메일. 전화번호는
+82 10-xxxx-xxxx처럼 국가 번호를 붙여야 저장된다. - 메모: 영어로 썼다. 심사관이 따라 할 순서(운동 시작 → 세트 완료 → 운동 완료), 건강 데이터를 어디서 왜 쓰는지, 계정 삭제 위치를 적었다. 한국어 버튼 이름은 괄호에 영어 뜻을 붙였다.
7. 앱 정보: 부제, 카테고리, 콘텐츠 권한, 연령 등급
왼쪽 메뉴의 "앱 정보"로 간다. 이 페이지의 내용은 모든 버전에 공통이다.

앱 정보. 이름, 부제, 번들 ID
- 부제(30자): 이름 아래 한 줄. "지난번보다 한 걸음, 운동 기록".
- 카테고리: 기본은 건강 및 피트니스, 보조는 라이프스타일.
- 콘텐츠 권한: 다른 회사의 콘텐츠(영상, 음악 등)를 보여 주지 않는 앱이라 "아니요"를 골랐다.

콘텐츠 권한: 아니요
연령 등급
"연령 등급 설정"을 누르면 7단계 설문이 나온다. 폭력, 도박, 선정성 같은 항목은 전부 "없음"이다. 걸리는 건 하나였다. "건강 또는 웰빙 주제".
운동 앱이 여기에 "아니요"라고 답하는 건 정직하지 않다. "예"를 고르면 4+가 9+로 바뀐다. 한국에서는 '전체 이용가'로 표시된다. 실제로 달라지는 건 거의 없으니 정직한 쪽을 골랐다.

연령 등급 결과. 한국은 '전체'
8. 앱 개인정보
"앱이 수집하는 개인정보"에서 앱스토어 페이지에 표시될 개인정보 라벨을 채운다. 처리방침 URL도 여기서 넣는다.

처리방침 URL 입력
"시작하기"를 누르면 설문이 이어진다.
① 데이터를 수집하나요? 서버에 기록을 저장하면 "예"다.

① 데이터를 수집하나요?
② 수집하는 데이터 유형 고르기. 이 앱은 7개를 골랐다. 이름, 이메일 주소, 건강, 피트니스, 사진 또는 비디오, 기타 사용자 콘텐츠, 사용자 ID.
③ 유형마다 세 가지 질문에 답한다. 무엇에 쓰나요(앱 기능), 사용자 신원과 연결되나요(예), 추적에 쓰나요(아니요).

③-1 사용 목적: 앱 기능

③-2 사용자 신원과 연결되나요? 예

③-3 추적에 쓰나요? 아니요
- 사용자와 연결됨 "예": 로그인한 계정에 기록이 붙으니 연결된다. 이걸 "아니요"로 답하면 오히려 사실과 다르다.
- 추적 "아니요": 추적은 다른 회사의 앱·웹 데이터와 합쳐 광고에 쓰는 것을 말한다. 광고 SDK도 분석 SDK도 없으면 "아니요"다.
④ 다 채우면 요약이 나온다. 오른쪽 위 "게시"를 눌러야 반영된다.

앱 개인정보 요약. 처리방침 URL과 수집 데이터

데이터 유형별 답. 모두 '앱 기능, 사용자 신원에 연결됨'

④ 게시 확인
9. 가격 및 사용 가능 여부
"가격 추가"에서 기준 국가와 가격을 고른다. 무료면 $0.00.

가격 추가: 기준 국가와 $0.00

가격. 175개 국가 모두 무료
사용 가능 여부에서 출시 국가를 고른다. 이 앱은 한국어 전용이고 카카오 로그인이 있어서 대한민국만 골랐다. 나라를 늘리면 나라별 규정(예: EU의 판매자 정보 공개)을 더 챙겨야 한다. 나중에 언제든 늘릴 수 있다.

사용 가능 여부. 1개(대한민국)만 사용 가능
10. 출시 방식을 고르고 제출한다
버전 페이지 맨 아래에서 승인 뒤 출시 방식을 고른다.

출시 방식. 승인 즉시 자동 출시를 골랐다
- 수동: 승인 뒤 내가 "출시"를 눌러야 공개된다. 출시 시점을 맞추고 싶을 때.
- 자동: 승인되는 즉시 공개된다. 나는 이걸 골랐다.
이제 오른쪽 위 **"심사에 추가"**를 누른다. 빠진 항목이 있으면 이때 알려 준다. 문제가 없으면 제출 초안이 열린다.

제출 초안. '심사를 위해 제출'을 누른다
**"심사를 위해 제출"**을 누르면 끝이다.

제출 완료
Apple은 심사에 최대 48시간이 걸릴 수 있다고 안내한다. 상태는 왼쪽 위와 "앱 심사" 메뉴에서 볼 수 있다.

앱 심사 메뉴. 제출 내역과 상태
에이전트와 한 부분
App Store Connect 입력은 에이전트가 크롬을 직접 조작했다. 위의 칸 대부분을 에이전트가 채웠다. 나는 이렇게 말했다.
크롬에서 너가 직접 띄워줘. 난 누르기만 할게.
내가 한 일은 개발자 약관 동의, 전화번호 알려 주기, 출시 국가와 출시 방식 고르기, 키 파일 다운로드 허락, 그리고 마지막 제출 허락이었다. 에이전트는 되돌릴 수 없는 버튼 앞에서 매번 멈췄다. 약관, 다운로드, 제출. 그 앞에서만 내 차례가 왔다.
연령 등급의 "예"는 에이전트가 골랐다. 4+와 9+가 나오는 걸 둘 다 확인한 뒤, 운동 앱이니 "예"가 맞다고 보고했다. 나는 그대로 뒀다.
오늘의 교훈
칸은 많았지만 어려운 칸은 없었다. 다만 되돌릴 수 없는 버튼 몇 개는 내가 직접 눌러야 했다.
다음 편이 마지막이다. 심사를 기다리며 5년 쓴 앱을 다시 켜 봤다.
'프로젝트' 카테고리의 다른 글
| [PowerUp 개발기 3편] 지운 기능과 고친 버그 (0) | 2026.10.16 |
|---|---|
| [PowerUp 개발기 2편] 운동하는 하루로 보는 PowerUp (0) | 2026.10.16 |
| [PowerUp 개발기 1편] 5년 쓴 헬스 앱을 두고 내 앱을 만들었다 (0) | 2026.10.16 |
| 음성으로 대화하는 chatGPT (0) | 2026.10.15 |
| [만쥬네 동아리 가게] 5. UI/UX 설계 (0) | 2026.10.15 |