본문 바로가기

진리는어디에

구글 인앱(in-app) 결제 서버 인증의 불편한 진실

구글 in-app 결제 관련하여 알고계신 분들도 있지만 잘못 알려진 부분도 있는 것 같아 공유 드립니다.

 

Q. in-app 결제 영수증 검증 시스템은 구글에서 제공하는 것을 이용한다?

A. 아닙니다. 구글 결제 시스템은 google play를 이용하여 클라이언트와만 연동 됩니다실질적으로 아이템을 지급하는 게임서버와 구글 시스템과는 아무런 연동이 없습니다. 영수증의 인증은 게임 서버가 직접 해야 합니다.

 

Q. 그럼 결제 발생시 웹 콜은 왜 하나요? 

A. 해당 호출은 구글 시스템에 질의하는 것이 아닙니다. 서버가 C++등 언어 차원에서 인증 라이브러리를 제공하지 않는 경우 웹 서버를 두고 php와 같이 라이브러리 차원에서 인증을 지원하는 언어를 사용하는 경우가 많습니다. 그렇다고 그 웹 서버들이 구글에게 질의하는 것은 아니고 php의 경우 openssl_verify 라는 함수를 이용하여 0 또는 1만을 리턴하고 있습니다.

이전 포스팅 (C++로 구글 In-app 결제 검증 구현)은 해당 기능을 구현한 함수를 C++ 버젼으로 만든 것이며 이를 이용해 웹 서버를 따로 두는 비용, 질의간 발생하는 시간 및 트래픽 비용을 줄일 수 있습니다.

 

   참고 : Open Source PHP IAB Verification Library 

 

Q. 웹 콜을 이용해 지급요청 하는 상품과 영수증이 일치하는지 알수 있다?

A. 아닙니다. 웹 서버는 public key와 원문 데이터를 이용해 암호화 한 다음 주어진 signature와 동일한지만 검사합니다클라이언트에서 1달러 짜리 구매를 하고 발급 받은 영수증 데이터 게임 서버에 100달러 짜리 상품을 요청하며 제출 한다고 해도 웹서버에서는 정상적인 영수증이라면 ok를 리턴 합니다. 1달러 영수증인지 100달러 영수증인지를 검증하는 것은 게임 서버에서 해야 합니다.

 

Q. 웹 콜을 이용해 영수증이 재 사용되는지 검증 할 수 있다?

A. 아닙니다. 위에서 언급했다 싶이 웹 서버는 영수증의 정합성만을 검증합니다. google play에서 정상적으로 발급된 영수증이라면 몇 번이라도 ok를 리턴합니다. 영수증 재사용 여부 역시 게임 서버에서 검증해야 합니다.

 

Q. 게임 서버에서는 어떻게 상품과 영수증의 정합성, 재사용 여부를 알 수 있는가?

A. 2011 google IO 세션에서 소개된 방업은재 클라이언트에서 결제가 발생하기 전 서버로부터 임시값을 발급 받습니다(임시값은 1회성이며 유일성이 보장되어야 합니다). 이 임시값을 in-app결제 요청 json data의 developerPayload에 넣어 구매를 진행 합니다. developerPayload는 어플리케이션 개발자 임의로 지정할 수 있는 값으로써, 결제 결과 리턴시 그대로 리턴 되며 signature를 만들 때 데이터로 사용되므로 해당 데이터가 다르다면 정합성 인증에서 실패합니다. 게임 서버에서는 임시값에 대한 상품이 지급 되었는지 아닌지 체크하여 결제 성공 여부를 결정하면 됩니다. 


정상적인 상품과 영수증의 관계 또한 productId(구글 developer console에 등록) 항목을 이용해 검증 가능합니다. 게임 서버에서 productId와 지급 아이템의 매핑 테이블을 가지고 있다가 productId와 매칭 되는 아이템을 지급 해줘야 합니다.


 참고 : Android In-App Billing: Server Verification and Content Delivery 

          Google IO session video 

          Google IO session presentation slides

유익한 글이었다면 공감(❤) 버튼 꾹!! 추가 문의 사항은 댓글로!!