이 글의 제목이 의미 있게 다가온다면, 아마도 iOS 14가 가져온 대격변에 대해 이미 알고 계실 겁니다.
iOS 14 출시와 함께 애플리케이션이 사용자 정보를 수집하는 방식에 큰 변화가 생겼습니다. 그중 하나가 바로 광고주 식별자(IDFA, Identifier For Advertisers)와 이를 앱이 접근하는 방식에 관한 것입니다.
IDFA를 처음 접하는 분들을 위해, 먼저 IDFA가 무엇인지 그리고 왜 중요한지 살펴보겠습니다.
IDFA란 무엇일까요?
모든 iOS 기기 사용자는 자신이 광고 회사에 의해 추적될지 여부를 직접 결정할 수 있습니다. 이를 허용하면 광고 회사들은 사용자의 온라인 검색 습관을 기반으로 맞춤형 콘텐츠를 제공할 수 있습니다.
광고 회사는 IDFA(Identifier For Advertisers)를 통해 이를 수행합니다. IDFA는 광고주가 사용자와 그 사용자의 행동을 매칭할 수 있게 해주는 UUID 문자열입니다.
UUID 문자열의 예시는 다음과 같습니다: 123e4567-e89b-12d3-a456–426614174000
그렇다면 어떤 변화가 있었을까요?
간단히 말하면, 이제 애플리케이션은 사용자에게 대화상자를 표시해 앱이 사용자를 추적해도 되는지 묻도록 의무화되었습니다.

꽤 위협적으로 보이죠?
이는 iOS 14 이전 방식과는 대조적입니다. 이전에는 기기에서 광고 추적 제한이 켜져 있는지 꺼져 있는지만 확인하면 되었습니다.
애플의 최신 운영체제인 iOS 14는 이미 9월 16일부터 배포되고 있습니다. 따라서 IDFA를 사용하는 개발자들은 iOS 14와 호환되도록 애플리케이션을 수정해야 합니다.
9월 3일, 애플은 업데이트를 발표하며 이러한 변경 작업의 마감 기한을 내년 초로 연기했습니다:
“개발자들이 필요한 변경을 할 시간을 주기 위해, 내년 초부터 앱은 사용자를 추적하기 위한 권한을 획득해야 합니다”
이제 숨을 고르고 마음의 준비를 할 시간이 생겼습니다. 2021년의 새로운 표준이 될 변화에 대비해 봅시다.
이 글에서는 IDFA에 대한 배경 지식을 소개하고, iOS 14 이후 어떻게 IDFA 값을 얻을 수 있는지 알아보겠습니다.
광고주는 IDFA를 어떻게 활용할까?
하나의 시나리오를 생각해 봅시다(코로나19 이전 기준). iPhone으로 웹을 탐색하며 다음 휴가 때 묵을 호텔을 찾고 있다고 가정해 보겠습니다.
여러분이 보는 각 광고는 여러분의 IDFA가 첨부된 픽셀을 전송합니다. 광고주는 IDFA를 매칭해 여러분이 호텔 광고를 많이 접하고 있다는 사실을 파악하고, 호텔 객실 예약을 원한다고 판단할 수 있습니다.
그 순간부터 얼마 지나지 않아 여러분은 온갖 호텔 객실 광고에 시달리게 될 것입니다.
이 단순하면서도 강력한 기술은 2012년 iOS 6와 함께 우리 삶에 들어왔습니다. 그 이후 많은 것이 변했고, iOS 14는 업계를 다시 한번 뒤흔들고 있습니다.
✋ 참고: 새로운 API를 사용하려면 반드시 Xcode 12로 업그레이드하거나 다운로드해야 합니다.
광고 추적 확인과 IDFA 획득
iOS 14 이전에는 IDFA를 얻는 일이 꽤 간단했습니다.
다음과 같이 광고 추적이 활성화되어 있는지 확인하면 되었습니다:
[[ASIdentifierManager sharedManager] isAdvertisingTrackingEnabled]만약 비활성화되어 있다면, ASIdentifierManager 클래스를 통해 IDFA를 획득할 수 있었습니다:
[[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];충분히 간단하죠?
☝️ iOS 10부터는 사용자가 광고 추적을 비활성화한 경우, 위 메서드는 0으로만 채워진 UUID 문자열을 반환합니다.
iOS 14의 주요 변경 사항 중 하나는 광고 추적 활성화 여부를 확인하던 메서드가 폐기(deprecated)된 것입니다. 그렇다면 iOS 14 이후 애플리케이션은 어떻게 그 간절한 IDFA를 얻을 수 있을까요?
정답은 새로운 API를 사용해 사용자에게 대화상자를 표시하는 것입니다. 이 대화상자에 관해 반드시 기억해야 할 사항은 다음과 같습니다:
- 사용자에게 딱 한 번만 표시할 수 있습니다
- 대화상자 UI에서 수정할 수 있는 것은 'Allow Tracking' 옵션 위의 두 줄(“추적을 원하십니까?”)뿐입니다
즉, 개발자는 이 메시지를 사용자에게 어떻게, 언제 보여줄지 신중하게 고민해야 합니다.
권한 상태(Authorization Status) 확인하기
iOS 14에서는 App Tracking Transparency라는 새로운 프레임워크가 도입되었습니다. 이 프레임워크에는 ATTrackingManager 클래스가 포함되어 있으며, 다음 두 가지 API를 제공합니다:
- 사용자에게 추적 권한을 요청하는 대화상자 표시
- 권한 상태 조회(대화상자 표시 여부와 무관)
먼저 권한 상태를 얻는 방법부터 알아보겠습니다. 이를 위해서는 trackingAuthorizationStatus 메서드를 호출해야 합니다.
ATTrackingManagerAuthorizationStatus status = [ATTrackingManager trackingAuthorizationStatus];이 메서드는 다음 값 중 하나를 가진 NSUInteger를 반환합니다:
- ATTrackingManagerAuthorizationStatusNotDetermined = 0
- ATTrackingManagerAuthorizationStatusRestricted = 1
- ATTrackingManagerAuthorizationStatusDenied = 2
- ATTrackingManagerAuthorizationStatusAuthorized = 3
처음 세 가지 결과는 이름만 봐도 충분히 이해할 수 있으므로, 마지막 'Restricted' 상태에 집중해 보겠습니다.
권한 상태가 'restricted'로 반환되는 경우는, 광고 추적 활성화/비활성화 설정 화면이 잠겨 있고 해당 옵션이 '활성화'로 고정된 경우입니다.
애플은 예컨대 어린이용으로 식별된 기기 등에서 이러한 제한을 적용하고 있음을 공식적으로 인정한 바 있습니다.
사용자에게 추적 권한 요청하기
대화상자를 띄우는 코드를 살펴보기 전에, 먼저 info.plist 파일에 NSUserTrackingUsageDescription 키를 추가해야 합니다.
이 키의 값으로 입력한 문구가 앞서 언급한 대화상자의 두 줄에 그대로 표시됩니다.

대화상자를 표시하려면 requestTrackingAuthorizationWithCompletionHandler를 호출합니다:
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
if (status == ATTrackingManagerAuthorizationStatusDenied) {
//권한이 거부된 경우의 로직
} else if (status == ATTrackingManagerAuthorizationStatusAuthorized) {
//권한이 승인된 경우의 로직
} else if (status == ATTrackingManagerAuthorizationStatusNotDetermined) {
//권한 상태를 알 수 없는 경우의 로직
} else if (status == ATTrackingManagerAuthorizationStatusRestricted) {
//권한이 제한된 경우의 로직
}
}];
이 글의 첫 번째 이미지(대화상자가 보이는 화면)에서 확인할 수 있듯이, info.plist 파일에 작성한 문구가 대화상자의 두 줄로 나타납니다.
마치며
결론적으로, 이러한 변화가 다소 부담스럽게 느껴지더라도 즉각적으로 적용되는 것은 아니라는 점을 기억하는 것이 중요합니다.
또한 애플리케이션에서 크래시나 오류가 발생하지 않도록, 이 글에서 안내한 모든 단계를 빠짐없이 따르는지 반드시 확인하시기 바랍니다.