애드밴티지 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

1. ROAS (Return of Ad Spend)

광고대비 매출액

광고에 지출하는 1달러당 얼마나 많은 수익을 얻는지 보여주는 비율

 

수익/캠페인비용 = ROAS

예를들어 $5000/$1000 = $5

 

보통 400% 이상이면 좋은 ROAS라고 봄.

ROAS를 개선하기 위해서는 구매가능성이 높은 고객들에게 광고를 타겟팅하는 것이 가장 중요함.

 

2. CPA (Cost Per Action)

광고주가 원하는 어떠한 행동을 취했을 때 비용이 발생함.

예를 들어 회원가입을 하거나 상담신청을 누르거나 어플을 설치하는 등의 횟수가 Action에 해당됨.

CPC(Cost Per Click) 광고가 진화된 상태

 

3. CTR (Click Through Rate)

노출수 대비 클릭수 비율

광고가 클릭한 횟수를 광고가 게재된 횟수로 나눈 값

 

4. CVR (Click Conversion Rate)

유입 후 전환이 이루어진 비율

전환은 상품구매, 문의, 회원가입 등이 행동을 말함.

 

5. Retention (잔존율)

어플을 설치한 뒤 남아 있는 비율

NCPI가 CPI보다 잔존율이 높다.

 

6. NCPI (Non-incentive Cost Per Install)

설치시 보상을 제공하지 않음.

어플의 순위 상승이나 즉각적인 회원의 유입이 필요할 때는 CPI가 낫지만

조금 장기적인 관점에서 보면 NCPI가 낫다.

 

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

iOS14로 인한 SKAdnetwork 가이드 매뉴얼  (0) 2021.05.20
01. 웹 크롤링 / HTTP  (0) 2019.04.19

크롤링의 정의

 

무수히 많은 컴퓨터에 분산 저장되어 있는 문서를 수집하여 검색 대상의 색인으로 포함시키는 기술. 어느 부류의 기술을 얼마나 빨리 검색 대상에 포함시키냐 하는 것이 우위를 결정하는 요소로서 최근 웹 검색의 중요성에 따라 발전되고 있다.

 

R, 파이썬, 자바로 크롤링 할 수 있다.

 

 

웹크롤링이란?

 

웹페이지에서 보이는 데이터를 필요한 부분만 선택하여 수집하는 행위를 말한다.

 

웹크롤링의 4단계 과정

1. HTTP를 요청한다.

2. 응답을 받는다.

3. HTML에서 데이터를 추출한다.

4. 추출한 데이터를 전처리하고 저장한다.

 

웹크롤링 주의점

'영업권 및 지적재산권'을 침해하는 행위가 될수 있기때문에 웹사이트의 메인페이지에서 사전에 robot.txt를 쳐서 개방 범위를 확인하여야 한다.

 


robots.txt

 

robot.txt란 웹체이지를 제작할 때 제작자가 만드는 것으로 검색 엔진 크롤러에서 사이트에 요청할 수 있거나 요청할 수 없는 페이지 또는 파일을 크롤러에 지시하는 파일이다.

간단히 말하면 크롤러가 접근할 때 가져가도 되는 파일과 가져가면 안되는 파일을 구분해서 알려주는 파일이다.

메인페이지에 robots.txt를 치면 아래와 같이 나온다.

예) www.naver.com/robots.txt

 

 

 

User-agent: *           <<< robots.txt.의 규칙이 적용되는 크롤러의 이름이다. *는 모든 크롤러에 적용된다는 뜻이다.

Disallow: /              <<< 크롤러를 차단하는 URL이다. /표시는 모든 루트에 대해 크롤링을 가져가면 안된다.

Allow: /$                <<< /$가 있는 URL에 대해서는 크롤링을 허용한다.

 


HTTP

HTTP는 HyperTextTransferProtocol로 인터넷상에서 데이터를 주고받을 때 사용되며, 주로 HTML을 주고 받는다. 클라이언트가 웹서버에 데이터를 요청하고, 웹서버는 해당 요청에 대한 결과를 응답한다.

클라이언트가 데이터를 요청하고, 웹서버는 해당 요청에 대한 결과를 응답한다.

 

- HTTP Request

클라이언트가 웹서버에 HTTP 요청을 할 때, 웹서버에 제공해야 하는 요청메시지는 GET과 POST가 다르다.

GET방식은 요청라인과 요청헤더를 보내야하고, POST방식은 GET방식에 메시지 바디를 추가한 3가지를 보낸다.

 

요청라인에 URI가 포함된다.

URI(Uniform Resource Indicator),

URL(Uniform Resource Locator)

 

예)

https://search.naver.com/search.naver?sm=top_hty&fbm=1&ie=utf8&query=tuna

 

tuna : 네이버 통합검색

'tuna'의 네이버 통합검색 결과입니다.

search.naver.com

?를 기준으로 왼쪽이 URL, 오른쪽이 Query String이다.

 

 

- HTTP Response

웹서버는 클라이언트의 요청에 대해 응답메시지를 발송한다.

응답메시지는 응답헤더와 바디로 구성되어 있고,

헤더는 HTTP버전, 상태코드, 일시, 컨텐츠 형태, 인코딩 방식, 크기 등이 포함되며,

바디에는 HTML이 포함된다.

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

iOS14로 인한 SKAdnetwork 가이드 매뉴얼  (0) 2021.05.20
2. 광고 플랫폼 용어 정리  (0) 2021.01.05

+ Recent posts