쿠폰과 할인으로 앞다리살 하나 더 판매한 이야기
왜 그 손님은 쿠폰을 사용하지 못했나
문제의 발견
2019년 12월 17일경 약 11만 건의 쿠폰이 발급되었고 당일 저녁 10시 12분경 위와 같은 현상이 보고되었다.
위 오류는 사용할 수 없는 쿠폰을 사용 시도한 경우로 사용자 UI 상에서는 이뤄질 수 없는 시스템 오류 혹은 공격의 가능성이 있는 현상이기 때문에 분석을 진행하였다.
분석
Zipkin 조회
보고된 traceId
를 이용하여 zipkin
에 조회를 해보면 호출 주소를 바탕으로 사용자 정보와 쿠폰 정보를 알 수 있다.
사용자 번호 : 3391434
쿠폰발행번호 : 100086725 (1만원 할인쿠폰 (3만원 이상 주문,19일 24시까지))
Restful 한 URI 설계는 오류 추적에도 상당한 도움이 되는 것을 느낄 수 있었다.
3만원에 1만원 할인 쿠폰이라니 파격적! 나도 가지고 싶다
API 호출 로그 조회
zipkin
을 통해서 알아낸 사용자 번호를 기반으로 해당 사용자의 API 호출 이력을 API 호출 로그를 조회 할 수 있는 Kibana
를 통해 조회해 본다.
호출 로그에서 22시 12분에 해당 로그가 확인되고 보고 시점과 동일하다.
그 바로 아래 주문서 쿠폰 조회 API 호출 로그가 존재하는데
로그 내용을 보면 주문서 단계에서는 해당 쿠폰이 사용 가능 상태로 리턴된 것을 확인 할 수 있었다.
위 로그 조회를 통해 아래와 같이 결론을 내릴 수 있다.
주문서에서 사용 가능했던 쿠폰이 결제 단계에서 사용 불가능해 졌다.
왜 이런 현상이 발생하였는지 알기 위해서 서버 측 로그도 조회하여 주문서 단계와 결제 단계에서의 호출 파라메터를 비교해 보았다.
traceId를 기반으로 조회한 서버 측 로그
장바구니 정보 분석
주문서와 결제단계에서의 API 호출 파라메터는 모두 사용자의 장바구니 정보를 사용하고 있고
단계별로 해당 사용자의 장바구니 정보는 아래와 같았다.
주문서 (22:05:07)
상품명 | 가격 |
---|---|
정직한 구운란 | 1800 |
오로라 생연어 400g | 18400 |
[산타특가][산지직송] 타이벡 감귤 | 9880 |
총 가격 : 30,080
주문서 (22:12:51)
상품명 | 가격 |
---|---|
정직한 구운란 | 1800 |
오로라 생연어 400g | 17250 |
[산타특가][산지직송] 타이벡 감귤 | 9880 |
총 가격 : 28,930
결제단계에서 오로라 생연어 400g
상품의 가격이 변동되었다.
위 내용을 정리하면 아래와 같다
사용자는 알뜰하게 장바구니에 30,080원을 담아 쿠폰 사용조건에 맞췄으나
결제단계에서 상품가격이 변동되어 28,930원이 되어 쿠폰 사용조건에 맞지 않게 되었다.
주문서에서 결제단계로 넘어갈 때 약 6분의 시간이 소요되었고,
가격의 차이를 볼 때 사용자의 악의적인 장바구니 가격조작의 가능성은 없을 것으로 보여 해당 상품의 할인 정보를 조회하였다.
조회 결과 공교롭게도 그 사이에 할인율이 변동 (20% → 25%
) 된 것을 확인 할 수 있었다.
결론적으로는 상품의 가격이 변동되어 쿠폰 사용조건에 미달하였기 때문에
위 상황에서 쿠폰 사용이 되지 않도록 어플리케이션에서 잘 방어한 것을 검증 할 수 있는 케이스였다.
그래서 그 사용자는 어떻게 하였나
그 이후 로그를 보면 결국 사용자는 쿠폰을 사용해서 주문을 한 것을 알 수 있다.
다행스럽게도 사용자는 친절하지 않은 UI에도 불구하고,
자신이 장바구니에 담은 상품이 쿠폰 사용조건에 미달하였다는 것을 눈치챘고
정직한 구운란
을 장바구니에서 빼고 [돈마루] 한돈 앞다리살 (찌개용)
상품을 추가로 구매하여 쿠폰을 사용하였다.
주문서 (22:12:51)
상품명 | 가격 |
---|---|
오로라 생연어 400g | 17250 |
[산타특가][산지직송] 타이벡 감귤 | 9880 |
[돈마루] 한돈 앞다리살 (찌개용) | 3960 |
총 가격 : 31,090
뭐..한 1,010원 매출 추가한 이야기