문자 발송 API는 성공(200)을 돌려줬고 서버 로그도 깨끗했음. 그런데 인증문자가 안 왔음. 접수와 도착 사이에서 통신사가 마지막에 자르는 문자 이야기.
HTTP 200의 의미
Mbtigram은 가입할 때 휴대폰 인증문자를 보냄. 문자 발송은 외부 서비스(솔라피)의 API를 부름. 요청을 보내면 HTTP 200이 돌아오고 서버 로그에도 오류가 없음. 그러면 문자가 간 거라고 생각하기 쉬움.
그런데 200은 "접수했다"는 뜻일 뿐임. 실제로 폰에 도착하는지는 몇 초 뒤 통신사가 정함. 보내는 쪽 코드만으로는 도착을 알 수 없음. 이메일, 푸시 알림, 결제도 비슷함.
보내는 코드가 잡을 수 있는 것
접수 단계에서 걸리는 실패는 응답에 바로 옴. 잔액이 부족하거나 발신번호가 등록되어 있지 않은 경우임. 이런 건 서버가 응답을 보고 바로 오류로 처리함.
그 뒤의 일은 응답에 없음. 접수된 문자가 통신사로 넘어가서 어떻게 됐는지는 나중에 다시 물어봐야 알 수 있음.
운영자 화면에 발송 결과 추가
그래서 운영자 화면에 인증문자 발송 결과를 만들었음. 최근에 보낸 문자들의 상태를 문자 서비스에 다시 물어서 보여 줌. "가입 문자가 안 와요"라는 말을 들으면 가장 먼저 여는 곳임.
| 상태 코드 | 뜻 |
|---|---|
2000 | 접수됨. 아직 결과가 없음 |
4000 | 수신 완료 |
3xxx | 실패. 뒤의 숫자로 이유를 알 수 있음 |
여기서 한 번 틀렸음. 처음에는 4000을 실패 쪽으로 쳤더니 잘 도착한 문자가
빨간 "실패"로 보였음. 접수(2000)와 수신 완료(4000)가 둘 다 정상이라는 걸 놓쳤음.
3113: 통신사 단계 차단
실제로 겪은 실패는 이거였음.
3113 번호도용문자차단서비스에 가입된 발신번호 사용
번호도용문자차단은 내 번호가 남의 문자 발신번호로 도용되지 않게 막아 주는 통신사 서비스임. 발신번호로 쓴 번호가 이 서비스에 가입되어 있으면 문자 서비스는 접수까지 해 주고, 통신사가 마지막에 자름. 접수는 성공이었으니 서버 로그에는 아무것도 남지 않음.
이후 발신번호를 문자 발송용으로 따로 등록한 번호로 바꿨고, 실제 폰으로 인증문자가 오는 것까지 확인했음. 번호는 설정 한 줄이라 다시 바꿀 일이 생겨도 코드는 안 건드림.
그 밖에 해 둔 것
- 문자 API 키에 IP 제한을 걸어 우리 서버에서만 쓸 수 있게 했음. 키가 새도 다른 곳에서는 문자를 못 보냄.
- 접수 단계 오류를 따로 골라내는 함수를 둬서, 잔액 부족 같은 건 서버 로그에서 바로 보이게 했음.