Fraud Kill-Chain : Event Validation 설정
팔로우
개요
디파이너리의 Fraud Kill-Chain 기능 중 SDK Spoofing을 방어하는 이벤트 유효성 검증(Server to Server Event Validation ) 설정 방법을 설명합니다.
SDK Spoofing 이란?
SDK Spoofing은 광고주 앱에 연동된 SDK가 서버와 주고받는 프로토콜 규약을 해킹한 후,
실제로는 발생하지 않은 가짜 이벤트(회원가입, 레벨 달성, 구매 등)를 만들어 광고 성과로 위장하는 광고 사기 입니다.
Fraud Kill-Chain : Server to Server Event Validation
_ 디파이너리의 Fraud Kill-Chain은 측정한 이벤트의 진위 여부를 고객사로부터 직접 검증받는 방법으로 가짜 이벤트를 탐지합니다.
_ 고객사는 자사 서버와 디파이너리 서버만 알 수 있는 비밀 키를 회원가입, 구매, 등과 같은 주요 이벤트에 설정합니다.
_ 만약 고객사 서버에서 특정 이벤트 발생 결과를 유효하지 않다고 판단하면 디파이너리는 이를 SDK Spoofing으로 간주하고 Fraud Kill-Chain 대시보드에 리포트합니다.
설정하기
Server to Server Event Validation 설정을 위해 다음의 메뉴로 이동합니다.
- Attribution - Fraud Kill-Chain Settings - Server to Server Validation
각 항목을 설정하여 설정을 완료합니다.
a. 이름
검증 룰의 관리용 이름을 설정합니다.
b. Events
검증을 진행할 대상 이벤트를 선택합니다. SDK를 통해서 연동이 확인된 이벤트들만 리스트에 노출이 되며, 여러 개를 선택할 수 있습니다.
[[보통:인용:안내]] 회원가입, 구매, 캐릭터 생성 등 주요 광고 전환용 이벤트를 검증 대상으로 선택합니다
c. Endpoint
디파이너리에서 검증을 요청할 검증 서버의 주소를 설정합니다. 일반적으로는 앱 개발사의 서버가 될 것입니다.
d. Http Header
검증 서버에서 받을 헤더를 추가합니다.
e. HMAC SHA-256 Key
이 UUID 형태의 key는 디파이너리가 전송하는 Event Validation 데이터를 인증하기 위한 key 입니다. 해당 key 를 통해 디파이너리가 전송하는 Event Validation 데이터가 정상인지 여부를 인증합니다
[[보통:인용:경고]]검증 요청에 대한 유효성 검사 방법
- 검증 요청 시 데이터에 대한 유효성 검증을 위한 값은 http Header 설정 부분에 ABX-HASH 의 값으로 전송합니다.
- ABX-HASH 값은 http request 의 raw body 를 Event Validation 등록시 발급된 암호화 키로 HMAC SHA256 암호화 후 Base64로 인코딩한 결과 값입니다.
- 고객사 검증 서버에서도 위와 동일하게 http request 의 raw body 값을 추출한 후 발급된 암호화 키로 HMAC SHA256 암호화 후 Base64로 인코딩하여 전달드린 암호화 값과 동일한지 비교합니다.
- 만약 디파이너리가 보낸 ABX-HASH 값과 검증 서버에서 만든 해쉬한 값이 다르다면 올바르지 않은 접근으로 판단하고 검증 실패로 처리합니다.
f. body
디파이너리가 검증 서버로 전달할 데이터를 구성합니다. key=value 형태로 구성을 합니다.
- key : 검증 서버에서 처리하기 위한 파라미터 키 네임을 입력합니다.
- value : 디파이너리에서 제공하는 값에 해당하는 파라메터를 선택합니다.
Value 리스트
Body 에서 Value 로 사용될 매크로 리스트입니다.
Device
구분 | 매크로 | Data Type | 설명 | 예시 |
디 바 이 스 |
adid | string | 구글광고아이디 or 애플광고식별자 | 0fa27c1e-9378-4d1c-8f01-118e094240e5 |
gaid | string | 구글광고아이디 | 0fa27c1e-9378-4d1c-8f01-118e094240e5 | |
idfa | string | 애플광고식별자 | 0FA27C1E-9378-4D1C-8F01-118E094240E5 | |
idfv | string | 애플벤더아이디 | 0FA27C1E-9378-4D1C-8F01-118E094240E5 | |
cookie | string | 웹 쿠키 아이디 | 0fa27c1e-9378-4d1c-8f01-118e094240e5 | |
ad_id_opt_out | bool | 광고추적제한여부 | FALSE | |
platform | number | 디바이스 플래폼 |
1 = Android 2 = iOS 3 = Web |
|
language | string | 디바이스 언어 | kr | |
country | string | 디바이스 국가 | ko |
Server
구분 | 매크로 | Data Type | 설명 | 샘플 |
Server | a_ip | string | 디파이너리가 제공하는 클릭 아이피 데이터 | 14.33.77.170 |
a_country | string | 디파이너리가 제공하는 클릭의 국가 데이터 | kr | |
a_city | string | 디파이너리가 제공하는 클릭의 도시 데이터 | suwon-si | |
a_region | string | 디파이너리가 제공하는 클릭의 지역 데이터 | gyeonggi-do |
App
구분 | 매크로 | Data Type | 설명 | 샘플 |
앱 | package_name | string | 안드로이드 패키지 네임, 애플 번들 아이디 | com.dfinery.v2 |
appkey | string | 디파이너리 앱키 | 6aE6E7OO5EOsw35P8vCHtQ | |
installer | string | 인스톨러 정보 | ||
app_version | string | 앱 버전 | 1.0.0 |
Event
구분 | 매크로 | Data Type | 설명 | 샘플 |
이벤트 | event_name | string | 이벤트 명 | abx:sign_up |
group | string | 이벤트 그룹 | abx | |
event_datetime | string | 이벤트 발생 시각 (UTC) | 2019-06-25 02:31:43.603 | |
event_timestamp | number | 이벤트 발생 시각 | 1561429903 | |
event_timestamp_d | double | 이벤트 발생 시각 | 1561429903.60351 | |
event_parameter | json | 이벤트 파라미터(json type) |
모든 이벤트 property JSON |
|
user_properties | json | 유저 프로퍼티 파라미터 (json type) | SetUserProperties API 로 설정한 사용자 프로퍼티. | |
user_id | string | AdBrixRm.login api 로 설정한 user ID | DFN User | |
gender | number | AdBrixRm.gender api 로 설정한 성별 데이터 |
0 = unknown 1 = female 2 = male |
|
age | number | AdBrixRm.age api 로 설정한 나이 데이터 | 38 |
Response 구성
검증 서버에서 데이터를 받은 후 이를 검증하여 아래와 같이 Respone 를 보냅니다.
// 정상 이벤트 //Content-Type: application/json { "code": "ok" } // 비정상 이벤트 //Content-Type: application/json { "code": "fraud", "message": "fraud_reason" }
매개변수 | type | 필수값 | 설명 |
code | string | TRUE |
정상 이벤트 : "ok" 비정상 이벤트 : "fraud" |
message | string | false | fraud 의 이유 |
[[인용:위험:작게]] Response 의 매개변수 "code" 는 반드시 가이드에 명시된 문자열로 보내야합니다.
[[인용:위험:작게]] 비정상 이벤트에 대해서는 Response 의 매개변수 "code" 값을 반드시 "fraud" 로 보내줘야 fraud 로 판정합니다.
상태 활성화
모든 설정이 완료된 후 해당 내역을 저장하면 기본적으로 비활성화 상태가 됩니다.
Event Validation 설정 내역으로 다시 들어가서 Event Validation 을 활성화 합니다.
Sample Code
각 서버 언어별 HMAC SHA256 암호화 후 Base64 인코딩하는 Sample Code 입니다.
C#
using System; using System.Security.Cryptography; using System.Text; public static string GenerateHMACSHA256(string key, string data) { var keyBytes = Encoding.UTF8.GetBytes(key); using (var hmac = new HMACSHA256(keyBytes)) { var messageBytes = Encoding.UTF8.GetBytes(data); var hashBytes = hmac.ComputeHash(messageBytes); return Convert.ToBase64String(hashBytes); } }
Java
import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.Base64; public static String generateHMACSHA256(String encryptionKey, String message){ try { SecretKeySpec signingKey = new SecretKeySpec(encryptionKey.getBytes(), HMACSHA256); Mac mac = Mac.getInstance(HMACSHA256); mac.init(signingKey); byte[] hmacData = mac.doFinal(message.getBytes()); return Base64.getEncoder().encodeToString(hmacData); } catch (NoSuchAlgorithmException | InvalidKeyException e) { throw new RuntimeException("Failed to generate Hash", e); } }
Python
import hashlib import hmac import base64 def encrypt(message: str): hash_value = hmac.new(bytes(encryption_key, "utf-8"), bytes(message, "utf-8"), hashlib.sha256) return base64.b64encode(hash_value.digest()).decode()