pile·
백엔드·twilio-engTwilio Engineering·

Programmable Messaging에서 Verify API로 마이그레이션하기

Twilio의 Programmable Messaging API로 자체 OTP 솔루션을 운영하던 서비스가 Verify API로 전환하는 방법을 코드 예시와 함께 설명한다. Verify는 OTP 전송·검증을 위한 전용 API로, 전화번호 구매, 토큰 생성, DB 저장·만료 관리를 내부에서 처리해 개발자가 직접 구현할 코드를 크게 줄인다.

핵심 포인트
  • Verify API는 토큰 생성·저장·만료를 자체 처리해, 기존 Programmable Messaging 대비 직접 작성해야 할 코드가 대폭 줄어든다.
  • 전화번호 풀을 Verify가 관리하므로 A2P 10DLC 등록이 면제되고 글로벌 컴플라이언스도 자동으로 처리된다.
  • Fraud Guard로 SMS 트래픽 펌핑을 자동 차단하며, SMS·RCS·WhatsApp·이메일·TOTP 멀티채널을 단일 API로 지원한다.
  • 전환 후 전화번호 포맷이 Programmable Messaging보다 엄격해 반드시 E.164 형식이 필요하다.
  • 검증 코드 유효 시간은 10분이며 이 기간 중 재전송해도 동일 코드가 반환된다.
상세 정리
  • 기존 Programmable Messaging 흐름: 전화번호 구매 -> Math.random()으로 6자리 토큰 생성 -> DB에 저장(storeToken) -> 발송 -> 만료 확인 순서로 수동 처리가 많다.
  • Verify send 코드: client.verify.services(SERVICE_SID).verifications.create({to, channel: 'sms'}) 한 줄로 대체, from 번호 불필요.
  • Verify check 코드: client.verify.services(SERVICE_SID).verificationChecks.create({to, code}) 후 check.status === 'approved' 확인. DB에서 토큰을 꺼낼 필요 없다.
  • Verify Service 생성: API 또는 콘솔에서 1회 생성하며 코드 길이(4~10자), 발신자 이름, "공유 금지 경고" 등을 설정할 수 있다.
  • 커스텀 코드 옵션: customCode 파라미터로 자체 OTP 코드를 사용할 수 있으나 Verify 내장 생성을 권장한다.
  • 전화번호 포맷 주의: Programmable Messaging은 공백 등 비표준 포맷을 허용했지만 Verify는 E.164(+15552317654) 필수. Lookup API로 정규화를 권장한다.
  • 국가 허용/차단 리스트: 글로벌 서비스는 전체 허용, 지역 제한이 필요하면 allowlist/blocklist를 서비스 설정에서 적용한다.
  • 에러 코드 차이: PM과 다른 에러 코드 체계. 60200(잘못된 파라미터), 60203(최대 발송 시도 초과) 등을 별도 매핑해야 한다.
  • 속도 제한: 전화번호당 10분 내 5회 발송, 5회 확인이 기본값이며 서비스 레벨에서 추가 제한을 설정할 수 있다.
  • 가격: 확인된 검증 1건당 $0.05, 전화번호 풀과 Fraud Guard 비용이 포함된 가격이다.
왜 읽나Twilio Programmable Messaging으로 자체 OTP를 구현해온 백엔드 개발자가 Verify API로 전환해 유지보수 부담을 줄이고 보안·컴플라이언스를 개선하려 할 때 실전 코드 중심 레퍼런스.
twilio-eng
Twilio Engineering 블로그
원문은 여기서 이어서 읽을 수 있어요
원문 읽기
읽음 (0)

이 글과 비슷한

  1. 백엔드·포스타입포스타입·

    포스타입이 개인화 추천을 하는 방법 2부

    포스타입 백엔드 엔지니어가 벡터 기반 개인화 추천 시스템을 실제 운영하며 맞닥뜨린 성능 장애와 용량 문제를 해결한 과정을 담은 2부다. 수백만 개의 벡터 KNN 검색이 피크 시간대에 전체 Elasticsearch 검색 성능을 흔드는 문제부터 클러스터 OOM 사태까지, 쿼리 최적화와 인프라 분리 두 가지 경로로 근본 해결에 이른다.

    요약 이어보기
    #elasticsearch#vector-search#recommendation-system+2
  2. 백엔드·포스타입포스타입·

    포스타입이 개인화 추천을 하는 방법 1부

    포스타입이 태그 기반 추천의 한계를 극복하고 벡터 임베딩 기반 개인화 추천 시스템을 구축한 과정을 담은 1부다. 유사한 콘텐츠가 다른 용어를 쓰거나 동일한 태그가 전혀 다른 톤의 콘텐츠를 가리키는 문제를 임베딩 벡터로 해결하고, OpenSearch의 HNSW ANN 검색으로 수백만 벡터를 실시간 검색하는 시스템을 구축해 구매율 15% 향상을 달성했다.

    요약 이어보기
    #opensearch#vector-search#recommendation-system+2
  3. 백엔드·여기어때 (GC컴퍼니)여기어때 (GC컴퍼니)·

    실패한 메시지는 어디로 가야 할까?- Kafka Retry/DLT 설계와 운영에서 밟은 3가지 함정

    여기어때 정산개발팀 백엔드 개발자가 Kafka 컨슈머의 실패 처리를 non-blocking 재시도와 공통 DLT(Dead Letter Topic)로 표준화한 공통 라이브러리 구현 과정을 공유한다. 정산 시스템의 각 Kafka 컨슈머가 제각각 다른 방식으로 실패를 처리하던 상황을 @CommonKafkaRetry 어노테이션 하나로 일관되게 표준화하고, 그 과정에서 Spring Kafka의 3가지 숨겨진 함정을 발굴해 해결한 실전 기록이다.

    요약 이어보기
    #kafka#message-queue#spring-kafka+2