
용어와 관련해서는 아래 공식문서 참조
https://developers.kakaopay.com/docs/payment/online/common#term-description
카카오페이 | 개발자센터
새로운 기회와 가치를 함께 만들어봐요
developers.kakaopay.com
결제 구조

위 모식도를 확인해보면 '결제준비 API'과 '결제승인 API' 두 개의 API로 나뉘어져 있는걸 확인할 수 있다.
문제 상황
내가 구상했던 흐름은 다음과 같다.

클라이언트에서 결제가 필요한 시점에 우리의 서버로 필요한 요청 값을 보내고, 서버에서는 카카오로부터 결제요청API에 대한 응답값을 받아온다.
그 후 서버에서는 tid값을 기반으로 DB에 데이터를 저장하고, 클라이언트에게는 redirec url만 보내주어 결제 프로세스를 진행할 수 있도록 한다.
클라이언트에서 결제가 완료되면 요청 시 보내주었던 approve_url로 카카오에서 pg_token을 쿼리파라미터로 붙여 리디렉션 시킨다.
여기서 문제가 발생한다.

공식문서를 확인해보면 결제승인 API를 위한 요청값으로 tid와 pg_token이 필요하다.
이외에도 결제요청 API의 요청값이였던 partner_order_id, partner_user_id 또한 필요하다.
그러나 클라이언트에서는 리디렉션으로 받은 pg_token만 가지고 있는 상황이다.
결제승인을 위한 tid값은 서버에서 이전에 받아 DB에 저장을 했지만 이후 결제승인에서 매핑할 방법이 없다.
문제에 대한 요약은 다음과 같다.
결제요청 API와 결제승인 API를 위한 결제 정보를 매핑할 방법이 없다.
이를 해결하기위해 다음과 같은 방법을 생각했었다.
CASE 1. 클라이언트에서 결제에 대한 모든 정보 저장
결제요청 API로 받은 tid 또한 클라이언트로 전송하여 해당 결제에 대한 모든 정보를 클라이언트에서 가질 수 있도록 하는 것이다.
이렇게 구성하면 결제요청 - 결제승인에 대한 일관성을 유지할 수 있다.
그러나 클라이언트에서 결제요청 API를 직접 전송하는 것과 다를 것이 없게된다. 즉 보안이 취약해질 수 있다는 말과 같다.
CASE 2. approve_url에 결제정보 매핑을 위한 값을 함께 전송
결제요청 - 결제승인을 위한 결제정보 매핑에 필요한 값들을 approve_url에 쿼리 파라미터에 추가하여 전송하는 방식이다.
이 또한 클라이언트에서 결제요청 API를 직접 전송하는 것과 다를 것이 없다고 생각한다.
이와 관련해서는 카카오페이 포럼에 FAQ로 등록된 게시글이 있으니 참고하면 좋을 것 같다.
https://developers.kakaopay.com/forum/t/faq-pg-token/399
[FAQ][파라미터] pg_token은 어떻게 받고 어떻게 사용하나요?
사용자가 결제인증에 성공한 경우 approval_url로 redirect 하며 url 뒤에 쿼리스트링으로 pg_token 값을 내려드리고 있습니다. pg_token 외에 다른 값은 제공되지 않으므로 결제정보 매핑 등을 위하여 필요
developers.kakaopay.com
CASE 3. CASE 2의 방식에서 order_id만 전송
처음에 설명한 것처럼 결제요청 시 DB에 tid를 비롯한 결제정보를 DB에 저장하는 것으로 구성했다.
이 때 PK는 order_id로 해당 id를 approve_url에 함께 전송하는 방식이다.
나의 경우 이 방식을 선택했는데, 불필요한 매핑 정보들을 클라이언트로 전부 전송할 필요가 없기 때문이다.
클라이언트에서는 결제 완료 후 리디렉션 url에서 order_id와 pg_token값만 추출 후 서버에 결제승인을 요청하기만 하면 되기에 더욱 편리하고, 불필요한 정보를 주지 않음으로써 보이지 않는 위험을 감소시킬 수 있을 것 같았다.
또한 서버에서도 order_id에 해당하는 결제 정보를 DB에서 찾고 결제승인 API를 요청하기만 하면 된다.
어떤 방식으로도 해결은 가능하지만 포럼에서 주로 제시하는 해결책은 아무래도 approve_url을 통한 매핑을 추천하는 것 같다.
'Develop > Project' 카테고리의 다른 글
채팅을 WebRTC로 하라고? (0) | 2024.08.05 |
---|---|
[프로젝트 회고] 나의 첫 팀 프로젝트 - CodeArena (0) | 2024.07.17 |
개발 기술 블로그, Dev
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!