결제 검증 오류 복구력 개선
목차
Apple IAP(In-App Purchase) 시스템의 영수증 검증 로직을 개선했다. 기존에는 sandbox 환경에서만 폴백을 적용했는데, 이제 프로덕션 환경의 비정상 응답 전반으로 그 범위를 확대한 변경이다.
결제 검증과 폴백의 역할
IAP에서 영수증 검증은 사용자가 실제로 결제를 완료했는지 확인하는 핵심 보안 체크포인트다. 클라이언트가 결제를 완료하고 영수증을 서버로 전송하면, 우리는 그걸 Apple 검증 서버로 보내서 진짜인지 확인한다. 이 단계가 없으면 조작된 영수증으로 구독을 가장할 수 있으니까, 상당히 중요하다.
Apple은 두 가지 검증 환경을 운영한다. 개발/테스트용 sandbox와 실제 결제를 다루는 production이다. 여기서 문제가 생긴다. Apple 서버도 가끔 예상치 못한 응답을 보낸다. 타임아웃, 500 에러, 또는 형식에 맞지 않는 응답 말이다. 이 순간에 우리가 단순히 "검증 실패"로 판단하면, 실제로 결제한 사용자도 "결제 실패"로 처리돼서 구독 서비스를 못 쓰게 된다.
그래서 폴백이 필요하다. Apple 서버의 응답이 비정상일 때, 클라이언트가 보낸 영수증을 일단 신뢰하고 사용자의 요청을 승인해주되, 나중에 재검증 대기 상태로 표시한다. Apple 서버가 정상화되면 비동기 배치 작업으로 정합성을 맞춘다.
왜 범위를 확대했는가
기존에는 이 폴백을 sandbox 환경에서만 적용했다. sandbox가 테스트 환경이니까 Apple 서버도 덜 안정적이라는 생각이 있었을 거다. 하지만 현실은 production에서도 비정상 응답이 간간이 발생한다. 특히 대량 트래픽이 몰릴 때, Apple 측 점검이 있을 때 그렇다.
이번 수정으로 이제 sandbox와 production 구분 없이, Apple 서버에서 비정상 응답을 받으면 일관되게 폴백을 적용한다. 특정 예외 조건들(타임아웃, HTTP 5xx, 파싱 실패 등)을 포괄적으로 감지해서 폴백 경로로 넘긴다는 뜻이다.
결제 시스템의 철학
결제 시스템은 "지금 이 순간 사용자 경험을 해치지 말고, 백엔드에서는 천천히 정합성을 맞춰나간다"는 철학이 통한다. Apple 서버가 지금 응답하지 못하더라도, 우리가 사용자를 막는 건 아니라는 뜻이다. 대신 그 거래를 "미검증" 상태로 기록해두고 나중에 재시도한다.
이 변경을 하면서 든 생각은 두 가지다. 첫째, 외부 서비스의 안정성을 맹목적으로 신뢰하면 안 된다는 것. Apple은 큰 회사지만, 우리의 요청이 항상 critical하지는 않을 수 있다. 두 번째로, 폴백 로직은 환경(sandbox/prod)에 따라 달라야 할 이유가 없다. 예외 상황에 대한 대응은 환경이 뭐든 일관되어야 한다. 환경마다 다르게 처리하면, 개발 중에는 안 보이던 버그가 운영 중에 터지는 식의 불일치 문제가 생긴다.
이런 식의 개선은 큰 기능 추가는 아니지만, 시스템의 탄력성을 한 단계 올린다. 외부 의존성이 있는 다른 곳(배송 조회, 써드파티 인증 등)에서도 비슷한 접근을 할 때 참고할 수 있다.
🛒 이 글과 어울리는 추천 상품
*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.
댓글 0
첫 댓글 달아줘.