Mbtigram / 09 /

Sent is not delivered

문자 접수와 도착의 차이

문자 발송 API는 성공(200)을 돌려줬고 서버 로그도 깨끗했음. 그런데 인증문자가 안 왔음. 접수와 도착 사이에서 통신사가 마지막에 자르는 문자 이야기.

HTTP 200의 의미

Mbtigram은 가입할 때 휴대폰 인증문자를 보냄. 문자 발송은 외부 서비스(솔라피)의 API를 부름. 요청을 보내면 HTTP 200이 돌아오고 서버 로그에도 오류가 없음. 그러면 문자가 간 거라고 생각하기 쉬움.

그런데 200은 "접수했다"는 뜻일 뿐임. 실제로 폰에 도착하는지는 몇 초 뒤 통신사가 정함. 보내는 쪽 코드만으로는 도착을 알 수 없음. 이메일, 푸시 알림, 결제도 비슷함.

보내는 코드가 잡을 수 있는 것

접수 단계에서 걸리는 실패는 응답에 바로 옴. 잔액이 부족하거나 발신번호가 등록되어 있지 않은 경우임. 이런 건 서버가 응답을 보고 바로 오류로 처리함.

그 뒤의 일은 응답에 없음. 접수된 문자가 통신사로 넘어가서 어떻게 됐는지는 나중에 다시 물어봐야 알 수 있음.

운영자 화면에 발송 결과 추가

그래서 운영자 화면에 인증문자 발송 결과를 만들었음. 최근에 보낸 문자들의 상태를 문자 서비스에 다시 물어서 보여 줌. "가입 문자가 안 와요"라는 말을 들으면 가장 먼저 여는 곳임.

상태 코드뜻
2000접수됨. 아직 결과가 없음
4000수신 완료
3xxx실패. 뒤의 숫자로 이유를 알 수 있음

여기서 한 번 틀렸음. 처음에는 4000을 실패 쪽으로 쳤더니 잘 도착한 문자가 빨간 "실패"로 보였음. 접수(2000)와 수신 완료(4000)가 둘 다 정상이라는 걸 놓쳤음.

3113: 통신사 단계 차단

실제로 겪은 실패는 이거였음.

3113  번호도용문자차단서비스에 가입된 발신번호 사용

번호도용문자차단은 내 번호가 남의 문자 발신번호로 도용되지 않게 막아 주는 통신사 서비스임. 발신번호로 쓴 번호가 이 서비스에 가입되어 있으면 문자 서비스는 접수까지 해 주고, 통신사가 마지막에 자름. 접수는 성공이었으니 서버 로그에는 아무것도 남지 않음.

이후 발신번호를 문자 발송용으로 따로 등록한 번호로 바꿨고, 실제 폰으로 인증문자가 오는 것까지 확인했음. 번호는 설정 한 줄이라 다시 바꿀 일이 생겨도 코드는 안 건드림.

그 밖에 해 둔 것

  • 문자 API 키에 IP 제한을 걸어 우리 서버에서만 쓸 수 있게 했음. 키가 새도 다른 곳에서는 문자를 못 보냄.
  • 접수 단계 오류를 따로 골라내는 함수를 둬서, 잔액 부족 같은 건 서버 로그에서 바로 보이게 했음.