안녕하세요. 저는 안드로이드 팀의 박상권입니다.
이 글은 작년 저희 회사에서 발생한 클릭 인젝션(Click Injection)이슈에 대한 이야기 입니다.
앱 클릭/설치 통계가 이상하다
2017년 9월, 마케팅 결과 통계를 분석하던중 이상한점을 발견하게 되었습니다.
특정 마케팅 채널을 통한 앱 설치수가 늘어날 수록, 반대로 자연(Organic)앱 설치수가 줄어드는 현상을 발견하게 되었습니다.
또한 클릭횟수가 다른 채널에 비해 비정상적으로 너무 높았습니다.(우리가 아무리 광고를 잘했다고 하더라도 하루에 몇백만명이 클릭 했을리는 없잖아…)
(다른 광고채널에 비해 클릭수가 비정상적으로 높은 매체들)
그래서 사용자의 앱 설치 완료시간(Package Install Time)을 수집하고 사용자가 광고를 클릭한 시간(Click Time)과 비교해 보았습니다.
측정결과, 약 50% 사용자에게서 [앱 설치 완료시간]뒤에 [광고 클릭 시간]으로 나오는 이상한 현상이 발생하고 있었습니다.
(정상적인 상황은 [광고 클릭]->[앱설치])
저희는 이런 현상을 보고 클릭 인젝션을 의심하게 되었습니다.
클릭 인젝션
클릭인젝션(Click Injection)은 다른 경로로 유입되어 설치하는 사용자가 자신의 플랫폼에서 노출시킨 광고를 클릭하고 설치하는것처럼 속이는 행위입니다. 이는 클릭 하이재킹(Click hijacking)이라고도 불리웁니다.
클릭 인젝션이 이루어지는 과정은 아래와 같습니다.
출처: AppsFlyer
0. 사용자는 클릭 인젝션을 발생시키는 사기행위 앱을 설치합니다. 보통 사용자는 이 앱이 문제가 있는 앱이라는걸 사용자는 알 수 없으며 이런 앱들은 플래시, 유틸성의 간단한 앱들인 경우가 많습니다.
사용자는 우리 앱의 광고를 보고 클릭합니다.(혹은 플레이스토어에서 직접 검색해서 유입되는 경우도 포함됩니다.)
[설치]버튼을 눌러서 우리 앱을 설치합니다.
이때 사기행위앱은 앱이 설치되는것을 감지할 수 있으며, 이 설치가 자신의 광고를 클릭해서 사용자가 설치한것처럼 보이기 위해서 분석툴(Google Analytics, AppsFlyer, Tunes등)으로 클릭했다는 정보를 계속 전송합니다.
사용자가 앱을 실행하면 설치된 유입경로(Referrer)를 각 분석툴에 전송하게 되고 각 분석툴에서는 [3]에서 클릭했다는 정보와 이 사용자를 매치해서 실제로 광고성과가 있었음을 크로스 체크해서 확인합니다.
위와같은 과정을 통해서 사기행위 앱은 다른경로로 유입된 사용자가 자신의 광고를 클릭해서 설치한것처럼 성과를 속여서 광고회사로부터 돈을 가로챕니다.
광고주입장에서는 광고비로 열심히 돈을 썼지만 실제 이돈은 사기행위 앱에게 전달된 것입니다.
출처: AppLift
클릭 인젝션 — 상세과정
사기행위 앱은 다른 앱이 설치될때 시스템이 보내는 `PACKAGE_ADDED`브로드캐스트를 모니터링하고 있기때문에 앱이 설치되는 시점을 알아올 수 있습니다.
2. 사기행위 앱은 자신의 서비스를 통해 광고를 클릭한것처럼 보이기 위해 광고분석툴에 속이는 Referrer를 브로드캐스트 리시버로 계속 전송합니다.
직접 설치할경우 Referrer 예시
...&utm_source=google-play&utm_medium=organic
광고를 통해 설치할경우 Referrer 예시
...&mat_click_id=f43a10d281fa295b8ac4778844ad****-20171117-190***&utm_campaign=Internal&utm_content=Internal&utm_medium=Internal&utm_source=광고매체&utm_term=Internal
사기행위 앱은 이 Referrer와 같은 패턴으로 자신의 서비스에서 광고가 눌려서 성과가 발생한것처럼 속입니다.
분석툴 SDK를 설정하셨다면 Manifest파일에 아래와 같은 설정을 해두셨을텐데 이 브로드캐스트 리시버를 통해 우리 서비스로 Referrer가 들어옵니다.
이렇게 받은 Referrer를 광고분석툴에서는 클릭했다고 인지하게 됩니다.
Referrer를 전송하는 패턴은 사기행위 앱마다 다양합니다.
어떤 사기행위 앱은 4시간동안 2초마다 위의 Referrer를 브로드 캐스트로 전송하는 경우도 있었습니다.
저희 서비스에서는 특정시간동안 1,200명의 사용자에게서 50만번 이상의 브로드캐스트를 받기도 했었고, 1명의 사용자가 4만번의 브로드캐스트를 발생시킨적도 있었습니다.
클릭인젝션 방어-1
이러한 클릭인젝션을 감지하고 방어하기 위해서 광고주와 광고성과 분석툴 서비스들에서는 많은 고민을 했습니다.
이들은 CTIT(Click-To-Install-Time: 광고클릭후 실제 앱을 실행하는데까지 걸린 시간)에 집중했습니다.
관련 용어
- Click Time : 광고 클릭시간 (CTIT 에서의 Click Time)
- Install Start Time : 플레이스토어에서 설치 버튼 클릭 시간
- Package Install Time : 앱 설치 완료 시간
- First Open Time : 앱 첫 실행 시간 (CTIT 에서의 Install Time)
보통의 평균적인 CTIT분포는 아래와 같습니다.
출처: adjust
반면에 클릭인젝션에 영향을 받은 CTIT의 분포는 아래와 같습니다.
출처: adjust
사기행위앱의 경우 설치하는 시점에 이를 알아채고 성과분석툴에게 클릭했다고 보냅니다.
그러므로 클릭한 시점으로부터 실제 앱을 실행한 시간에 대한 주기는 정상적인 분포에 비해 짧을수 밖에 없습니다.
여러 성과분석툴에서는 이러한 CTIT를 활용해서 사기행위 앱으로 의심되는 행위를 콘솔에서 확인할 수 있도록 제공합니다.
출처: appsflyer
하지만 앱마다 CTIT에 대한 설치시간의 차이가 있고 이 시간을 결정하는데는 다양한 요소가 존재하기때문에 CTIT가 짧다고해서 사기행위의 앱이라고 단정하기는 어려운 문제가 있습니다.
예)
앱의 설치용량이 큰경우, 앱을 다운로드 시켜놓고 다른일을 하다가 오게되면 CTIT시간은 늘어나서 실제 사기행위 앱이어도 잡을 수 없습니다.
광고를 클릭했을때 브라우저->앱스토어 화면이 아닌 팝업형태의 앱스토어 설치화면이 바로 뜨는경우, CTIT시간은 다른 서비스에 비해서 짧게 나오는데 이는 정상적인 설치임에도 불구하고 사기행위 앱으로 의심받을 수도 있습니다.
즉, 이러한 데이터를 바탕으로 의심은 할 수 있지만 확신은 할 수 없다는 것입니다.
클릭인젝션 방어-2
그러던중 2017년11월, Google Play에서는 Install Referrer API를 제공하기 시작했습니다.
Install Referrer API에서는 아래의 정보를 받아볼 수 있습니다.
Referrer URL( Install Referrer)
광고를 클릭한 시간(Referrer Click Timestamp)
앱설치를 시작한 시간(Install Begin Timestamp)
출처: Google Play
이 API를 통해 우리는 실제 앱설치를 시작한 시간을 알 수 있게 되었습니다.
이제 우리는 앱설치를 시작한 시간을 알아올 수 있기때문에, 설치가 시작된 이후에 발생한 클릭에 대해서는 사기행위로 판단할 수 있게 되었습니다.
출처: igaworks
각 성과분석 서비스에서는 이 Install Referrer API를 활용하여 사기행위 클릭을 감지하고 처리할 수 있게 되었습니다.
아래 성과분석 서비스별 적용된 SDK버전을 확인하시고 해당버전을 사용하고 계시지 않다면 즉각적으로 해당버전 이상으로 적용하시기 바랍니다.
Tune: 4.15.0(2017/11/20)
AppsFlyer: 4.8.4(2017/11/29)
Adjust: 4.12.0(2017/12/13)
누가 이런 사기행위를 시도하려고 하는가
이런 사기행위를 시도하는 앱을 찾아내는 방법은 앱이 설치됨을 감지하는 기능을 사용하고 있는 앱을 먼저 의심해보는것입니다.
(Manifest에서 ‘PACKAGE_ADDED’ 브로드캐스트 리시버를 사용중인 앱)
이러한 의심되는 앱들의 내부 코드를 살펴보면 앱설치가 이루어졌을때 클릭했음을 알리는 Referrer 브로드캐스트 전송을 수십차례 시도하는것을 확인할 수 있습니다.
놀라운 사실은 사람들이 많이 쓰고 있고 유명한 앱들에도 이러한 사기행위 기능이 들어가 있다는 것입니다.
그 앱이 사기행위를 하기위해 추가하지 않았더라도 광고를 노출시키기위해 사용하는 광고SDK 회사에서 악의적으로 해당기능을 심어놓았을 가능성이 높습니다.
혹시 앱서비스를 운영중인 개발사에서 이 글을 보고 있다면 우리 서비스에서 사용하고 있는 광고SDK에서는 위와같은 사기행위의 기능이 들어있지는 않은지 확인해보시고 이러한 사기행위가 우리의 서비스에서 발생하지 않도록 조치하셨으면 합니다.
이러한 클릭 인젝션과 관련된 비슷한 이슈는 야놀자의 포스팅에서도 확인해보실 수 있습니다.(야놀자 앱은 왜 자동실행 되나요?)
마치며
위와 같은 여러 사람들의 클릭인젝션에 대한 고민과 방어로 인해 클릭인젝션은 많이 해소가 되었지만 여전히 광고성과에 대한 사기행위 시도는 존재합니다.(Click Spamming, Fake Install 등)
이러한 사기행위에 대한 감지와 해결을 항상 마케터와 개발자가 모니터링하고 커뮤니케이션하면서 해결해나가는 활동은 계속 될것입니다.
이글을 읽으신 기획자, 마케터, 개발자등 관계자분들은 우리 서비스에서 클릭 인젝션으로 인한 피해가 없는지 확인하셨으면 합니다.
PRND 에서는 앞으로도 서비스를 운영하면서 발생하는 여러 이슈들의 현상과 해결방법, 팁에 대해서 공유할 예정입니다.
저희와 함께 헤이딜러 서비스를 발전 시켜나가실 분들을 기다리고 있습니다. http://bit.ly/prnd-hiring 위의 채용링크로 많은 지원부탁드립니다.