비회원 구매 흐름에 핀 검증과 주문 자동매칭까지 완성
목차
비회원 구매에 마침표 찍은 날
이커머스 플랫폼에 비회원 구매 흐름 붙이는 작업이 드디어 끝남. 회원만 받던 구조에 비회원 진입로를 뚫어야 했는데, 뚫는 김에 핀 검증·배송지 입력·주문-회원 자동매칭까지 한 번에 묶음. 분리해서 배포하면 비회원이 결제까지 갔다가 매칭 누락으로 고아 주문 생길 게 뻔해서 묶어서 가는 게 맞다고 판단함.
핀 검증, 보안과 UX 사이
비회원이라고 그냥 풀어주면 안 되고, 그렇다고 회원가입 수준으로 막으면 이탈함. 결국 4자리 핀 + 휴대폰 마지막 4자리 조합으로 합의함. 검증 로직 짜면서 신경 쓴 포인트.
- 핀은 평문 저장 금지. 단방향 해시 + 주문번호 솔트로 굳힘
- 시도 횟수 5회 제한. 초과 시 해당 주문 잠금
- 잠금은 시간 기반 자동 해제(30분) 두되, 운영 화면에서 즉시 해제 가능
처음엔 시도 횟수를 IP 기준으로 묶었다가 사내망 공유 환경에서 무고한 사용자가 잠기는 사례 보고 주문번호 기준으로 바꿈. 보안 관점에선 IP가 깔끔하지만 현실은 그렇지 않음.
비회원 진입 차단 인터셉터
인증 필요한 관리 화면까지 비회원이 흘러들어가면 곤란해서, 진입 게이트를 인터셉터로 만들었음. 화이트리스트 방식.
permit: /guest/order/**, /guest/pin, /guest/track
deny: 그 외 관리/주문 라우트
세션 마커: GUEST_ORDER_TOKEN (만료 30분)
세션 마커 없으면 로그인 페이지로 보내는 게 아니라 핀 입력 페이지로 우회시킴. 비회원이 로그인 화면을 보면 "나는 이거 아닌데" 하고 이탈하는 빈도가 높았음.
주문-회원 자동매칭
여기가 진짜 까다로웠음. 비회원으로 결제했는데 알고 보니 이미 가입된 휴대폰 번호인 경우, 다음에 그 사람이 회원으로 로그인하면 과거 비회원 주문이 안 보임. 그래서 매칭 유틸을 따로 뽑음.
| 케이스 | 매칭 키 | 처리 |
|---|---|---|
| 휴대폰 정확히 일치 | phone hash | 즉시 연결 |
| 이름+생년월일+휴대폰 뒷자리 | 복합 | 후보로 표시, 운영 승인 |
| 매칭 후보 다수 | - | 자동 매칭 보류, 운영 큐로 |
자동매칭은 결제 완료 훅에서 비동기로 돌게 함. 결제 트랜잭션 안에서 매칭까지 처리하면 락 시간 길어지고, 매칭 실패가 결제 실패로 전이됨. 분리하길 잘했음.
배송지 입력, 회원 주소록 안 건드리기
비회원 배송지를 회원 주소록 테이블에 같이 쌓으면 데이터 모델이 더러워짐. 비회원 배송지는 주문에만 묶어서 저장하고, 자동매칭 성공 시 "주소록에 저장하시겠습니까" 다음 로그인 때 한 번 묻는 식으로 분리함.
회고
기능 자체보다 회원/비회원 경계가 어디서 갈리는가를 정의하는 데 시간을 더 씀. 인터셉터·매칭·핀 셋이 같은 경계를 다른 각도에서 보고 있어서, 한쪽 규칙 바꾸면 나머지가 깨졌음. 다음에 비슷한 작업 한다면 경계 정의를 코드 짜기 전에 표로 먼저 굳혀놓을 듯.
끝
댓글 0
첫 댓글 달아줘.