비회원 결제 후 주문완료 화면이 막히던 문제 수정
목차
발단
비회원으로 결제까지 마쳤는데 주문완료 페이지에서 로그인 화면으로 튕긴다는 제보가 들어옴. 결제는 성공, 돈은 빠져나갔는데 주문번호를 확인 못 하는 상황. CS 입장에서 제일 짜증나는 케이스라 우선순위 끌어올려서 바로 잡았음.
원인 추적
비회원 차단 인터셉터가 /order/** prefix 전체를 막고 있었음. 의도는 마이페이지·주문조회 같은 회원 전용 영역 보호였는데, 결제 직후 리다이렉트되는 주문완료 URL까지 같은 prefix 아래라 같이 걸려버림.
세션 흐름 확인:
결제대행사 콜백 → /order/complete?orderId=XXX
↓
차단 인터셉터: 세션에 회원ID 없음 → 로그인 페이지로 강제 이동
↓
사용자: 주문번호 영영 못 봄
막힌 지점
- 비회원 토큰은 세션에 심어둔 상태였는데 인터셉터가 회원ID만 검사하고 있었음
- 주문 SQL 자체는 회원·비회원 모두 잘 조회됨 (이건 멀쩡)
- 즉 게이트웨이만 잘못 닫혀있던 전형적인 케이스. 비즈니스 로직은 손댈 필요 없었음
수정 방향
차단 화이트리스트에 주문완료 경로를 추가하되, 아무 주문번호나 입력해도 보이면 안 되니까 세션의 비회원 토큰과 주문번호 매핑 검증을 한 단계 끼움.
| 항목 | 변경 전 | 변경 후 |
|---|---|---|
| /order/complete | 무조건 차단 | 세션 토큰 일치 시 통과 |
| /order/list | 차단 유지 | 차단 유지 |
| 주문 조회 SQL | 회원ID 조건만 | 비회원 토큰 조건 분기 추가 |
SQL 쪽은 비회원 주문 조회 시 토큰까지 같이 매칭하도록 WHERE 절을 보강했음. 다른 사람 주문번호를 추측해서 URL로 들어와도 세션 토큰이 안 맞으면 빈 결과 반환. 차단 우회로 노출되는 IDOR 가능성도 같이 닫아둔 셈.
회고
- 인터셉터 화이트리스트가 "회원 전용 보호" 관점으로만 짜여 있었음. 비회원 결제 플로우는 별도 트랙으로 아예 인지가 안 돼 있었던 게 근본 원인
- 결제 성공 직후 화면 안 보이는 버그는 환불 문의로 곧장 이어져서 CS 부담이 큼. 우선순위 끌어올린 건 잘한 판단
- 다음에 비슷한 접근 제어 정책 짤 때는 회원/비회원 트랙별로 보호 경로를 표로 먼저 매핑해놓고 시작해야겠음. 화이트리스트가 어디까지 열려야 하는지 코드만 봐서는 안 보임
다음
댓글 0
첫 댓글 달아줘.