Apple ATT 최적화 가이드: ATT 동의율을 높이는 방법

opoinstall
2026-08-20
5 min read

앱 추적 투명성(ATT) 동의율을 최적화하는 방법은 무엇인가요? ATT 권한 요청 경험을 개선하려면 명확한 사전 권한 컨텍스트를 제공하고, 정확한 NSUserTrackingUsageDescription을 작성하며, 사용자 여정에서 시스템 권한 요청을 표시하기에 적절한 시점을 선택해야 합니다. 동의율에 미치는 영향은 실증적으로 측정해야 합니다.

광고주 식별자(IDFA)는 iOS에서 광고 어트리뷰션 및 측정을 위해 사용되는 Apple 제공 재설정 가능 기기 식별자입니다. 앱 추적 투명성(ATT) 프레임워크에 따라, 애플리케이션은 ATTrackingManager 권한 요청 프롬프트를 통해 명시적인 사용자 동의를 받은 후에만 IDFA에 액세스할 수 있습니다.

용어 정의
IDFA 앱 추적 투명성의 적용을 받는 Apple의 플랫폼 수준 광고 식별자입니다.
앱 추적 투명성 (ATT) 앱과 웹사이트 전반에서 사용자를 추적하기 전에 사용자 동의를 요구하는 Apple의 프레임워크입니다.
ATTrackingManager 추적 권한을 요청하는 데 사용되는 네이티브 AppTrackingTransparency API입니다.
사전 권한 안내 화면 (Pre-Permission Primer) 권한을 요청하는 이유를 설명하기 위해 시스템 프롬프트보다 먼저 표시되는 커스텀 인앱 화면입니다.

IDFA 액세스의 경제학과 ATT 동의 최적화

최신 iOS 측정에서 권한이 부여된 IDFA 액세스의 역할

추적 데이터의 사용이 ATT 및 광고·측정 파트너의 요구사항을 준수하는 경우, 권한이 부여된 IDFA 액세스는 사용자 수준의 광고 어트리뷰션 및 측정 워크플로를 지원할 수 있습니다. 추적 권한을 사용할 수 없는 경우, 여전히 광고 측정이 필요한 팀은 AdAttributionKit 또는 기존 SKAdNetwork 통합과 같이 독립적으로 허용되는 플랫폼 중계 방식을 사용할 수 있습니다.

권한이 부여된 경우, IDFA는 지원되는 광고 네트워크 통합을 위한 결정론적 조인 키(join key)를 제공하므로 통계 모델링 없이도 캠페인 수준의 전환 대조가 가능합니다. 권한이 거부된 경우, 애플리케이션은 플랫폼 네이티브 프레임워크로 측정을 전환합니다.

즉각적인 콜드 런칭 프롬프트의 문제점

콜드 런칭 직후에 사용자에게 추적 권한을 요청하는 것은 Apple 기술 정책상 허용되지만, 사용자가 아직 애플리케이션의 기능을 경험하지 못한 상태이므로 정보에 입각한 권한 결정을 내리기에 충분한 맥락을 제공하지 못할 수 있습니다.

  • 제품 신뢰도 부족: 최초 사용자들은 아직 애플리케이션의 기능, 브랜드 가치, 데이터 보안 관행에 대한 신뢰를 형성하지 못한 상태입니다.
  • 불명확한 맥락: 사전 설명 없이 네이티브 시스템 대화상자가 표시되므로, 위험을 회피하는 사용자들은 기본적으로 '앱에 추적 금지 요청'을 선택하게 됩니다.
  • 권한 피로도: 앱 초기 실행 시 여러 시스템 권한 대화상자(푸시 알림, ATT, 위치 정보 등)를 연속으로 띄우면 마찰이 발생하고 온보딩 이탈률이 높아집니다. Apple API 문서에 따르면 이미 대기 중인 권한 알림이 있는 경우 후속 권한 요청은 표시되지 않습니다.

ATT 동의 권한 여정 및 프리머 흐름

동의 성과를 실증적으로 평가하기

달성 가능한 동의율은 앱 카테고리, 오디언스 신뢰도, 프롬프트 타이밍, 문구의 명확성에 따라 달라집니다. 팀은 고정된 업계 벤치마크를 맹신하는 대신 통제된 A/B 테스트를 통해 최적화 변형을 평가해야 합니다.

참고 항목: IDFA ──> 모바일 어트리뷰션 모델

AppTrackingTransparency 프레임워크의 기술적 작동 원리

4가지 권한 상태

IDFA에 대한 액세스는 ATTrackingManager.AuthorizationStatus 열거형(enum)에 의해 엄격하게 제어됩니다.

  • notDetermined (0): 사용자가 아직 권한 대화상자를 보지 않은 상태입니다.
  • restricted (1): 자녀 보호 기능, 교육용 구성 프로파일 또는 기업용 MDM에 의해 기기가 제한된 상태입니다. 추적 권한을 부여할 수 없으며 설정 토글이 비활성화됩니다.
  • denied (2): 사용자가 요청을 거부하여 앱이 추적을 위한 앱 관련 데이터에 액세스할 권한이 없는 상태입니다.
  • authorized (3): 사용자가 추적을 허용했습니다. 지원되는 iOS 및 iPadOS 기기에서는 일반적으로 0이 아닌 광고 식별자에 액세스할 수 있게 됩니다.

ATT 권한 상태 및 IDFA 동작

일회성 시스템 프롬프트 규칙

iOS 운영체제는 ATTrackingManager.requestTrackingAuthorization에 대해 단일 표시(single-presentation) 규칙을 적용합니다. 사용자가 네이티브 모달에서 '허용' 또는 '앱에 추적 금지 요청' 중 하나를 선택하여 상호작용하면, 시스템은 결정된 상태를 기억하며 해당 앱 설치 주파수 내에서 프롬프트를 다시 표시하지 않습니다.

시스템 프롬프트는 다시 나타나지 않지만, 사용자는 언제든지 iOS 설정에서 수동으로 추적 권한을 조정할 수 있습니다.

추적 권한이 거부되었을 때 iOS가 식별자를 0으로 처리하는 방식

iOS 14.5 이상에서는 추적 권한이 부여되지 않은 경우 광고 식별자가 일반적으로 모두 0(00000000-0000-0000-0000-000000000000)으로 반환됩니다. 개발자는 애플리케이션 실행 전반에 걸쳐 캐시된 문자열이 유효하다고 가정하는 대신, 필요에 따라 ATT 권한 상태와 반환된 식별자 값을 모두 온디맨드로 검증해야 합니다.

고전환율 UX 아키텍처: 사전 권한 안내 화면(Pre-Permission Primer) 전략

효과적인 컨텍스트 안내 화면의 해부: Apple HIG 제약 조건

Apple의 개인정보 보호 관련 인간 인터페이스 가이드라인(HIG)에 따르면, 추가적인 맥락 설명이 필요한 경우 애플리케이션은 시스템 권한 프롬프트 앞에 커스텀 사전 알림 화면을 표시할 수 있습니다. 단, Apple은 이러한 사전 권한 안내 화면에 대해 엄격한 디자인 규칙을 부과합니다.

  • 단일 액션 버튼: 사전 권한 화면은 시스템 프롬프트로 직접 이어지는 단일 버튼('계속' 또는 '다음' 등)만 제공해야 합니다. 시스템 알림을 우회하거나 지연시키는 '취소', '닫기', '나중에 하기' 버튼을 제공해서는 안 됩니다.
  • UI 모방 금지: 안내 화면이 네이티브 iOS 시스템 알림 상자를 시각적으로 모방하거나 '허용'이라고 라벨이 붙은 가짜 버튼을 표시해서는 절대 안 됩니다.
  • 시각적 강요 금지: 사용자를 조작하거나 후속 시스템 프롬프트에서 '허용'을 선택하도록 유도하기 위한 그래픽, 화살표 또는 고대비 스타일을 인터페이스에 사용해서는 안 됩니다.

App Store 심사 지침 5.1.2 준수

Apple App Store 심사 지침 섹션 5.1.2에 따라, Apple은 권한 요청에 대한 명확한 경계를 집행합니다.

  • 보상형 추적 금지: 앱은 ATT 동의를 대가로 금전적 보상, 가상 화폐, 프리미엄 콘텐츠, 할인 등을 제공하는 것이 엄격히 금지됩니다. 이를 위반할 경우 지침 5.1.2를 위반하게 되며 앱 거부로 이어질 수 있습니다.
  • 핵심 기능 게이팅 금지: 사용자가 추적 권한을 거부하더라도 애플리케이션은 핵심 기능을 차단하거나 계정 생성을 막거나 앱 성능을 저하시킬 수 없습니다.
  • 사용자 선택의 우선권: 사용자의 실제 추적 선택은 항상 네이티브 Apple 시스템 프롬프트에서 이루어져야 합니다.

ATT 사전 권한 안내 화면 디자인 규칙



단계 1: 사용자 온보딩 / 핵심 가치 실현
                      │
                      ▼
단계 2: 맥락 중심의 사전 권한 안내 화면
         (단일 "계속" 액션 ── 목적 설명)
                      │
                      ▼
단계 3: 네이티브 iOS ATTrackingManager 시스템 모달
         (사용자가 "허용" 또는 "앱에 추적 금지 요청" 선택)
                      │
         ┌────────────┴────────────┐
         ▼                         ▼
   [.authorized]             [.denied]
   ATT 허용됨             플랫폼 API로 안전하게 대체
   (일반적으로 IDFA          (AdAttributionKit / SKAN)
    사용 가능)

NSUserTrackingUsageDescription 문자열 최적화

목적 투명성을 위한 Info.plist 구성

Info.plistNSUserTrackingUsageDescription 키는 네이티브 Apple ATT 시스템 알림 내부에 직접 표시되는 설명 문자열을 정의합니다. Apple 문서에 따라 이 문자열은 간결하고 구체적이어야 하며, 추적 데이터가 어떻게 사용되는지 정확히 설명해야 합니다.

기본 공개 내용을 변경하지 않고 명확한 목적 문자열 변형 테스트하기

문자열 변형을 테스트할 때, 테스트되는 모든 변형은 애플리케이션의 실제 추적 관행을 정확하고 온전하게 설명해야 합니다.

  • 개인화 중심: 콘텐츠 추천 및 제품 제안을 맞춤화하는 데 데이터가 어떻게 사용되는지 설명합니다.
  • 광고 관련성 중심: 관련성 높은 프로모션을 제공하고 반복적인 광고를 피하는 데 데이터가 어떻게 사용되는지 설명합니다.
  • 캠페인 성과 측정 중심: 광고 파트너십의 성과를 측정하는 데 데이터가 어떻게 사용되는지 설명합니다.

아래 구성은 NSUserTrackingUsageDescription의 예시를 보여줍니다. 문구가 앱의 실제 추적 관행을 정확히 설명하는 경우에만 사용하세요.


```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>NSUserTrackingUsageDescription</key>
    <string>귀하의 데이터는 맞춤형 제품 추천 및 관련 프로모션 혜택을 제공하고 광고 캠페인 성과를 측정하는 데 사용됩니다.</string>
</dict>
</plist>

사용자 여정에서 최적의 프롬프트 타이밍 트리거 설계하기

사용자 여정에 따른 타이밍 고려사항

첫 실행 시점에 ATT 권한을 요청하는 것이 기술적으로 허용되지만, 사용자가 초기 제품 유틸리티를 경험한 후에 프롬프트를 표시하면 권한 요청에 대해 더 적절한 맥락을 제공할 수 있습니다.

  • 온보딩 이후 트리거: 사용자가 계정 설정을 완료하고 초기 환경설정을 구성한 후에 프롬프트를 표시합니다.
  • 맥락적 마일스톤 트리거: 핵심 사용자 액션을 완료한 후(예: 게임 내 온보딩 튜토리얼 완료, 쇼핑 앱에서 관심 상품 저장, 콘텐츠 앱에서 기사 북마크 등) 프롬프트를 표시합니다.

Swift에서 ATTrackingManager의 엔지니어링 구현

애플리케이션 활성 상태 및 스레드 안전성 처리

Apple API 문서에 따르면, ATTrackingManager.requestTrackingAuthorization은 애플리케이션 상태가 .active일 때만 모달 대화상자를 표시합니다. 다른 권한 프롬프트가 활성화되어 있거나 대기 중인 경우 시스템 알림이 표시되지 않으며, 동시 요청은 운영체제에서 대기열에 추가되지 않습니다.

ATT 프롬프트 타이밍 및 요청 조건

아래 구현은 권한 상태 관리를 예시용 커스텀 사전 권한 뷰와 분리합니다.

import UIKit
import AppTrackingTransparency
import AdSupport

final class ATTManager {

    static let shared = ATTManager()
    private init() {}

    /// 현재 권한 상태 평가
    var currentStatus: ATTrackingManager.AuthorizationStatus {
        return ATTrackingManager.trackingAuthorizationStatus
    }

    /// 추적 권한을 요청할 수 있는지 여부 확인
    var canRequestAuthorization: Bool {
        return currentStatus == .notDetermined
    }

    /// 애플리케이션 활성 상태를 검증하여 추적 권한 요청
    /// - Parameter completion: 해결된 권한 상태를 반환하는 클로저
    func requestAuthorization(completion: @escaping (ATTrackingManager.AuthorizationStatus) -> Void) {
        guard canRequestAuthorization else {
            completion(currentStatus)
            return
        }

        // requestTrackingAuthorization을 호출하기 전에 애플리케이션이 활성 상태인지 확인
        guard UIApplication.shared.applicationState == .active else {
            print("ATT 요청 건너뜀: 애플리케이션이 활성화 상태가 아닙니다. 상태가 여전히 notDetermined인 경우 활성화된 후에 다시 호출하세요.")
            completion(currentStatus)
            return
        }

        DispatchQueue.main.async {
            ATTrackingManager.requestTrackingAuthorization { status in
                DispatchQueue.main.async {
                    switch status {
                    case .authorized:
                        // 필요할 때 현재 광고 식별자를 온디맨드로 읽어옵니다. 캐시된 IDFA를 영구 저장하지 마세요.
                        let idfa = ASIdentifierManager.shared().advertisingIdentifier.uuidString
                        print("ATT 승인됨 - 사용 가능한 IDFA: \(idfa)")
                    case .denied:
                        print("ATT 거부됨 - 광고 식별자가 0으로 반환됩니다.")
                    case .restricted:
                        print("ATT 시스템 프로필에 의해 제한됨")
                    case .notDetermined:
                        print("ATT 상태 미결정")
                    @unknown default:
                        print("알 수 없는 ATT 상태 발생")
                    }
                    completion(status)
                }
            }
        }
    }
}

/// HIG 준수 사전 권한 안내 화면을 위한 예시용 커스텀 UIViewController
final class ATTPrimerViewController: UIViewController {

    private let continueButton = UIButton(type: .system)
    private let titleLabel = UILabel()
    private let descriptionLabel = UILabel()

    var onContinueTapped: (() -> Void)?

    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
    }

    private func setupUI() {
        view.backgroundColor = .systemBackground
        
        // 단일 경로 탐색을 보장하기 위해 모달로 표시될 때 인터랙티브 스와이프 닫기 방지
        isModalInPresentation = true

        titleLabel.text = "맞춤형 경험을 즐길 수 있도록 도와주세요"
        titleLabel.font = .boldSystemFont(ofSize: 20)
        titleLabel.textAlignment = .center
        titleLabel.numberOfLines = 0

        descriptionLabel.text = "당사는 제품 추천을 맞춤화하고 관련 프로모션 혜택을 제공하기 위해 데이터를 사용합니다. 다음 화면에서 Apple의 표준 권한 프롬프트가 표시되며 여기에서 선택을 확인하실 수 있습니다."
        descriptionLabel.font = .systemFont(ofSize: 15)
        descriptionLabel.textAlignment = .center
        descriptionLabel.textColor = .secondaryLabel
        descriptionLabel.numberOfLines = 0

        // Apple HIG 지침은 단일 '계속' 또는 '다음' 액션을 권장합니다.
        continueButton.setTitle("계속", for: .normal)
        continueButton.titleLabel?.font = .boldSystemFont(ofSize: 17)
        continueButton.addTarget(self, action: #selector(handleContinue), for: .touchUpInside)

        let stack = UIStackView(arrangedSubviews: [titleLabel, descriptionLabel, continueButton])
        stack.axis = .vertical
        stack.spacing = 20
        stack.translatesAutoresizingMaskIntoConstraints = false

        view.addSubview(stack)
        NSLayoutConstraint.activate([
            stack.centerXAnchor.constraint(equalTo: view.centerXAnchor),
            stack.centerYAnchor.constraint(equalTo: view.centerYAnchor),
            stack.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 32),
            stack.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -32)
        ])
    }

    @objc private func handleContinue() {
        // 표시 및 닫기 메커니즘은 예시용이므로 앱의 네비게이션 아키텍처에 맞게 조정해야 합니다.
        dismiss(animated: true) { [weak self] in
            self?.onContinueTapped?()
        }
    }
}

거부 후 복구: 정책을 위반하지 않고 시스템 설정으로 사용자 안내하기

보조 설정 워크플로를 도입해야 하는 시점

사용자가 '앱에 추적 금지 요청'을 선택하면 권한 상태가 .denied로 해결됩니다. 이후 requestTrackingAuthorization을 호출해도 대화상자를 표시하지 않고 .denied를 반환합니다. 그러나 사용자가 나중에 추적을 통해 명시적으로 혜택을 받을 수 있는 기능(예: 계정 프로필에서 개인화된 광고 설정 요청)을 시작하는 경우, 앱은 iOS 설정으로 향하는 강요하지 않는 경로를 제공할 수 있습니다.

UIApplication.openSettingsURLString 사용하기

사용자를 앱의 설정창으로 안내하려면 UIApplication.openSettingsURLString을 사용하세요.

if let settingsURL = URL(string: UIApplication.openSettingsURLString),
   UIApplication.shared.canOpenURL(settingsURL) {
    UIApplication.shared.open(settingsURL, options: [:], completionHandler: nil)
}

이 API는 애플리케이션 전용 설정 페이지만 열며, 전역 설정 > 개인정보 보호 및 보안 > 추적 화면으로 바로 연결되는 다이렉트 딥 링크는 제공하지 않습니다.

App Store 정책 경계

  • 반복적인 독촉 금지: 설정에서 추적을 활성화하라는 반복적인 배너를 표시하지 마세요.
  • 기능 잠금 금지: 설정에서 추적이 비활성화되어 있다는 이유로 핵심 기능을 비활성화해서는 절대 안 됩니다.

비교 결정 매트릭스: 사전 권한 전략 대 콜드 런칭 프롬프트

구분 기본 콜드 런칭 프롬프트 강제 제한형 권한 모달 HIG 준수 사전 권한 안내 화면
프롬프트 전 사용자 맥락 낮음 (제품 참여도 없음) 다양함 (액세스 차단) 맥락 제공됨 (관련 상호작용 후 표시)
Apple UI/권한 지침 요청 및 데이터 사용이 규정을 준수할 때 허용됨 액세스나 보상이 추적에 따라 달라지는 경우 허용되지 않음 HIG 사전 알림 제약 조건 및 추적 규칙을 준수할 때 허용됨
Apple 사전 알림 UI 제약 해당 없음 해당 없음 단일 계속/다음 액션; 가짜 알림 없음
권한 중단 타이밍 실행 직후 차단형 맥락적 마일스톤
관측된 동의율 실증적 측정 필요 허용되지 않음 실증적 측정 필요

자주 묻는 질문 (FAQ)

앱이 ATT 권한을 부여하는 대가로 인앱 통화나 할인을 제공할 수 있나요?
아니요. Apple App Store 심사 지침 5.1.2는 사용자 동의를 얻는 대가로 가상 화폐, 추가 기능, 현금, 할인 등의 인센티브를 제공하는 것을 명시적으로 금지합니다. 이를 위반하면 플랫폼 지침을 위반하게 되며 앱 거부로 이어질 수 있습니다.
사용자가 처음에 "앱에 추적 금지 요청"을 선택한 경우 앱이 두 번째 ATT 프롬프트를 표시할 수 있나요?
아니요. iOS에서는 앱 설치당 네이티브 `ATTrackingManager.requestTrackingAuthorization` 프롬프트를 한 번만 표시할 수 있도록 허용합니다. 사용자가 권한을 거부하면 이후의 호출은 대화상자를 표시하지 않고 `.denied`를 반환합니다. 권한을 조정하려면 사용자가 iOS 설정에서 직접 추적 선택을 수동으로 업데이트해야 합니다.
사전 권한 안내 화면이 Apple의 App Store 지침을 위반하나요?
추가적인 맥락 설명이 필요한 경우, Apple은 화면이 인간 인터페이스 가이드라인을 준수하는 조건 하에 커스텀 사전 알림 설명을 허용합니다. 즉, 시스템 프롬프트로 바로 이어지는 단일 '계속' 또는 '다음' 액션을 사용해야 하고, 안내 화면에 '취소'나 '닫기' 액션이 포함되어서는 안 되며, 네이티브 시스템 알림을 모방하거나 사용자가 '허용'을 선택하도록 압박하는 문구 또는 시각적 단서를 사용해서는 안 됩니다.

요약 및 결정 프레임워크

ATT 권한 요청 경험을 개선하려면 명확한 목적 공개와 맥락을 고려한 타이밍이 필요합니다. 추가 설명이 필요한 경우, HIG 준수 사전 권한 안내 화면을 통해 시스템 프롬프트 전에 맥락을 제공하면서 권한 요청 경험을 Apple의 공개된 추적 및 인터페이스 지침에 부합시킬 수 있습니다.

ATT 거부 후에도 어트리뷰션이나 온보딩 맥락이 여전히 필요한 경우, 애플리케이션은 AdAttributionKit, 기존 SKAdNetwork 통합, 또는 Apple의 추적 규칙 범위 내에 머무는 진정한 퍼스트 파티 맥락 라우팅과 같이 독립적으로 허용되는 메커니즘을 사용할 수 있습니다.

제품별 맥락 라우팅 및 어트리뷰션 동작에 대해서는 Openinstall 문서를 검토하고 해당 Apple 추적 요구사항에 따라 구현을 평가해 보세요.

관련 자료

  • 개념: 앱 추적 투명성, IDFA 최적화, 사전 권한 안내 화면(프리머), 동의 퍼널

  • 기술: StoreKit 프레임워크, AppTrackingTransparency 프레임워크, Openinstall 모바일 SDK

  • 표준: Apple 개인정보 보호 인간 인터페이스 가이드라인, App Store 심사 지침 섹션 5.1.2

  • API: ATTrackingManager.requestTrackingAuthorization, UIApplication.openSettingsURLString, ASIdentifierManager

공식 문서

Share this article