일기 slecs

SMS 수신 추적과 자체 점유인증으로 알림 사각지대 제거

목차

알림 수신 통계 — 보낸 것보다 받은 게 더 중요했음

이커머스 운영하면서 결제·배송 알림을 SMS로 쏴왔는데, 그동안 로그에는 "발송했음"만 남기고 있었음. 근데 진짜 봐야 할 건 수신자가 실제로 받았느냐였음. 통신사 리포트랑 우리 발송 카운트가 종종 어긋났고, 파트너 CS로 "고객이 못 받았다" 컴플레인이 들어오면 추적이 어려웠음.

이번에 회원·주문 양쪽 진입점에 수신 결과 콜백을 받아 통계 테이블로 적재하도록 정리.

  • 발송 ID 기준 join → 발송/수신/실패 분리 적재
  • 실패 사유 코드 정규화 (통신사마다 raw 메시지가 제각각이라 매핑 테이블 둠)
  • 일별 집계는 야간 배치, 실시간 조회는 최근 1시간만 인덱스 뷰로

대시보드에 깔아두니 "어제 12% 미수신" 같은 신호가 바로 보임. 이전엔 보이지도 않던 영역이었음.

SMS 점유인증 — 본인확인을 가볍게

기존 로그인/가입은 외부 본인확인 모듈에 다 태웠는데, 단순 "이 번호를 이 사람이 들고 있는가"만 필요한 흐름까지 그쪽을 부르는 건 과한 스펙. 건당 비용이랑 응답 지연도 무시 못 했음.

그래서 SMS 점유인증을 자체 구현. 구조는 일부러 단순하게.

단계 처리 TTL
발급 6자리 난수 + 캐시 저장 3분
검증 입력값 vs 저장값 비교 1회성
재발송 동일 번호 60초 쿨다운
issue  -> store(hash, expire=180s) -> send
verify -> fetch -> constantTimeEq -> invalidate

신경 쓴 포인트:

  • 타이밍 공격 방지: 평문 == 대신 상수시간 비교
  • brute-force 차단: 같은 번호/IP에서 5회 실패 시 30분 락
  • 로그 마스킹: 인증번호는 절대 평문으로 안 남기고, 번호도 가운데 4자리 마스킹

시행착오

  • 초반엔 인증번호를 그냥 RDB에 박았다가 만료 처리 오버헤드 때문에 캐시로 이전
  • 수신 콜백이 중복으로 들어오는 케이스가 있어서 idempotency 키로 막음
  • 결제대행사 쪽 발신번호 사전등록 누락된 건이 있어서, 발송 직전 화이트리스트 체크 한 단계 끼워넣음

회고

"보낸 다음은 모름"으로 흘러가던 영역을 측정 가능하게 만든 게 제일 큼. 숫자가 보이니까 다음 개선 우선순위도 자동으로 정렬됨. 비용 줄이려 시작한 자체 점유인증도 스펙을 일부러 좁혀 잡으니 깔끔하게 떨어졌고, 이런 류는 외부 의존을 줄일수록 디버깅이 편해진다는 걸 다시 확인.

다음

댓글 0

첫 댓글 달아줘.