쿠폰과 할인으로 앞다리살 하나 더 판매한 이야기

왜 그 손님은 쿠폰을 사용하지 못했나

문제의 발견

image-20191218-013806.png

2019년 12월 17일경 약 11만 건의 쿠폰이 발급되었고 당일 저녁 10시 12분경 위와 같은 현상이 보고되었다.

위 오류는 사용할 수 없는 쿠폰을 사용 시도한 경우로 사용자 UI 상에서는 이뤄질 수 없는 시스템 오류 혹은 공격의 가능성이 있는 현상이기 때문에 분석을 진행하였다.

분석

Zipkin 조회

image-20191218-014118

보고된 traceId를 이용하여 zipkin에 조회를 해보면 호출 주소를 바탕으로 사용자 정보와 쿠폰 정보를 알 수 있다.

사용자 번호 : 3391434
쿠폰발행번호 : 100086725 (1만원 할인쿠폰 (3만원 이상 주문,19일 24시까지))

Restful 한 URI 설계는 오류 추적에도 상당한 도움이 되는 것을 느낄 수 있었다.

3만원에 1만원 할인 쿠폰이라니 파격적! 나도 가지고 싶다

API 호출 로그 조회

zipkin을 통해서 알아낸 사용자 번호를 기반으로 해당 사용자의 API 호출 이력을 API 호출 로그를 조회 할 수 있는 Kibana를 통해 조회해 본다.

kibana-0

호출 로그에서 22시 12분에 해당 로그가 확인되고 보고 시점과 동일하다.

kibana-1

그 바로 아래 주문서 쿠폰 조회 API 호출 로그가 존재하는데

로그 내용을 보면 주문서 단계에서는 해당 쿠폰이 사용 가능 상태로 리턴된 것을 확인 할 수 있었다.

위 로그 조회를 통해 아래와 같이 결론을 내릴 수 있다.

주문서에서 사용 가능했던 쿠폰이 결제 단계에서 사용 불가능해 졌다.

왜 이런 현상이 발생하였는지 알기 위해서 서버 측 로그도 조회하여 주문서 단계와 결제 단계에서의 호출 파라메터를 비교해 보았다.

image-20191218-021756

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분의 시간이 소요되었고,

가격의 차이를 볼 때 사용자의 악의적인 장바구니 가격조작의 가능성은 없을 것으로 보여 해당 상품의 할인 정보를 조회하였다.

image-20191218-023918.png

조회 결과 공교롭게도 그 사이에 할인율이 변동 (20% → 25%) 된 것을 확인 할 수 있었다.

결론적으로는 상품의 가격이 변동되어 쿠폰 사용조건에 미달하였기 때문에

위 상황에서 쿠폰 사용이 되지 않도록 어플리케이션에서 잘 방어한 것을 검증 할 수 있는 케이스였다.

그래서 그 사용자는 어떻게 하였나

kibana-2

그 이후 로그를 보면 결국 사용자는 쿠폰을 사용해서 주문을 한 것을 알 수 있다.

다행스럽게도 사용자는 친절하지 않은 UI에도 불구하고,

자신이 장바구니에 담은 상품이 쿠폰 사용조건에 미달하였다는 것을 눈치챘고

정직한 구운란을 장바구니에서 빼고 [돈마루] 한돈 앞다리살 (찌개용) 상품을 추가로 구매하여 쿠폰을 사용하였다.


주문서 (22:12:51)

상품명 가격
오로라 생연어 400g 17250
[산타특가][산지직송] 타이벡 감귤 9880
[돈마루] 한돈 앞다리살 (찌개용) 3960

총 가격 : 31,090


뭐..한 1,010원 매출 추가한 이야기