---
title: "IPA 실링"
description: "빌드된 .IPA를 Developer Console에 업로드하여 iOS 앱을 보호합니다. SDK 연동이나 코드 변경이 필요 없습니다."
---
> For the complete documentation index, see [llms.txt](/llms.txt).

import { Aside, Steps } from '@astrojs/starlight/components';

IPA 실링은 이미 빌드된 iOS 앱을 보호합니다. 빌드된 `.IPA`를 Developer Console에 업로드하면 DoveRunner가 RASP(런타임 애플리케이션 자체 보호)와 앱 변조 방어 기능을 바이너리에 직접 주입하고, 보호된 빌드를 내려받을 수 있습니다.

소스 코드나 앱 로직은 전혀 변경되지 않습니다. 컴파일된 바이너리를 대상으로 동작하기 때문입니다.

<Aside type="note">
다운로드한 SDK를 빌드 파이프라인에 통합하는 [SDK 실링](../sdk-sealing/)의 대안입니다. 빌드 방식을 바꾸는 대신 완성된 빌드를 보호하고 싶을 때 사용하세요. Developer Console의 iOS 메뉴에 **IPA Sealing**이 보이지 않는다면 [헬프 센터](https://support.doverunner.com)로 문의해 주세요.
</Aside>

## 서명이 중요한 이유

보호 기능을 주입하면 앱 실행 파일이 변경되므로 원본 코드 서명이 무효화됩니다. **실링된 IPA는 재서명해야 iOS가 설치·실행을 허용합니다.** 처리 방법은 두 가지입니다.

| 방식 | 업로드하는 것 | 결과물 |
| :--- | :------------ | :----- |
| **DoveRunner가 재서명** | IPA **+** 프로비저닝 프로파일 **+** `.p12` 인증서 **+** 인증서 비밀번호 | 서명이 완료된 IPA를 받아 바로 설치하거나 제출할 수 있습니다. |
| **직접 재서명** | IPA만 | 미서명 IPA를 받습니다. 설치·제출 전에 직접 재서명해야 합니다. |

## 준비물

실링을 시작하는 데 반드시 필요한 것은 애플리케이션 바이너리뿐입니다. 나머지 세 가지는 DoveRunner가 결과물을 대신 재서명하도록 하려는 경우에만 필요합니다.

| 자산 | 형식 | 필수 여부 | 용도 |
| :--- | :--- | :-------- | :--- |
| **애플리케이션 바이너리** | `.IPA` | **필수** | 보호 전의 컴파일된 iOS 애플리케이션. Xcode 또는 CI/CD 파이프라인으로 빌드합니다. |
| **프로비저닝 프로파일** | `.mobileprovision` | 재서명 시에만 | 설치 대상, App ID 기능, 엔타이틀먼트를 정의합니다. |
| **서명 인증서** | `.p12` (PKCS#12) | 재서명 시에만 | 개인 키와 Apple이 발급한 배포·개발용 인증서를 포함합니다. |
| **인증서 비밀번호** | 평문 | 재서명 시에만 | 비밀번호로 보호된 `.p12` 개인 키를 복호화합니다. |

### 애플리케이션 바이너리 (`.IPA`)

- **생성 방법** — Xcode에서 `.IPA`로 내보내거나 자동화된 빌드 시스템에서 생성합니다.
- **아키텍처** — 표준 iOS 기기(ARM64)를 대상으로 해야 합니다.
- **복호화된 빌드** — IPA는 복호화된 빌드여야 합니다. App Store에서 내려받은 앱은 FairPlay 암호화가 적용되어 있어 그대로 실링할 수 없습니다.
- **Bitcode** — 내보낼 때 Bitcode를 비활성화하세요. DoveRunner는 표준 ARM64 바이너리를 요구하며, Apple도 최근 Xcode에서 Bitcode를 지원 중단했습니다.
- **무결성** — 보호 전에 정상적으로 컴파일되고 동작하는 빌드인지 확인하세요. 실링 과정에서 원본 서명이 대체됩니다.

### 프로비저닝 프로파일 (`.mobileprovision`)

- **Bundle ID 일치** — 프로파일의 App ID가 앱의 기본 Bundle ID와 정확히 일치하거나, 승인된 와일드카드 App ID여야 합니다.
- **엔타이틀먼트 일치** — App Groups, 푸시 알림, Associated Domains, Keychain Sharing 등 앱이 사용하는 모든 기능이 프로파일에 명시적으로 포함되어야 합니다.
- **배포 방식** — Development, Ad-Hoc, Enterprise In-House, App Store 중 실제 배포 경로와 일치시켜야 합니다.

### 서명 인증서 (`.p12`)와 비밀번호

- **형식** — 인증서와 그에 대응하는 개인 키를 모두 포함한 `.p12`(PKCS#12) 파일이어야 합니다.
- **유효성** — 만료되지 않았고 Apple이 발급한 인증서(Apple Development 또는 Apple Distribution)여야 합니다.
- **추출 위치** — macOS 키체인 접근의 **나의 인증서**에서 내보냅니다.
- **비밀번호** — `.p12`를 내보낼 때 지정한 암호입니다.

#### 키체인 접근에서 `.p12` 내보내기

<Steps>

1. Mac에서 **키체인 접근**을 엽니다(Spotlight 또는 **응용 프로그램 → 유틸리티**).

2. 사이드바에서 *키체인* 아래 **로그인**을, *카테고리* 아래 **나의 인증서**를 선택합니다.

3. 사용 중인 Apple Distribution 또는 Development 인증서를 찾습니다. 예: `iPhone Distribution: Company Name (Team ID)`

4. 인증서 항목을 펼쳐 아래에 개인 키가 있는지 확인합니다.

5. 인증서와 개인 키를 **둘 다** 선택한 뒤 마우스 오른쪽 버튼을 클릭하고 **2개 항목 보내기…**를 선택합니다.

6. 파일 형식을 **개인 정보 교환(.p12)**으로 설정하고 **저장**을 클릭합니다.

7. 강력한 비밀번호를 지정하고 보관하세요. Developer Console에서 입력해야 합니다.

</Steps>

<Aside type="caution">
개인 키 없이 인증서만 내보내면 실링이 개인 키 누락 오류로 실패합니다. 반드시 항목을 펼쳐 두 개를 함께 선택하세요.
</Aside>

## 상시 적용 보호 기능

IPA로 실링한 모든 앱에는 아래 보호 기능이 적용됩니다. 항상 활성화되어 있으며 별도의 코딩이 필요 없습니다. 위저드 1단계의 **Inherent Features** 영역에서 확인할 수 있습니다.

### Always On Security

| 보호 기능 | 설명 |
| :-------- | :--- |
| **Javascript Bytecode Encryption** (React Native 전용) | React Native JavaScript 바이트코드를 암호화하여 비즈니스 로직의 리버스 엔지니어링을 방지합니다. |
| **Code Encryption Flag** | 코드 암호화 플래그를 적용하여 정적 분석 도구에 대한 바이너리 내성을 강화합니다. |
| **Certificates / Certificates check** | 앱 서명 인증서를 검증하여 승인되지 않은 주체가 재서명하지 않았는지 확인합니다. |
| **Jailbreak Detection** | 탈옥된 기기를 탐지하고 변조된 환경에서 앱이 실행되지 않도록 합니다. |
| **Cheat Tool Detection** | 일반적인 치트툴, 게임 해킹 유틸리티, 비인가 자동화 도구를 탐지합니다. |
| **Files Integrity check** | `Assets.car`, 프레임워크, 화이트리스트 파일을 제외한 앱 파일의 무결성을 검증하여 비인가 변조를 탐지합니다. |

### Anti Debugging & Runtime Attack

| 보호 기능 | 설명 |
| :-------- | :--- |
| **Method Swizzling / Hook Detection** | Frida, Cydia Substrate 등이 런타임에 악성 코드를 주입하는 데 사용하는 Objective-C 메서드 스위즐링을 탐지하고 차단합니다. |
| **Debugging / Attach Detection** | 앱 프로세스에 디버거가 연결된 것을 탐지하고 앱을 종료합니다. |
| **Frida framework** | 디버깅·후킹·스크립트 주입에 널리 쓰이는 Frida 프레임워크를 여러 레이어에서 탐지합니다. |

## 실링 절차

**iOS 모바일 앱 보안 → IPA Sealing → Apply AppSealing**을 엽니다. 위저드는 3단계로 구성됩니다.

| 단계 | 이름 | 다루는 내용 |
| :--- | :--- | :---------- |
| 1 | **Upload File** | `.IPA` 업로드 및 상시 적용 보호 기능 확인 |
| 2 | **Basic Configuration** | 프레임워크 지정, 배포 옵션, 그리고 DoveRunner가 대신 서명하도록 하려는 경우 프로비저닝 프로파일·`.p12`·인증서 비밀번호 |
| 3 | **Environment Detection** | 변조되었거나 신뢰할 수 없는 실행 환경에 대한 앱의 대응 방식 |

### 1단계 — Upload File

보호 전 `.IPA`를 선택하거나 업로드 영역으로 끌어다 놓습니다. 옆 패널에는 위에서 설명한 상시 적용 보호 기능이 표시됩니다.

<Aside type="caution">
Firebase Crashlytics 등 크래시 리포팅 SDK는 원래 클래스 이름을 난독화 없이 유지해야 DoveRunner에서 지원됩니다.
</Aside>

### 2단계 — Basic Configuration

| 옵션 | 설명 |
| :--- | :--- |
| **This app is built with React Native** | React Native 앱이라면 체크합니다. React Native 앱은 암호화된 JavaScript를 정상적으로 복호화하고 실행하려면 사용 중인 React Native 버전과 일치하는 Hermes 엔진이 필요합니다. 체크하면 **Framework Version**이 나타나며 React Native 메이저·마이너 버전을 선택합니다. |
| **AppSealing Version** | 빌드에 적용되는 실링 버전입니다. 현재 IPA 실링 버전으로 고정되며 선택할 수 없습니다. |
| **Allow distributing without using the App Store & TestFlight.** | App Store나 TestFlight 외의 방식(엔터프라이즈 배포, IPA 직접 설치 등)으로 배포하는 경우 활성화합니다. 일반적인 App Store 제출이라면 해제 상태로 둡니다. |
| **Provisioning Profile (.mobileprovision)** | 실링된 IPA를 재서명할 때 필요합니다. 직접 재서명할 예정이라면 생략해도 됩니다. |
| **P12 Certificate** | 실링된 IPA를 재서명할 때 필요합니다. Ad Hoc 및 App Store 배포에 사용되며, 코드 서명에 필요한 인증서와 개인 키를 모두 포함해야 합니다. |
| **P12 Password** | 키체인 접근에서 `.p12`를 내보낼 때 지정한 비밀번호입니다. |

### 3단계 — Environment Detection

변조되었거나 신뢰할 수 없는 실행 환경에 대해 실링된 앱이 어떻게 대응할지 설정합니다.

| 옵션 | 값 | 기본값 | 설명 |
| :--- | :-- | :----- | :--- |
| **Hooking** | Block / Allow | Block | 앱에 코드를 주입하는 런타임 후킹 프레임워크를 차단합니다. |
| **Method Swizzling** | Block / Allow | Block | 런타임에 앱 동작을 바꾸는 Objective-C 메서드 스위즐링을 차단합니다. |
| **Secure Storage** | Enable / Disable | Enable | 기기에 저장되는 앱 데이터를 보호합니다. |
| **Screen Capture** | Block / Allow | Block | 앱 화면이 캡처되거나 녹화되지 않도록 합니다. |
| **Do not terminate the App on detecting Threat.** | 체크박스 | 해제 | 체크하면 위협 탐지 시 DoveRunner가 앱을 자동으로 종료하지 않으므로 대응을 직접 처리할 수 있습니다. 위협 유형별로 콜백을 등록해야 하며, 운영 환경에서 처리되지 않은 상태로 두면 안 됩니다. |

### 마무리

<Steps>

1. **START APPSEALING**을 클릭하면 바이너리 주입, 변조 방어 적용, (자격 증명을 제공한 경우) 재서명이 수행됩니다.

2. 실링된 `.IPA`를 내려받습니다. 서명 자격 증명을 제공하지 않았다면 배포 전에 직접 재서명하세요.

</Steps>

이전 실행 이력은 **Historical Information**에서, 앱별 서비스 설정은 **Configurations**에서 확인할 수 있습니다.

## 자격 증명 처리

- **임시 처리** — 서명 자격 증명은 격리된 일회성 빌드 환경에서 처리됩니다.
- **미저장** — `.p12` 파일, 인증서 비밀번호, 프로비저닝 프로파일은 영구 저장되지 않으며, 실링 세션이 끝나는 즉시 안전하게 파기됩니다.
- **변조 방지 봉인** — RASP, 무결성 검사, 안티 디버깅 기능은 바이너리 서명에 결속되므로, 실링 이후 변조된 바이너리는 실행되지 않습니다.

## 문제 해결

| 오류 | 원인 | 해결 방법 |
| :--- | :--- | :-------- |
| **인증서 복호화 실패 / 잘못된 비밀번호** | 입력한 비밀번호가 `.p12`를 내보낼 때 지정한 암호와 다르거나 파일이 손상되었습니다. | 키체인 접근에서 인증서와 개인 키를 함께 다시 내보내고 단순한 평문 암호를 지정하세요. `.p12`를 키체인에 다시 가져와 확인한 뒤 재업로드합니다. |
| **Bundle ID 불일치** | 앱의 Bundle ID가 `.mobileprovision`의 App ID와 다릅니다. | Xcode에서 Bundle ID를 확인하고, 프로파일이 해당 Bundle ID를 정확히 대상으로 하거나 승인된 와일드카드 App ID(`com.company.*`)를 사용하도록 설정하세요. |
| **엔타이틀먼트 불일치** | IPA가 사용하는 기능(푸시 알림, App Groups, Keychain Sharing 등)이 업로드한 프로파일에 없습니다. | Apple Developer 계정에서 프로파일을 수정해 필요한 기능을 모두 활성화하고, 다시 내려받아 실링을 재실행하세요. |
| **`.p12`에 개인 키 없음** | 공개 인증서만 내보냈습니다. | 키체인 접근에서 인증서 항목을 펼쳐 인증서와 개인 키를 함께 선택한 뒤 **2개 항목 보내기…**를 실행하세요. |
| **실링 후 실행 시 앱 크래시** | 프로파일의 배포 유형이 대상 환경과 맞지 않습니다. 예를 들어 TestFlight 빌드에 Development 프로파일을 사용했거나, Ad-Hoc 프로파일에 등록되지 않은 기기를 사용한 경우입니다. | `.mobileprovision`이 실제 배포 경로와 일치하는지 확인하세요. Ad-Hoc 테스트라면 프로파일 생성 전에 기기 UDID를 추가해야 합니다. |

## 자주 묻는 질문

**실링하면 앱의 기능이나 소스 코드가 바뀌나요?**
아니요. DoveRunner는 컴파일된 바이너리를 대상으로 RASP 방어 기능과 변조 방지 장치를 주입하며, 소스 코드나 앱 로직은 건드리지 않습니다.

**실링된 `.IPA`를 App Store에 바로 제출할 수 있나요?**
네. 유효한 Apple Distribution 인증서와 프로덕션 App Store 프로비저닝 프로파일로 서명되어 있다면 — 실링 중 DoveRunner가 서명했든 이후에 직접 서명했든 — App Store 제출과 TestFlight 배포에 사용할 수 있습니다.

**DoveRunner가 `.p12` 개인 키와 비밀번호를 요구하는 이유는 무엇인가요?**
DoveRunner에게 재서명을 맡기는 경우에만 필요합니다. 보호 기능을 주입하면 원본 서명이 깨지므로, 변경된 바이너리를 재서명하려면 개인 키가 필요합니다. 공유하고 싶지 않다면 IPA만 업로드하고 결과물을 직접 재서명하세요.

**서명 자격 증명이 DoveRunner 서버에 저장되나요?**
아니요. 업로드된 `.p12` 파일, 비밀번호, `.mobileprovision` 프로파일은 일회성 컨테이너에서 처리되며 실링 세션이 끝나는 즉시 파기됩니다.

**Bitcode 빌드를 지원하나요?**
아니요. DoveRunner는 표준 ARM64 바이너리를 요구하므로 내보낼 때 Bitcode를 비활성화하세요.