애드밴티지 SKAdNetwork 가이드

V1.0 2021.05.24 Initial publishing SH Jung

 

1. SKAdNetwork Introduction

Apple에서 IOS14 운영체제 출시와 함께 기존 Retargeting 광고의 기반이 되었던, IDFA(Identifier For Apple)에 대하여 ATT(App Tracking Transparency Framework)를 준수하도록 강제하고 있습니다.

, 기존에는 제한없이 수집이 가능했던 IDFA, IOS14부터는 사용자의 허락을 구한 뒤 수집할 수 있게 되었습니다. (Opt-out -> Opt-in)

 

ATT에서 User IDFA의 수집을 거부하면 00000000-0000-0000-0000-000000000000” 값이 수집되어 Tracking이 어려워지게 됩니다.

 

이러한 변화는 광고 미디어 관점에서는 Performance Marketing에 어려움을 초래하며, 이에 대한 해결책으로 AppleSKAdNetwork framework를 권장하고 있습니다.

 

1.1. SKAdNetwork 참여 구성원

AppleSKAdNetwork를 크게 아래 3 Part로 정의하고 있으며, SKAdNetwork framework 참여를 위한 Responsibility를 명시하고 있습니다. (2.0 Responsibility for taking part in SKAdNetwork 참조)

 

- Ad network (애드밴티지)

- Source app (매체 지면)

- Advertised app (광고하려는 앱)

 

1.2.       Process

아래 그림은 Apple에서 제공하는 SKAdNetwork의 프로세스 입니다.

1.     소스앱 A서명된광고를 제공합니다.

2.     소스A는 목표 앱의 설치 또는 전환 추적을 용이하게하기 위해 필요한 광고키값을 포함하는 loadProduct() method를 호출합니다.

3.     사용자가 화면에 표시된 광고를 탭합니다.

4.     앱이 시작되고 광고된 앱이 기여 및 전환 추적에 필요한 정보를 제공하는 두가지 방법 중 하나를 호출합니다.

5.     Apple은 앱설치 도는 전환을 알리는 포스트백을 Ad network에 제공합니다.

 

 

 

2. Responsibility for taking part in SKAdNetwork

SKAdNetwork framework를 구성하는 참여자는 Ad network, Source app, Advertised app으로 나뉘며, Apple참여를 위해 해야하는 일을 명시하였습니다.

애드밴티지의 제휴 Publisher사는 “2.2 Source app (Publisher)” 부분을 참조해주시기 바랍니다.

 

2.1.       Ad network

2.1.1.   Apple Ad network 등록

Apple SKAdNetwork에서 Ad network ID를 요구합니다.

Ad network ID가 없다면 Apple 홈페이지(https://developer.apple.com/contact/request/ad-network-id/)에서 발급 요청을 할 수 있습니다.

(Apple 개발자 프로그램에 등록하여야 요청이 가능합니다. 법인 등록은 D-U-N-S Number가 필요합니다.)

 

 

발급 신청을 하면 등록에 성공했다는 메일이 오고 보통 일주일 이내 발급이 이루어집니다.

 

-       그 뒤 elliptic curve cryptographic key pair를 만들고 서명확인을 위해 공개키를 Apple과 공유합니다. 공개키/개인키 생성 방법은 아래에 나와 있습니다.

-       더불어 Apple SKAdnetwork 설치 검증 포스트백을 받기 위한 URL을 전달해야합니다.

 

2.1.2.   Private Key 생성

SKAdnetwork에 연동하고자 하는 애드네트워크는 개인키(Private Key)와 공개키(Public Key)를 생성하고, 공개키를 Apple에 보내야 합니다. 개인키를 생성하려면 다음 명령어를 터미널(cmd)에 입력합니다.

openssl ecparam -name prime256v1 -genkey -noout -out companyname_skadnetwork_private_key.pem

명령에서 companyname회사 이름으로 바꿉니다. 예를 들어 advantage라는 회사의 개인 키 파일 이름은 advantage_skadnetwork_private_key.pem입니다.

 

명령어 입력 및 수행 성공을 위해서는 오픈소스 OpenSSL을 이용하여 SSL 인증서를 발급합니다. OpenSSL 다운로드 방법은 OppenSSL 사이트의 github 게시글을 참고

(https://github.com/openssl/openssl)

 

개인 키는 공유하거나 클라이언트 측 코드에 포함시켜서는 안됩니다. 공개 키만 공유하세요.

 

2.1.3.   Public Key 생성

-       생성한 개인키를 이용하여 공개키를 생성합니다. 공개키를 생성하려면 다음 명령어를 터미널(cmd)에 입력합니다.

openssl ec -in companyname_skadnetwork_private_key.pem -pubout -out companyname_skadnetwork_public_key.pem

 

-       명령어에서 companyname_skadnetwork_private_key.pem 부분은 개인키 코드로 바꿉니다. 명령어에서 companyname 부분을 회사 이름으로 바꿉니다. 예로, advantage 회사의 개인 키 파일 이름은 다음과 같습니다. : advantage_skadnetwork_public_key.pem

-       SKAdnetwork 등록 시에는 공개키를 보냅니다. 참고로, Apple의 공개키는 아래와 같습니다.

MEkwEwYHKoZIzj0CAQYIKoZIzj0DAQEDMgAEMyHD625uvsmGq4C43cQ9BnfN2xslVT5V1nOmAMP6qaRRUll3PB1JYmgSm+62sosG

 

2.1.4.   필수키 전달

(또는 광고 네트워크 SDK)에 의해 광고가 로드되면 loadProduct() 메소드를 호출하고 이 메소드와 함께 서명을 제공해야합니다.

따라서Ad networkPublisher에게 아래 필수키와 서명을 전달합니다.

 

1 version SKAdNetwork 버전
2 ad-network-id Apple로부터 부여 받은 Ad network 식별자
3 campaign-id Ad network 플랫폼 내의 캠페인을 나타내는 1-100 사이의 정수
4 itunes-item-id Advertised AppApp store ID
5 fidelity-type 2.2 이상 버전에 쓰이는 매개변수. view-through 광고에서는 1, 클릭 광고는 0을 입력
6 private key 소스앱에서 서명에 필요한 개인키 (확실하지 않으니 확인 바람)

 

 

 

 

2.1.5.   포스트백 검증

소스앱에서 인스톨, 이벤트가 발생하면 특정 시간이 흐른 뒤 Ad network Apple에 제공한 포스트백URL JSON data를 수신합니다.

{ 
    "version" : "2.0",
    "ad-network-id" : "advantage.skadnetwork",
    "campaign-id" : 42,
    "transaction-id" : "6aafb7a5-0170-41b5-bbe4-fe71dedf1e28",
    "app-id" : 525463029,
    "attribution-signature" : "MDYCGQCsQ4y8d4BlYU9b8Qb9BPWPi+ixk\/OiRysCGQDZZ8fpJnuqs9my8iSQVbJO\/oU1AXUROYU=",
    "redownload": 1,
    "source-app-id": 1234567891,
    "conversion-value": 20
}

 

각 값의 정의는 아래와 같습니다.

1 version SKAdNetwork 버전
2 ad-network-id Apple로부터 부여 받은 Ad network 식별자
3 campaign-id Ad network 플랫폼 내의 캠페인을 나타내는 1-100 사이의 정수
4 transaction-id 중복제거를 위한 고유 문자
5 app-id 광고된 앱의 App store ID
6 attribution-signature Apple의 서명
7 redownload 최초 다운로드는 1, 재다운로드는 0
8 app-id 소스앱의 App store ID
9 conversion-value 최대 64 개의 서로 다른 전환 액션을 나타낼 수 있는 6 비트 값

 

광고가 송출되는 앱(소스앱) iOS 11.3 ~ 14 이전 SDK를 사용하거나 해당 버전의 기기에서 실행되는 경우 SKAdnetwork 로부터 버전 1.0의 포스트백을 받습니다.

광고가 송출되는 앱(소스앱) iOS 14 이후 SDK를 사용하거나 해당 버전의 기기에서 실행되는 경우 SKAdnetwork 로부터 버전 2.0의 포스트백을 받습니다.

그리고 iOS 14.6 이상에서는 버전 3.0의 포스트백을 받습니다.

 

Ad networkApple로부터 포스트백을 받으면 HTTP 상태 코드 200 OK로 응답해야 합니다. 기기가 200상태 코드를 받지 못하면 최대 9일 동안 최대 9번의 포스트백 전송을 시도합니다.

 

포스트백을 받은 후 아래의 순서대로 UTF-8문자로 결합하고 그 사이에 구분기호 “\u2063”을 사용하여 Apple에서 보낸 것인지 확인 해야합니다.

아래의 정확한 순서대로 결합하여야 합니다. conversion-value는 포함하지 않으며, source-app-id는 포스트백에 있는 경우에만 포함합니다.

 

Version 1.0인 경우

ad-network-id + '\u2063' + campaign-id + '\u2063' + app-id + '\u2063' + transaction-id

 

Version 2.0 또는 2.1인 경우

version + '\u2063' + ad-network-id + '\u2063' + campaign-id + '\u2063' + app-id + '\u2063' + transaction-id + '\u2063' + redownload + '\u2063' + source-app-id

 

Version 2.2인 경우

version + '\u2063' + ad-network-id + '\u2063' + campaign-id + '\u2063' + app-id + '\u2063' + transaction-id + '\u2063' + redownload + '\u2063' + source-app-id + '\u2063' + fidelity-type

 

Version 3.0 이상인 경우

version + '\u2063' + ad-network-id + '\u2063' + campaign-id + '\u2063' + app-id + '\u2063' + transaction-id + '\u2063' + redownload + '\u2063' + source-app-id + '\u2063' + fidelity-type + '\u2063' + did-win

 

위 문자열을 Apple의 공개키를 사용하여 변환이 유효한지 확인합니다.

Apple의 공개키는 아래와 같습니다.

 

Version 1.0인 경우 P-192공개키

MEkwEwYHKoZIzj0CAQYIKoZIzj0DAQEDMgAEMyHD625uvsmGq4C43cQ9BnfN2xslVT5V1nOmAMP6qaRRUll3PB1JYmgSm+62sosG

 

Version 2.1 이상인 경우 NIST P-256공개키

MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWdp8GPcGqmhgzEFj9Z2nSpQVddayaPe4FMzqM9wib1+aHaaIzoHoLN9zW4K8y4SPykE3YVK3sVqW6Af0lfx3gg==

 

그리고 다음 단계를 수행합니다.

-       Base64로 인코딩된 Apple의 공개키를 디코딩합니다. 결과는 byte array입니다.

-       바이트 배열에서 X.509 표준 공개키를 만듭니다.

-       Base64 형식의 Apple signature를 디코딩합니다.

-       ECDSA (Elliptic Curve Digital Signature Algorithm), SHA256 hash를 사용하여 attribution-signature 값과 Apple의 공개키를 파라미터로 하여 서명을 검증합니다.

 

이해하기 쉽게 파이썬 코드로 설명하면 아래와 같습니다.

포스트백 데이터 저장

data = {
"version": "2.1",
"ad-network-id": "advantage.skadnetwork",
"campaign-id": "42",
"transaction-id": "6aafb7a5-0170-41b5-bbe4-fe71dedf1e28",
"app-id": "525463029",
"attribution-signature": "MEUCID6rbq3qt4GvFaAaynh5/LAcvn1d8CQTRhrZhLIxLKntAiEAo7IrvoMw6u2qDg6Tr5vIsEHXjlLkPlCOL0ojJcEh3Qw=",
"redownload": "true",
"source-app-id": "1234567891",
"conversion-value": "20",
}

 

파라미터 결합

post_back_parameter = "\u2063".join(
[
data["version"],
data["ad-network-id"],
data["campaign-id"],
data["app-id"],
data["transaction-id"],
data["redownload"],
data["source-app-id"],
]
).encode("utf-8")

 

▶ Apple 공개키 Base64 decode DER serialization

apple_pbkey = b64decode(
"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWdp8GPcGqmhgzEFj9Z2nSpQVddayaPe4FMzqM9wib1+aHaaIzoHoLN9zW4K8y4SPykE3YVK3sVqW6Af0lfx3gg=="
)
pbkey = serialization.load_der_public_key(apple_pbkey)

 

▶ attribution-signature Base64 decode

sig = b64decode(data["attribution-signature"])

 

검증

pbkey.verify(
sig, post_back_parameter, ec.ECDSA(hashes.SHA256())
) //verify Boolean형식

 

 

 

2.2.  Source app (Publisher)

Source app에서는 가이드에 따라 작업을 진행하되, 자세한 개발 사항은 Apple의 가이드에 따라주시기 바랍니다.

(https://developer.apple.com/documentation/storekit/skadnetwork)

 

기존의 애드밴티지 click url(http://dr2.kr/~)과는 별도로 Apple로 데이터를 전송해주는 작업이 필요합니다.

 

-       Ad network(애드밴티지)가 전달한 Ad network idInfo.plist 파일에 추가 설정합니다.

-       Ad network가 송출한 광고를 노출시키고, loadProduct(withParameters:completionBlock:) 함수를 호출하여 Apple에 광고 노출 정보를 전송합니다.  또한 이 method와 함께 서명을 제공해야 합니다.

 

-       서명에는 아래 값들이 필요합니다. 2,3,4번은 ad network로부터 전달 받습니다.

 

1 version SKAdNetwork 버전
2 ad-network-id Apple로부터 부여 받은 Ad network 식별자
3 campaign-id Ad network 플랫폼 내의 캠페인을 나타내는 1-100 사이의 정수
4 itunes-item-id 광고되는 앱의 App store ID
5 nonce 각 광고 노출에 대해 광고 네트워크에서 생성 한 고유 UUID 값입니다. nonce는 해시가 고유한지 확인하기 위해 일반적으로 암호화에서 사용되는 값입니다.
6 source-app-id 소스앱의 App store ID
7 timestamp 최대 64 개의 서로 다른 전환 액션을 나타낼 수 있는 6 비트 값

 

위 값을 아래 예에 표시된 정확한 순서대로 보이지 않는 구분기호(‘\u2063’)로 결합하여 UTF-8문자열로 만들어야 합니다.

 

-     Version 1.0 일 시

ad-network-id + '\u2063' + campaign-id + '\u2063' + itunes-item-id + '\u2063' + nonce + '\u2063' + timestamp

 

-       Version 2.0 또는 2.1일 시

version + '\u2063' + ad-network-id + '\u2063' + campaign-id + '\u2063' + itunes-item-id + '\u2063' + nonce + '\u2063' + source-app-id + '\u2063' + timestamp

-       Version 2.2이상 일 시

version + '\u2063' + ad-network-id + '\u2063' + campaign-id + '\u2063' + itunes-item-id + '\u2063' + nonce + '\u2063' + source-app-id + '\u2063' + fidelity-type + '\u2063' + timestamp

 

-       UTF-8로 결합된 값을 아래 알고리즘을 사용하여 서명합니다.

▶ PKCS # 8 Private key

▶ SHA-256 해시를 사용하는 ECDSA (Elliptic Curve Digital Signature Algorithm)

 

 

-       서명한 뒤에는 결과 이진값을 Base64 문자열로 인코딩합니다. 그러면 아래와 비슷한 결과가 나타납니다.

MEQCIEQlmZRNfYzKBSE8QnhLTIHZZZWCFgZpRqRxHss65KoFAiAJgJKjdrWdkLUOCCjuEx2RmFS7daRzSVZRVZ8RyMyUXg==

 

이것은 loadProduct() 메소드를 호출할 때 다른 모든 필수 키 (아래의 "소스 앱"섹션 참조)와 함께 사용되는 키 값입니다.

 

, loadProduct() 메소드를 호출하는 데에는 위에 적은 7개의 키값과 서명의 결과값이 필요합니다.

 

이로써 사용자가 광고 된 앱을 설치하고 실행하면 Ad network는 등록 중에 제공 한 URLApple로부터 포스트백을 받습니다.

 

 

2.3.     Advertised app (Advertiser)

Advertised app은 광고 네트워크가 설치를 어트리뷰션하거나 선택적으로 SKAdNetwork를 사용하여 전환을 추적하기 위해 실행해야하는 책임이 있습니다.

설정 부분은 제휴 MMP에 따라 상이할 수 있습니다.

 

Advertised app은 기기에서 registerAppForAdNetworkAttribution () 또는 updateConversionValue () 메소드를 호출하여 설치 알림을 생성하고 광고 네트워크의 포스트 백 URL을 호출해야합니다.

 

▶ registerAppForAdNetworkAttribution () 메소드

registerAppForAdNetworkAttribution() 메소드는 사용자가 광고 된 앱을 시작할 때 호출되어야 합니다.

이 메소드를 호출하면 광고 네트워크에서 로드한 어트리뷰션 데이터와 광고 네트워크에서 제공하는 포스트 백 URL로 전송되는 소스 앱을 사용하여 설치 알림이 생성됩니다.

 

이 메서드가 호출 되자마자 24시간 타이머가 시작되고 초기 24 시간 타이머가 만료 된 후 0-24 시간 후에 포스트 백이 전송되므로 사용자가 광고 된 앱을 설치하고 실행 한 후 24-48 시간이 걸립니다.

 

▶ updateConversionValue (_:) 메소드

이 메소드는 포스트 백에서 전송된 conversion value를 업데이트하기 위해 광고 앱에서 호출됩니다. 6 비트 값이므로 64 개의 가능한 변환 값이 있습니다. 이러한 64개 값 각각은 하나 또는 여러 의미로 해석 될 수 있습니다.

 

예를 들어, 전환 가치는 계정에 가입 한 사용자에게 할당 될 수 있고, 다른 가치는 그들이 앱에서 항목을 구매했음을 나타내기 위해 사용될 수 있거나 다른 가치는 여러 행동의 조합을 나타낼 수 있습니다.

 

Apple은 포스트 백에서 단일 전환 가치 만 허용하므로 광고 네트워크가 단일 사용자의 여러 전환 액션을 추적하려면 단일 가치를 여러 전환 액션으로 해석해야 할 것입니다.

 

registerAppForAdNetworkAttribution () 메소드와 달리 Apple은 새 전환 값이 이전 값보다 크면 24 시간 동안 updateConversionValue () 메소드를 호출 할 수 있습니다. 더 큰 전환 가치로 메서드를 호출하면 24 시간 타이머가 다시 시작됩니다. 타이머가 만료 된 후 0 ~ 24 시간 후에 전환 가치와 함께 설치 알림이 광고 네트워크로 전송됩니다.

 

 

 

-       버전 1 ~ 2.2로 서명 된 광고의 경우 기기는 단일 winning postback을 보냅니다.

-       버전 3.0 이상으로 서명 된 광고의 경우 iOS 14.6부터 기기는 winning postback하나와 non-winning postback을 최대 5 개까지 보냅니다.

non-winning postback은 어트리뷰션을 획득하지 못했다는 뜻입니다.

 

 

위 사항에서 잘못된 부분 또는 문의사항이 있으면 댓글로 남겨주시기 바랍니다.

 

감사합니다.

 

- Enliple Advantage -

 

'개발 용어 정리' 카테고리의 다른 글

2. 광고 플랫폼 용어 정리  (0) 2021.01.05
01. 웹 크롤링 / HTTP  (0) 2019.04.19

+ Recent posts