강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

우으어으님의 프로필 이미지
우으어으

작성한 질문수

제미니의 개발실무 - 커머스 백엔드 기본편

코드 느끼기

금액 계산은 서버에서하고 클라이언트는 가격 정보를 주지 않았을 때

작성

·

22

·

수정됨

1

안녕하세요!
금액 계산은 클라이언트 조작 문제 떄문에 서버에서 담당해야한다고 말씀해주셨는데요, 그렇다면 클라이언트에서는 식별값만을 주고 가격정보는 주지 않았을 때 문제는 없을까요?

예를 들어 클라이언트가 한 화면에서 오래 머무르는 동안 상품 가격이나, 할인 등 총 결제 금액을 계산하는데 있어 변동 사항이 생겼을 때 클라이언트가 보고 있는 가격과 서버에서 요청 시점에서 계산한 가격이 일치하는지까지 봐야하지 않나라는 생각이 들어 질문드립니다..!

서버에서 현재 상태를 기준으로 가격을 계산하고 처리했을 때, 사용자 입장에선 자신이 본 가격과 다른 가격으로 계산될 수도 있지 않을까요??

가격을 결정짓는 요소들이 변경되었는지를 서버에서 판단해서 요청 실패처리를 할 수 있겠지만, 요소들이 많다면 각각을 버저닝하고 확인해야 하는 형태가 될 거 같기도 해서..

클라이언트에서 확인한 가격 정보를 서버에 넘기고, 서버에서 실시간으로 계산한 금액과 일치한다면 성공시키는 구현 형태는 실무에서 잘 쓰지 않는 것인지 궁금합니다!

답변 3

1

제미니님의 프로필 이미지
제미니
지식공유자

안녕하세요 질문 감사합니다!
일반적인 경우에는 크게 문제가 없습니다!


물론 장바구니 화면을 오래 켜두다가 클릭해서 들어갈 수 있지만, 주문 화면으로 넘어오면 주문 금액이 있기 때문에 고객이 이상하다면 충분히 눈치를 챌 수 있을 정도인 것 같습니다!
(주문 후엔 이미 금액이 스냅샷으로 박혀있기 때문에 주문화면에서 늦게 결제하는건 당연히 문제 사항아님)


다만 이런 일이 많거나 미묘한 금액 차이도 발생 시 문제가 클것으로 예상 된다면 클라이언트가 금액을 보내주면 금액 검증 전용 로직을 추가해둘 수 있을 것 같습니다

추가로 버저닝을 하는 형태나 단순 검증 로직 이상의 복잡도는 대부분의 서비스에선 불필요할 것으로 예상됩니다! (주객전도가 아닌지 검토가 필요해 보입니다!)

단순히 클라이언트가 totalAmount 를 보내면 서버에서도 Order 생성 시 totalAmount 를 비교해서 금액이 다르면 에러를 던져주면 되는 것 이니까요!


모쪼록 답이 되었길 바랍니다! 감사합니다!

0

우으어으님의 프로필 이미지
우으어으
질문자

답변 감사합니다! 가격을 결정짓는 모든 요소를 하나하나 비교하기보다 최종 결제값만을 비교하는 것도 한 방법이 될 수 있겠네요..!

혹시 추가적으로 이런 케이스는 적겠지만, 만약 유저가 주문하기 버튼을 누르기 직전에 어드민에서 상품 정보가 바뀐 경우 해당 주문은 팅겨내라는 요구사항이 있다면, 이는 상품에 버저닝을 해서 검증을 해야할까요?!

0

안녕하세요, 인프런 AI 인턴입니다. 우으어으님.

서버와 클라이언트 간의 가격 불일치 문제는 전자상거래 시스템에서 종종 발생할 수 있는 이슈입니다. 이런 문제를 해결하기 위한 몇 가지 접근 방식을 소개해드립니다.

서버의 역할과 가격 검증

  1. 서버에서의 금액 계산:
    서버는 항상 최신의 상품 가격 정보를 유지하며 금액을 재계산하는 역할을 맡아야 합니다. 클라이언트의 조작에 의한 가격 변동을 방지하기 위해 서버는 클라이언트로부터 전달된 가격 정보를 신뢰하지 않고, 항상 서버의 최신 데이터를 기반으로 가격을 재검토합니다.

  2. 클라이언트-서버 간 동기화 문제:
    클라이언트가 오래된 페이지에서 결제를 시도할 경우, 서버는 그 사이에 발생한 가격 변동을 감지하고 결제를 거부하거나 재확인 요청을 해야 할 필요가 있습니다. 이를 위해, 다음과 같은 방식을 고려할 수 있습니다:

    • 버저닝: 각 상품이나 할인 정책, 클라이언트에서 볼 수 있는 데이터에 대해 버저닝 시스템을 도입하여, 서버가 클라이언트가 가지고 있는 정보의 버전을 확인할 수 있도록 합니다.
    • 최신 가격 확인: 클라이언트가 서버로 결제 요청을 보낼 때, 서버는 요청 시점의 가격과 클라이언트가 보유한 가격 정보를 비교하여 확인합니다. 다를 경우, 이를 클라이언트에 알리고 새롭게 업데이트된 정보로 결제가 진행되도록 안내합니다.
  3. 최종 가격 검증:
    결제 요청을 서버에 전달할 때, 클라이언트로부터 상품 ID, 수량 등의 정보만 받습니다. 서버는 항상 최신 데이터로 금액을 계산하여 최종 결제 금액을 확정합니다.

실무에서는 종종 최신 정보를 기반으로 서버가 최종 검증을 수행하지만, 클라이언트가 본 정보를 참고하여 사용자에게 최신 정보를 전달하는 장치도 필요합니다. 이렇게 함으로써, 클라이언트는 결제 전에 항상 최신 가격 정보를 재확인하고, 이에 따라 결제가 진행되도록 할 수 있습니다.

관련하여 유사한 사례와 해결 전략을 다루는 게시물을 추천드립니다:
- Controller에서 비즈니스 로직 흐름이 나타나는 것에 대하여.. - 서버와 클라이언트 간 로직 흐름에 대한 논의를 확인할 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

우으어으님의 프로필 이미지
우으어으

작성한 질문수

질문하기