한국의 개발자들을 위한 Google for Developers 국문 블로그입니다.
Google Play에서 게임과 플레이어 보호하기
2020년 4월 24일 금요일
게임의 무결성, 공정성 강화를 위한 개발자 도구 및 서비스
게시자:
Dom Elliott (Google Play 제품 매니저)
원문은
이 곳
에서 확인 가능하며 블로그 번역 리뷰는 김민구(Google)님이 참여해주셨습니다.
여러분이 게임을 개발한 후 플레이어에게 선보일 때, 본래 의도한 방식대로 플레이어가 게임을 경험하길 바라실 겁니다. 하지만 게임이 인기를 얻을수록 게임을 공격하거나 악용하는 사람이 늘어날 수 있습니다. 사람들이 게임을 변형하고 배포 및 수익 창출을 위한 수단을 악용하는 이유는 다양합니다. 이 중에는 비교적 피해가 적은 경우도 있으나, 비즈니스와 플레이어 커뮤니티에 악영향을 미치는 사례도 있습니다. 이에 따라 악용 방지를 위한 전략을 검토하고 각자의 목표에 맞춰 적절한 조치를 취하는 것이 필요합니다. 게임을 보호할 완벽한 해결책은 아니지만, 게임 보호를 위한 전략의 일부로 활용할 수 있는 몇 가지 Google Play 도구 및 서비스를 알려 드립니다.
무결성(Integrity)
게임 및 플레이어에 대한 공격은 수정된 APK, 에뮬레이터, 보안이 침해되거나 루팅된 기기와 같이 신뢰할 수 없는 환경에서 시작됩니다. 이러한 안전하지 않은 환경은 그 자체로는 유해하지 않을 수 있지만, 이러한 환경을 감지할 수 있다면 게임에서 각 상황에 대해 어떻게 대응할 지 결정할 수 있습니다. 예를 들어 공격자가 유료 게임을 플레이하지 못하도록 차단할 수도 있고, 무료 온라인 게임인 경우 에뮬레이터를 사용한다고 의심되는 플레이어를 전부 하나의 서버에 모을 수도 있습니다.
https://youtu.be/kAD0hkZ-KiA
이 동영상에서 Google Play 툴을 사용해 게임의 무결성을 보호하는 방안을 알려드립니다.
Google Play는 온라인 게임용 API를 제공하여 개발자가 이러한 상황을 더 손쉽게 탐지하고 올바른 대처 방안을 결정할 수 있도록 지원합니다. 또한 Google Play에서는 오프라인에서 작동하는 게임과 리패키징을 줄이려는 온라인 게임을 대상으로 자동으로 무결성을 보호해주는 기능의 새로운 개발자 프리뷰를 마련했습니다.
서버 주도 방식의 수동 무결성 진단(Manual, server-driven integrity check)
첫째,
Google Play 라이선스
는 플레이어가 Google Play에서 설치한 개발자의 바이너리를 그대로 사용하고 있는지 확인합니다. 둘째,
SafetyNet 증명
은 개발자에게 바이너리가 실행되고 있는 기기의 상태를 알려줍니다.
이러한 진단 기능은 서버 기반의 온라인 게임에서 게임 시작, 로그인, 랜덤 대결, 구매 등과 같은 하나 이상의 중요한 단계에 연결된 경우 효과적으로 작동합니다. 중요한 단계에 연결시키지 않은 상태로 클라이언트 측에서 진단 기능을 실행하면 공격자에 의해 삭제될 위험이 있습니다. 일반적으로 이러한 진단 기능은 다음 방법으로 통합합니다.
nonce 생성
: 진단 기능을 시작하기 위해 서버에 nonce를 생성합니다. nonce는 고유한 임의의 값으로서 nonce를 각 진단에 결부시키면 재전송 공격(replay attack)에서 긍정적인 응답을 복제하기 어려워집니다. 사용자 ID의 해시값과 같이 특정 요청에 해당하는 정보의 고유한 일부를 가능한 한 많이 사용해서 재사용하기 어려운 nonce를 생성하세요.
응답 요청
: 게임의 진단 기능에 nonce를 결부시키고 라이선싱 및 SafetyNet API를 호출합니다. SafetyNet 통합은 API 키를 필요로하며, API 호출은 하루 10,000건의 한도가 있습니다. 이보다 많은 API사용이 필요한 경우 할당량(quota) 증가를 요청하세요.
응답 수신
: 이러한 API는 Google 서버와 통신합니다. Google 서버에서는 개발자에게 사용자가 Play에서 제공하는 앱 라이선스를 보유하고 있으며 기기가 호환성 테스트를 통과한 실제 Android 기기로 판단되는지 알리기 위해 응답을 반환합니다. 또한 악성 호출을 피하려면 때때로 SafetyNet 응답 시간이 초과되는 경우에도 대비해야 합니다.
응답 전송
: 게임에서 nonce와 함께 Google의 응답을 게임 서버로 반환해야 합니다. 게임에서 진단 기능을 삭제하는 것을 어렵게 만들려면 서버 측에서 결과값확인(validation)을 처리해야 합니다.
응답 평가
: 서버에서는 nonce, 앱의 패키지명, 해시, 타임스탬프 등 모든 항목이 올바른지 확인하고 라이선스 및 기기에 관한 Google의 응답에 기반해 결정을 내려야 합니다. 예를 들어 사용자가 올바른 라이선스를 보유하고 있고, 신뢰할 수 있는 기기를 사용 중이면 플레이어가 게임을 진행하도록 허용할 수 있습니다.
이러한 API는 실제 게임에서 어떠한 성과를 거두었을까요?
이 영상
에서
Rovio
가
앵그리버드 2
의 리더보드를 개선한 방법과
Supercell
에서
브롤스타즈
를 출시하기 전 베타에서 승인되지 않은 플레이어가 게임을 플레이하는 비율을 크게 줄일 수 있었던 방법을 확인하세요.
클라이언트 측 자동 무결성 진단(Automatic, client-side integrity check)
이러한 API는 모든 종류의 게임이나 모든 상황에 도움이 되는 것은 아닙니다. 다른 많은 유료 게임 및 단일 플레이어 게임과 마찬가지로 게임이 오프라인에서 작동하도록 설계되었을 수 있습니다. 간단한 서버 연동만을 사용하중이거나, 서버가 아예 없는 게임을 운영 중인 경우
Google Play의 자동 무결성 보호
개발자 프리뷰에 참여하는 것을 고려해 보세요.
자동 무결성 보호에 등록한 게임을 Google Play Console에 업로드하면 Google Play에서 개발자를 대신해 라이선스 진단 및 조작 방지 기능을 게임 코드에 추가하므로, 개발자가 테스트 전에 관련 개발 작업을 하지 않아도 됩니다. 개발자는 게임 개발 시
Android App Bundle
을 사용하시기만 하면 됩니다. 자동 무결성 보호 기능의 장점은 개발자가 별도로 노력하지 않아도 기능이 지속적으로 개선된다는 것입니다. 조작 방지 기능은 온라인 게임의 리패키징 시도를 줄이는 데도 도움이 될 수 있습니다. 본 기능을 사용하여 출시할 게임을 보호하는 데 관심있으시면
Google에 알려주세요
.
공정성(Fairness)
인앱 구매를 제공하는 게임의 경우, 공정한 게임 경제의 균형을 맞추어야 전반적으로 최적의 플레이어 환경을 제공하면서 비즈니스를 지속적으로 성장시킬 수 있습니다. 하지만 악의를 가진 사용자가 다른 플레이어들을 이기거나 직접적인 금전적 이득을 취하기 위해 구매 및 아이템을 조작할 방법을 모색할 수도 있습니다. 이러한 행동은 다른 플레이어뿐만 아니라 개발자의 비즈니스에도 악영향을 끼칩니다.
Google Play 결제
에서는 게임에 통합시킬 수 있는 도구를 제공하여 Google에서 사기성 구매 및 악성 환불을 탐지하고 줄일 수 있도록 도움을 줍니다.
구매 확인(Validate purchases)
게임 디자인에서 허용되는 만큼, 인앱 구매 확인을 포함한 민감한 데이터 및 로직을 서버로 이동시키는 방안을 고려해 보세요. 게임 클라이언트 측에서 이러한 작업을 하면 게임이 리버스 엔지니어링에 취약해집니다. 구매를 확인할 때 구매 ID를 게임 서버로 전송하고, ID가 이전에 사용된 적이 없는지 점검한 다음 Play Developer API를 통해 Google Play에서 일어난 정상적인 구매인지를 확인한 후 사용자에게 게임 내 항목을 사용할 수 있는 권한을 부여하세요.
이와 더불어 구매를 처리할 때 Play에 난독화된 계정 및 프로필 ID를 전송하면 동일한 게임 내 계정 또는 캐릭터 프로필에
구매가 속하는지
확인할 수 있습니다. 구매를 확인할 때 이러한 ID를 백엔드로 전송하여 사용 권한을 받은 사용자가 구매한 사용자와 동일한지 확인하세요.
사기성 구매(Fraudulent purchases)
구매 요청이 있을 때마다 구매자의 개인 식별 정보가 아닌 부가적인 정보를 포함시키면, Google Play에서 사기성 구매를 탐지 및 차단하는 기능이 더 정확히 동작하도록 만들 수 있습니다. 구체적으로는
이 페이지의 방법
을 활용하여 사용자의 모든 구매 요청에 난독화된 사용자 게임 계정 ID를 첨부하면 됩니다. 또한 여러 개의 게임을 보유하고 있다면 모든 게임에서 사용자를 대표하는 보조 프로필 ID를 첨부해야 합니다. Google의 위험 관리 엔진에서는 이러한 ID를 사용하여 사기성 구매인지 평가하고 재판매 악용을 예방합니다. 상위 개발자들은 이 Google Play 결제 기능을 도입하고 긍정적인 결과를 얻었습니다. 사기 시도가 최대 30% 감소했으며 지불 거절로 인한 손해도 최대 50% 줄어들었습니다.
환불된 항목 상태(Refunded item status)
Google Play에서는 환불 여부를 결정하는 과정을 개선하기 위해 게임에서 인게임 구매와 관련된 추가 정보를 Play에 제공하는 기능을 테스트하고 있습니다. 이를 통해 환불 과정을 간소화하고 악용을 줄일 수 있습니다. 예를 들어 이미 소비한 아이템에 대해 반복적으로 환불을 받는 사용자를 더욱더 손쉽게 판별해 낼 수 있습니다. 사용자가 환불을 요청하면 Google Play에서 사용자의 환불 요청 및 사유에 관한 정보를 게임 측에 전달합니다. 게임 개발사는 사용자의 아이템 상태(사용자가 이미 아이템을 사용했는지 등)와 환불제공이 필요한 지 여부에 대한 정보를 공유합니다. Google Play에서는 이 정보를 사용하여 올바른 환불 결정을 내릴 수 있도록 돕습니다. 이 기능은 플레이의 일부 파트너들과 함께 테스트되고 있으며, 추후 더 많은 파트너들에게 제공될 예정입니다.
무효화된 구매(Voided purchases)
개발자는
Voided Purchases API
를 통해 사용자가 Google Play에서 환불받은 인앱 구매의 목록을 언제든지 요청할 수 있습니다. 이후 플레이어의 인벤토리를 업데이트하고 환불된 아이템을 삭제하거나 플레이어의 환경에 다른 변화를 줄 수 있습니다. 이러한 조치를 취하면 인게임 아이템의 가치가 유지되고 악의적인 행동의 동기가 줄어들게 됩니다. 상위 개발자의 80%가 현재 Voided Purchases API를 통합하고 있으며 그중 일부는 환불액이 최대 80%까지 감소했습니다. 다음은 Voided Purchases API를 효과적으로 사용하기 위한 몇 가지 도움말입니다.
Voided purchase
API를 자주, 그리고 정기적으로 호출하여 사용자가 구매한 아이템의 목록을 업데이트합니다.
사용자 계정에서 환불된 아이템을 삭제합니다.
아이템 삭제 시 사용자에게 이를 알립니다.
회수가 실패한 경우
조치를 취합니다. 여러 차례 회수가 실패한 경우 구매 제한 등 더욱 강력한 조치를 취하는 것이 좋습니다.
사용자가 이미 인게임 통화를 소비한 경우 계정 잔액을 마이너스로 표시합니다.
계정 잔액이 마이너스이면 인게임 기능을 제한하는 방안을 고려합니다.
보안(Security)
안전한 Android 앱 개발은 크고 중요한 주제이므로 여기에서는 간략하게
다루도록 하겠습니다. 공격자가 게임의 취약점을 발견하고 악용하는 경우 상황이 매우 심각해질 수 있습니다. 그 결과 플레이어가 곤경에 처하고, 게임 홍보에도 부정적으로 영향을 미치며, 규제기관으로부터 벌금이 부과되는 상황까지도 발생할 수 있습니다. 이에 따라 게임을 개발할 때
보안 개발 권장사항
을 준수하고
보안 체크리스트
를 확인하시길 권장드립니다. 특히 데이터, 권한, 네트워크 트래픽을 다룰 때는 각별히 주의하시기 바랍니다.
3rd-party 라이브러리 및 SDK
타사 라이브러리 및 SDK가 게임 코드의 큰 부분을 차지하는 경우가 많다는 점을 감안했을 때 이러한 라이브러리와 SDK가 가장 중대한 보안 위험 요인이 될 수 있습니다. 라이브러리 자체가 악성인 경우도 있지만, 대부분의 경우 라이브러리 또는 SDK의 약점에서 위험이 발생합니다. 개발자는 타사 라이브러리 및 SDK 등 게임에 포함된 모든 콘텐츠에 책임이 있기 때문에, 이러한 경로를 통한 보안 위반도 개발자의 책임에 해당합니다. Google Play는 게임 개발자가 인식하지 못했더라도 SDK 문제가 발생하면 게임을 정지시킵니다. 그러므로 다음의 권장사항을 명심해 주시기 바랍니다.
SDK에서 액세스하는 데이터 및 기기 정보를 분석하고 모든 데이터에 액세스하기 전에 적절한 사용자 동의를 얻습니다.
SDK에서 최소한의 targetSdkVersion을 지원하는지 확인합니다.
SDK에서 재설정이 불가능한 하드웨어 식별자를 수집하지 않는지 확인합니다.
게임이 제거될 때 외부 저장소에서 모든 SDK 고유 파일을 삭제합니다.
서버와의 커뮤니케이션에 HTTPS만 사용합니다.
Play 아카데미에서
SDK 사용 권장사항
을 자세히 알아보세요.
Google Play 보안 리워드 프로그램
마지막으로
, 플레이어가 많은 인기 게임을 운영 중이라면
Google Play 보안 리워드 프로그램
에 참여하시기 바랍니다. 이 프로그램은 여러분의 게임에서 취약점을 발견하여 공개한
보안 연구자에게 Google이 보상을 지급하는 버그 사냥 프로그램입니다. 여러분은 이렇게 발견된 취약점을 해결하여 장기적으로 사용자를 보호할 수 있습니다.
마치면서
어떤 경제에도 이를 악용하는 사람들이 있듯이 모바일 게임 환경도 예외는 아닙니다. 단순히 남들보다 앞서나가고 싶은 플레이어와 같이 위험 수준이 비교적 낮은 경우도 있지만, 게임이나 플레이어 정보를 조작하여 금전적인 이익을 얻으려는 사람도 있습니다. 이 때문에 Google Play에서는 개발자가 위험에 적절히 대응하고 플레이어 및 비즈니스에 미칠 위험을 최소화할 수 있도록 다양한 도구와 서비스를 제공하고 있습니다. 도구가 어떻게 개선될 수 있을지, 누락된 기능이 있는지에 관해 의견이 있으시면 언제든지 알려주시기 바랍니다.
원문
에 댓글을 남겨 주시거나
#AskPlayDev
를 통해
@GooglePlayDev
로 트윗을 보내주세요.
Contents
ML/Tensorflow
Android
Flutter
Web/Chrome
Cloud
Google Play
Community
Game
Firebase
검색
Tag
인디게임페스티벌
정책 세미나
창구프로그램
AdMob
AI
Android
Android 12
Android 12L
Android 13
Android 14
Android Assistant
Android Auto
Android Games
Android Jetpack
Android Machine Learning
Android Privacy
Android Studio
Android TV
Android Wear
App Bundle
bootcamp
Business
Chrome
Cloud
Community
compose
Firebase
Flutter
Foldables
Game
gdg
GDSC
google
Google Developer Student Clubs
Google Play
Google Play Games
Interview
Jetpack
Jetpack Compose
kotlin
Large Screens
Library
ma
Material Design
Material You
ML/Tensorflow
mobile games
Now in Android
PC
Play Console
Policy
priva
wa
wear
Wearables
Web
Web/Chrome
Weeklyupdates
WorkManager
Archive
2024
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2023
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2022
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2021
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2020
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2019
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2018
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2017
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2016
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2015
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2014
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2013
12월
11월
10월
9월
8월
7월
6월
5월
4월
3월
2월
1월
2012
12월
11월
10월
9월
8월
7월
6월
5월
3월
2월
1월
2011
12월
11월
Feed