코딩관계론

결제서비스 - Checkout 서비스 구현 [#50] 본문

개발/Hot-Stock

결제서비스 - Checkout 서비스 구현 [#50]

개발자_티모 2024. 9. 3. 02:33
반응형

서론

이 글에서는 쿠팡의 결제 서비스에서 Checkout 프로세스를 어떻게 처리하고 있는지 분석하고, 특히 Checkout ID의 보안 및 관리에 대해 논의하고자 합니다. Checkout ID는 결제 프로세스의 핵심 요소로, 올바르게 관리되지 않으면 보안 취약점이 발생할 수 있습니다. 따라서 이 글에서는 Checkout ID의 생성, 저장, 그리고 만료 처리 방법에 대해 심도 있게 다루고자 합니다.

 

Checkout Response 분석

이 Response에서 주목할 부분은 checkoutId와 checkoutUrl입니다. 이들이 외부에 노출되거나 변조될 경우, 결제 과정에 보안 문제가 발생할 수 있습니다. 따라서 쿠팡에서는 어떻게 이러한 문제를 해결했는지에 대해서 알아보겠습니다.

https://checkout.coupang.com/order

{
    "success": true,
    "resultTypeCode": "SUCCESS",
    "data": {
        "status": "GOOD",
        "code": 0,
        "object": {
            "paymentToken": "8a24d9ce61ad41cf9309c61e0888133a",
            "payServiceId": "COUPANG",
            "orderId": 8100067101369,
            "checkoutId": "1725209996060",
            "payType": "ROCKET_CARD",

            "successReturnUrl": "https://checkout.coupang.com/paymentResult?checkoutId=1725209996060&thankYouPageUrl=https%3A%2F%2Fmc.coupang.com%2Fdesktop%2Fthank-you%3ForderId%3D8100067101369%26price%3D34200%26retailPrice%3D34200%26payType%3DROCKET_CARD%26checkoutId%3D1725209996060%26hasCoupangGlobal%3Dfalse%26agentType%3DWEB%26isDirectOrder%3Dfalse%26checkoutType%3DDEFAULT",
            "failReturnUrl": "https://checkout.coupang.com/paymentResult?checkoutId=1725209996060",
            "checkoutUrl": "https://checkout.coupang.com/cart/checkout/1725209996060?paymentFailed=true",
            }
    }
}

 

Checkout ID의 변조에 대한 대응 방안

Checkout ID를 변조하여 결제 요청을 시도할 경우, 쿠팡 서버는 유효하지 않은 checkoutId에 대해 500 Internal Server Error를 반환하고, 사용자를 홈 페이지로 리다이렉션 합니다. 이는 변조된 checkout ID에 대한 접근을 차단하기 위한 기본적인 보안 메커니즘입니다.

 

다만, 정말 해당 Checkout ID가 없어서 그런지는 추가적으로 확인이 필요합니다. 그 이유는 보통 권한이 없으면 403으로 응답을 하기 때문입니다.

 

다중 Checkout ID 생성 시의 처리

사용자가 여러 개의 Checkout ID를 생성할 수 있는 상황, 예를 들어 다중 장바구니 생성 후 각각의 결제를 시도하는 경우, 각 결제 프로세스마다 고유한 Checkout ID가 부여됩니다. 쿠팡에서는 각 결제 흐름을 독립적으로 관리하여, 동시에 여러 결제 프로세스가 충돌하지 않도록 보장합니다.

 

아래의 그림에서 "필터월드", "오브젝트" 책을 각각 구매하게 되면 다른 Checkout ID가 부여됩니다. 

 

 

Checkout ID는 어디에 저장하는 것이 맞을까?

Checkout ID는 전역적으로 고유해야 하며, 결제 관리를 위한 중요한 필드임으로 다음과 같은 두 가지 이유로 데이터베이스에 저장하는 것이 맞습니다.

  1. 레디스는 휘발성이기 때문에 서버가 꺼지게 된다면 고객의 신뢰를 잃어버리게 된다
  2. 전역성을 보장하기 위해서는 데이터베이스 접근이 필수이다.

따라서 최종적인 순서도는 다음과 같습니다.

Checkout ID 삭제 전략

Checkout ID는 결제 프로세스에서 중요한 역할을 합니다. 적절한 시점에 이를 삭제하지 않으면, 불필요한 데이터가 축적되거나 보안 취약점이 발생할 수 있습니다.

1. Order의 시작 여부 기반 삭제

Order가 생성된 후 결제 프로세스가 시작되지 않은 상태라면, 일정 시간이 지난 후 Checkout ID를 삭제할 수 있습니다. 예를 들어, Order가 생성된 후 24시간이 경과했지만 "Not Started" 상태라면, 해당 Checkout ID를 안전하게 삭제할 수 있습니다

반응형