iOS 앱 및 SDK를 위한 PrivacyInfo.xcprivacy 구현 방법

opoinstall
2026-08-21
5 min read

iOS 앱에서 PrivacyInfo.xcprivacy를 구현하는 방법은 무엇인가요? PrivacyInfo.xcprivacy를 구현하려면 애플리케이션 또는 SDK 타겟에 올바른 개인정보 보호 매니페스트를 추가하고, 사용 중인 필수 사유 API(사용자 기본값(User Defaults) 또는 시스템 부팅 시간 등)에 대해 승인된 사유 코드를 선언하며, 타사 종속성이 배포 형태에 적용되는 개인정보 보호 매니페스트 및 서명 요구사항을 충족하는지 검증해야 합니다.

개인정보 보호 매니페스트(PrivacyInfo.xcprivacy)는 iOS 앱 및 타사 SDK에 포함되는 표준화된 속성 목록 파일로, 데이터 수집 범주, 추적 도메인 구성, 그리고 Apple이 지정한 필수 사유 API 액세스에 대한 승인된 정당화 사유를 선언합니다. 2024년 5월 1일부터 App Store Connect에 제출되는 앱은 앱 코드에서 사용하는 필수 사유 API(적용 가능한 타사 SDK 코드 포함)에 대한 승인된 사유를 반드시 포함해야 합니다.

용어 정의
PrivacyInfo.xcprivacy 앱 및 SDK의 개인정보 보호 관행을 선언하기 위한 Apple의 표준화된 속성 목록 형식입니다.
필수 사유 API (Required Reason APIs) 명시적인 정당화 사유 코드가 필요한 특정 플랫폼 API(사용자 기본값 또는 디스크 공간 등)입니다.
리소스 번들 서명 (Resource Bundle Signing) 생성된 리소스 번들 타겟에 적용되는 빌드 시스템 코드 서명 동작으로, 일부 Xcode 및 CocoaPods 구성에서 문제 해결이 필요할 수 있습니다.
개인정보 보호 리포트 (Privacy Report) 아카이브된 앱과 연결된 SDK에서 발견된 개인정보 보호 매니페스트 선언을 결합하여 Xcode 15 이상에서 생성하는 통합 PDF 요약본입니다.

iOS SDK를 위한 Apple 개인정보 보호 매니페스트 요구사항 이해하기

개인정보 보호 매니페스트의 아키텍처: 메인 애플리케이션 매니페스트 vs 포함된 SDK 매니페스트

Apple의 개인정보 보호 매니페스트 프레임워크는 iOS 소프트웨어 공급망 전반에 걸쳐 모듈식 투명성 모델을 구축합니다. 호스트 애플리케이션이 가져온 모든 라이브러리의 내부 구현 세부정보를 수동으로 감사하고 선언하도록 요구하는 대신, Apple은 개인정보 보호 거버넌스를 다음과 같은 별도의 계층으로 나눕니다:

  • 메인 애플리케이션 매니페스트: 자사 데이터 수집, 앱 수준 추적 도메인, 그리고 기본 애플리케이션 타겟 코드에 의해 직접 호출되는 필수 사유 API를 다룹니다.
  • 포함된 SDK 매니페스트: 필수 사유 API 선언은 해당 API를 사용하는 앱 또는 타사 SDK 코드에 속해야 합니다. 실행 파일 및 동적 라이브러리의 경우, 해당 실행 파일이나 라이브러리를 포함하는 번들에 관련 개인정보 보호 매니페스트가 포함되어야 합니다. 타사 SDK는 SDK의 필수 사유 API 사용을 보고하기 위해 호스트 앱의 매니페스트에 의존할 수 없습니다.
  • 자동 종속성 집계: Xcode 15 이상에서 애플리케이션을 아카이브하면 빌드 시스템이 종속성 그래프를 순회하여 포함된 모든 PrivacyInfo.xcprivacy 파일을 찾아내고, 이를 단일한 통합 개인정보 보호 리포트로 집계합니다.

PrivacyInfo xcprivacy app and SDK manifest architecture

4가지 최상위 구성 키

모든 PrivacyInfo.xcprivacy 파일은 최대 4개의 최상위 키를 포함하는 XML 속성 목록 사전으로 구성됩니다:

  • NSPrivacyTracking (부울): Apple ATT(앱 추적 투명성) 정의에 따라 앱 또는 SDK가 앱에서 수집한 데이터를 추적에 사용하는지 여부를 선언합니다.
  • NSPrivacyTrackingDomains (문자열 배열): 추적을 수행하는 앱 또는 SDK가 연결하는 인터넷 도메인을 나열합니다. 사용자가 ATT 권한을 부여하지 않으면 iOS는 이 배열에 선언된 도메인으로의 네트워크 연결을 차단합니다. 앱이나 SDK가 추적 도메인에 연결하지 않는 경우 이 키는 생략할 수 있습니다.
  • NSPrivacyCollectedDataTypes (사전 배열): 앱 또는 SDK가 앱 사용자 관해 수집하는 Apple 정의 데이터 범주를 보고하며, 데이터가 사용자 신원에 연결되는지, 추적에 사용되는지, 그리고 수집되는 운영 목적이 무엇인지 함께 보고합니다.
  • NSPrivacyAccessedAPITypes (사전 배열): 바이너리에 의해 호출되며 Apple이 지정한 필수 사유 API를 승인된 문자열 사유 코드와 함께 선언합니다.

PrivacyInfo xcprivacy four root configuration keys

App Store Connect 수집 집행 및 오류 진단

App Store Connect는 바이너리 수집 과정에서 개인정보 보호 매니페스트를 집행합니다:

  • 누락된 API 선언 (ITMS-91053): 컴파일된 바이너리나 링크된 라이브러리가 필수 사유 API 심볼을 호출하지만, NSPrivacyAccessedAPITypes에 해당 범주 키가 누락된 경우 트리거됩니다.
  • 유효하지 않은 사유 코드 선언: 매니페스트가 특정 API 범주에 대해 승인되지 않았거나, 형식이 잘못되었거나, 더 이상 사용되지 않는 사유 문자열을 선언할 때 발생합니다.
  • 필수 타사 SDK 매니페스트 누락: 등록된 SDK에 대한 Apple의 최신 타사 SDK 요구사항에 정의된 제출 시나리오에서 집행되며, 바이너리 배포를 위해 개인정보 보호 매니페스트와 유효한 디지털 서명이 모두 필요합니다.

클라이언트 어트리뷰션 및 딥 링크를 통합하는 개발자는 매니페스트 선언에 관한 기술 사양을 iOS SDK 통합 문서에서 확인할 수 있습니다.

참고: iOS SDK ──> 모바일 어트리뷰션 아키텍처

필수 사유 API 범주 및 승인된 사유 코드

5가지 필수 사유 API 범주

Apple 개발자 테크노트 TN3183에 따르면, Apple은 NSPrivacyAccessedAPITypes에 명시적인 정당화 사유 코드가 필요한 5가지 특정 API 범주를 정의합니다. 모바일 SDK와 iOS 앱은 일반적으로 다음 4가지 주요 범주와 상호작용합니다:

  • NSPrivacyAccessedAPICategoryUserDefaults: UserDefaults 또는 NSUserDefaults를 통한 로컬 앱 설정 액세스.
  • NSPrivacyAccessedAPICategorySystemBootTime: sysctl(KERN_BOOTTIME) 또는 systemUptime과 같은 시스템 부팅 API를 사용하여 경과 시간이나 타임스탬프 측정.
  • NSPrivacyAccessedAPICategoryDiskSpace: statfs, statvfs, 또는 volumeAvailableCapacityKey를 통한 파일 시스템 용량 검사.
  • NSPrivacyAccessedAPICategoryFileTimestamp: stat, getattrlist, 또는 contentModificationDateKey를 통한 파일 생성 또는 수정 날짜 확인.
  • NSPrivacyAccessedAPICategoryActiveKeyboards: 활성 커스텀 키보드 확장 검사 (주로 특수 키보드 유틸리티에서 사용됨).

일반적인 SDK 사용 사례를 위한 주요 승인 사유 코드 매핑

아래 표는 범용 모바일 SDK에서 흔히 접하는 범주에 초점을 맞추고 있습니다. 활성 키보드를 포함한 전체 사유 목록은 Apple의 최신 문서를 참조하세요. Apple 가이드라인을 준수하기 위해 개발자는 실제 런타임 데이터 사용량과 정확히 일치하는 사유 코드를 선택해야 합니다:

API 범주 키 승인된 코드 Apple 공식 준거 목적
NSPrivacyAccessedAPICategoryUserDefaults CA92.1 앱 자체에서만 액세스할 수 있는 데이터 읽기 및 쓰기
NSPrivacyAccessedAPICategoryUserDefaults 1C8F.1 동일한 앱 그룹 내에서만 공유되는 데이터 읽기 및 쓰기
NSPrivacyAccessedAPICategoryUserDefaults C56D.1 호스트 앱에 키-값 기능을 제공하는 타사 SDK 래퍼
NSPrivacyAccessedAPICategorySystemBootTime 35F9.1 앱 내에서 발생하는 이벤트 간의 경과 시간 측정 또는 타이머 처리
NSPrivacyAccessedAPICategorySystemBootTime 8FFB.1 앱 내에서 발생한 이벤트에 대한 절대 타임스탬프 계산
NSPrivacyAccessedAPICategoryDiskSpace E174.1 파일 쓰기 전 디스크 공간 확인 및 공간 부족 시 앱 동작 수정
NSPrivacyAccessedAPICategoryDiskSpace 85F4.1 사용자에게 사용 가능한 용량을 표시하기 위해 디스크 공간 정보에 액세스
NSPrivacyAccessedAPICategoryFileTimestamp C617.1 앱 컨테이너, 앱 그룹 또는 CloudKit 컨테이너 내의 파일 메타데이터에 액세스
NSPrivacyAccessedAPICategoryFileTimestamp 3B52.1 사용자가 명시적으로 선택한 파일 또는 디렉토리의 메타데이터에 액세스
NSPrivacyAccessedAPICategoryFileTimestamp 0A2A.1 오로지 호스트 앱을 대신하여 파일 타임스탬프에 액세스하는 타사 SDK 래퍼

Required Reason API categories and approved reason codes

예제 PrivacyInfo.xcprivacy 속성 목록 구성하기

데이터 수집 유형 구성하기

NSPrivacyCollectedDataTypes 배열은 앱 또는 앱 사용자 관해 수집하는 Apple 정의 데이터 범주를 보고하며, 데이터가 사용자 신원에 연결되는지, 추적에 사용되는지, 그리고 수집되는 운영 목적이 무엇인지 함께 나타냅니다:

  • NSPrivacyCollectedDataType: 표준 Apple 문자열 식별자 (예: NSPrivacyCollectedDataTypeDeviceID).
  • NSPrivacyCollectedDataTypeLinked: 데이터가 개별 사용자의 신원에 연결되는지 여부를 나타내는 부울 값.
  • NSPrivacyCollectedDataTypeTracking: 데이터가 크로스 앱 추적에 사용되는지 여부를 나타내는 부울 값.
  • NSPrivacyCollectedDataTypePurposes: 표준 목적 문자열 배열 (예: NSPrivacyCollectedDataTypePurposeAnalytics).

추적 도메인 선언하기

SDK나 애플리케이션이 ATT 정의에 따라 추적을 수행하는 경우, 모든 관련 추적 도메인을 NSPrivacyTrackingDomains 아래에 선언해야 합니다. 사용자가 추적 권한을 부여하지 않으면 iOS는 선언된 도메인으로의 네트워크 연결을 차단합니다. 앱이나 SDK가 추적을 수행하지 않는 경우, NSPrivacyTrackingfalse로 설정하고 NSPrivacyTrackingDomains는 생략할 수 있습니다.

아래의 속성 목록 구성은 예제 PrivacyInfo.xcprivacy 스키마를 보여줍니다. 애플리케이션의 실제 구현을 반영하는 범주와 사유만 포함하세요:

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>NSPrivacyTracking</key>
    <false/>
    <key>NSPrivacyCollectedDataTypes</key>
    <array>
        <dict>
            <key>NSPrivacyCollectedDataType</key>
            <string>NSPrivacyCollectedDataTypeDeviceID</string>
            <key>NSPrivacyCollectedDataTypeLinked</key>
            <false/>
            <key>NSPrivacyCollectedDataTypeTracking</key>
            <false/>
            <key>NSPrivacyCollectedDataTypePurposes</key>
            <array>
                <string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
                <string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
            </array>
        </dict>
    </array>
    <key>NSPrivacyAccessedAPITypes</key>
    <array>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategoryUserDefaults</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>CA92.1</string>
            </array>
        </dict>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategorySystemBootTime</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>35F9.1</string>
            </array>
        </dict>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategoryDiskSpace</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>E174.1</string>
            </array>
        </dict>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>C617.1</string>
            </array>
        </dict>
    </array>
</dict>
</plist>

CocoaPods 리소스 번들 코드 서명 오류 해결하기

근본 원인: Xcode 15 및 16에서의 리소스 번들 서명 실패

Xcode 15 또는 16에서 CocoaPods를 통해 종속성을 통합할 때 개발자는 다음과 같은 컴파일 중단 현상을 자주 마주하게 됩니다:

Signing for "libOpoInstallSDK-OPPrivacy" requires a development team. Select a development team in the Signing & Capabilities editor.

이 빌드 실패는 Xcode와 CocoaPods 통합 문제로 인해 발생합니다:

  • 기존의 .a 정적 라이브러리는 PrivacyInfo.xcprivacy와 같은 리소스를 직접 포함할 수 없습니다. Apple은 정적 SDK 코드와 리소스를 정적 프레임워크 내부에 함께 패키징할 것을 권장합니다.
  • 일부 CocoaPods 통합은 대신 별도의 리소스 번들 타겟을 생성하여 정적 라이브러리와 함께 리소스를 배포합니다.
  • 특정 CocoaPods 생성 리소스 번들 타겟은 개발 팀을 요청하며 Xcode 빌드를 중단시키는 서명 구성을 상속받을 수 있습니다. 이는 PrivacyInfo.xcprivacy 스키마 요구사항이라기보다는 빌드 시스템 통합 문제입니다.

Podfile에 타겟 빌드 시스템 우회 방법 적용하기

자동화된 빌드 전반에서 이 오류를 해결하기 위해 개발자는 프로젝트 Podfile에서 범위가 지정된 post_install 훅을 사용할 수 있습니다. 이는 실행 파일이 아닌 리소스 번들을 위한 빌드 시스템 우회 방법이므로, 팀은 특정 영향 받는 번들 타겟으로 범위를 한정하거나 전역적으로 변경사항을 적용하기 전에 영향 받는 종속성을 검증해야 합니다.

아래의 Ruby 스크립트는 CocoaPods 타겟을 순회하며 지정된 리소스 번들 타겟의 서명을 비활성화하는 방법을 보여줍니다:

post_install do |installer|
  # 개발 팀 없이는 서명 오류가 발생하는 비실행 리소스 번들 타겟 지정
  target_bundle_names = [
    'libOpoInstallSDK-OPPrivacy'
  ]

  installer.pods_project.targets.each do |target|
    if target.respond_to?(:product_type) &&
       target.product_type == "com.apple.product-type.bundle" &&
       target_bundle_names.include?(target.name)
      target.build_configurations.each do |config|
        # 지정된 비실행 리소스 번들에서 코드 서명 요구사항 제거
        config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
        config.build_settings['CODE_SIGN_IDENTITY'] = ''
      end
    end
  end
end

Xcode에서 통합 개인정보 보호 리포트 감사 및 생성하기

Xcode 아카이브 Organizer를 통한 통합 개인정보 보호 리포트 생성

바이너리를 제출하기 전에 모든 자사 타겟과 타사 종속성이 올바르게 선언되었는지 확인하려면 다음 단계를 따르세요:

  1. Xcode 15 이상에서 프로젝트를 엽니다.
  2. Product > Archive를 선택하여 릴리스 아카이브를 생성합니다.
  3. Xcode Organizer에서 아카이브를 마우스 우클릭(또는 Control-클릭)하고 Generate Privacy Report를 선택합니다.
  4. 생성된 PDF 리포트를 저장하고 검토하여 모든 필수 사유 API, 데이터 범주, 타사 SDK 매니페스트가 정확하게 표시되는지 확인합니다.

명령줄(CLI) 정적 분석: 제출 전 휴리스틱 검사

개발 팀은 nmotool을 사용하여 컴파일된 바이너리에서 제한된 심볼을 스캔함으로써 지속적 통합(CI/CD) 파이프라인 내에서 휴리스틱 제출 전 감사를 구현할 수 있습니다:

# 압축 해제된 애플리케이션 바이너리에서 후보 필수 사유 API 심볼 스캔
nm -u /path/to/Payload/YourApp.app/YourApp | grep -E 'sysctl|statfs|statvfs|getattrlist|NSUserDefaults'

# 포함된 프레임워크 및 번들에서 PrivacyInfo.xcprivacy 매니페스트 확인
find /path/to/Payload/YourApp.app -name "PrivacyInfo.xcprivacy"

심볼이 존재한다고 해서 어떤 승인된 사유가 적용되는지가 자동으로 결정되지는 않습니다. 매니페스트를 수정하기 전에 실제 호출 경로와 사용 사례를 검토하세요. 팀은 권위 있는 검증을 위해 Xcode의 Generate Privacy Report와 App Store Connect 사전 검사를 사용해야 합니다.

iOS privacy manifest pre submission audit workflow

진단 매트릭스: 앱스토어 개인정보 보호 매니페스트 거부의 근본 원인

실패 모드 / 오류 코드 기저의 근본 원인 관찰된 시스템 동작 권장 해결 조치
누락된 API 선언 (ITMS-91053) 바이너리가 제한된 API를 호출하지만 매니페스트에서 범주가 누락됨 App Store Connect 업로드 경고 또는 거부 일치하는 API 범주 및 유효한 사유 코드 선언
유효하지 않은 사유 코드 지정된 사유 코드가 해당 범주에 대해 Apple의 승인을 받지 않음 App Store Connect에서 제출 거부 Apple 사양의 승인된 사유 문자열을 사용하도록 XML 업데이트
타사 SDK 매니페스트 누락 목록에 있는 타사 SDK 종속성에 포함된 매니페스트가 없음 App Store Connect에서 누락된 SDK 매니페스트 플래그 지정 PrivacyInfo.xcprivacy를 제공하는 버전으로 종속성 업그레이드
리소스 번들 코드 서명 오류 CocoaPods가 서명 팀 없이 리소스 번들 타겟을 생성함 빌드 중 Xcode 컴파일 중단 실패한 번들 타겟을 평가하고 범위가 지정된 Podfile 서명 우회 적용
선언되지 않은 추적 엔드포인트 앱이 NSPrivacyTrackingDomains에 나열되지 않은 추적 서버에 연결됨 앱의 추적 행위에 대한 개인정보 보호 구성이 불완전함 NSPrivacyTrackingDomains 아래에 모든 추적 엔드포인트 나열

자주 묻는 질문 (FAQ)

모든 타사 SDK는 자체 PrivacyInfo.xcprivacy 파일이 필요한가요?
단순히 타사 라이브러리라는 이유만으로 필요한 것은 아닙니다. 필수 사유 API를 사용하는 SDK는 자체 개인정보 보호 매니페스트에 해당 사용 내역을 보고해야 하며, 데이터를 수집하는 SDK는 자체 매니페스트에 해당 수집 내용을 설명해야 합니다. 또한 Apple은 최신 타사 SDK 요구사항에 설명된 제출 시나리오에서 나열된 SDK에 대해 개인정보 보호 매니페스트를 요구하며, 해당 나열된 SDK가 바이너리 종속성으로 사용될 때는 서명도 추가로 요구합니다. 호스트 애플리케이션은 포함된 SDK를 대신하여 필수 사유 API를 선언할 수 없습니다.
승인된 사유를 선언하지 않고 앱이 UserDefaults를 사용하면 어떻게 되나요?
앱 바이너리나 링크된 SDK가 앱 내부 데이터의 `CA92.1` 또는 앱 그룹의 `1C8F.1`과 같은 유효한 사유 코드와 함께 `NSPrivacyAccessedAPICategoryUserDefaults`를 선언하지 않고 `UserDefaults` API를 호출하는 경우, App Store Connect는 바이너리에 `ITMS-91053` 오류를 플래그 지정하거나 제출을 차단합니다. 올바른 사유 코드는 실제 런타임 데이터 사용량에 따라 달라집니다.
애플리케이션이 단일 API 범주에 대해 여러 사유를 선언할 수 있나요?
네, 그렇습니다. `NSPrivacyAccessedAPITypeReasons` 키는 문자열 배열을 허용합니다. 애플리케이션이나 SDK가 `E174.1`을 통한 앱 동작 수정을 위해 충분한 디스크 공간을 확인하고, `85F4.1`을 통해 사용자에게 사용 가능한 디스크 공간을 표시하는 등 여러 가지 뚜렷한 승인된 목적으로 API를 사용하는 경우, 승인된 사유 코드 둘 다 배열 내에 선언할 수 있습니다.

요약 및 의사결정 프레임워크

Apple의 개인정보 보호 매니페스트 프레임워크는 iOS 소프트웨어 공급망 전반의 투명성을 집행합니다. 원활한 App Store 제출을 보장하려면 개발 팀은 자사 코드의 필수 사유 API 사용을 감사하고, 타사 SDK 종속성이 해당 API 사용에 적용되는 개인정보 보호 매니페스트 요구사항을 충족하는지 검증하며, CocoaPods 리소스 번들 서명을 적절히 관리해야 합니다.

제품별 개인정보 보호 매니페스트 선언에 대해서는 OpoInstall 문서를 검토하고, 배포된 매니페스트를 애플리케이션의 실제 통합 내용 및 Apple의 최신 요구사항과 비교해 보시기 바랍니다.

관련 자료

  • 개념: 개인정보 보호 매니페스트, 필수 사유 API, 리소스 번들 코드 서명, 개인정보 보호 리포트, 앱스토어 준수

  • 기술: Xcode 15+, CocoaPods 종속성 관리자, Swift Package Manager, OpoInstall iOS SDK

  • 표준: Apple 개인정보 보호 매니페스트 사양, App Store 검토 지침 섹션 5.1.1

  • API 및 구성: PrivacyInfo.xcprivacy, NSPrivacyAccessedAPITypes, Podfile post_install

공식 문서

Share this article