Twilio : 글로벌 전화번호 인증, SMS 발송, 전화번호 유효성 검증에 대하여

Twilio



1. 개요

1.1 Twilio란?

Twilio는 클라우드 커뮤니케이션 플랫폼으로, SMS, 음성 통화, 이메일 등 다양한 커뮤니케이션 채널을 제공하는 서비스입니다. 본 프로젝트에서는 SMS 인증과 전화번호 검증을 위해 Twilio의 다음 서비스들을 사용합니다:

https://www.twilio.com/en-us

  • Verify API: 전화번호 인증
  • Messaging API: SMS 발송
  • Lookup API: 전화번호 유효성 검증

1.2 적용 목적

  • 안전한 사용자 인증
  • 전화번호 유효성 검증
  • 글로벌 SMS 서비스 지원
  • 인증 프로세스 자동화

1.3 가격 정책

https://www.twilio.com/pricing

1.3.1 Verify API 가격

  • 기본 요금: 검증당 $0.05 ~ $0.10 (지역별 상이)
  • 월간 사용량에 따른 할인:
    • 1-250 검증: 기본 요금
    • 251-2,500 검증: 10% 할인
    • 2,501-10,000 검증: 15% 할인
    • 10,000+ 검증: 별도 문의

1.3.2 Messaging API 가격

  • 국내 SMS 발송: 건당 ₩20 ~ ₩30
  • 해외 SMS 발송: 국가별 상이 ($0.01 ~ $0.15)
  • 수신: 무료
  • 대량 발송 시 별도 할인율 적용

1.3.3 Lookup API 가격

  • 기본 조회: $0.005/건
  • 상세 정보 조회 (캐리어 정보 포함): $0.01/건
  • 번호 유효성 검증: $0.003/건
  • 월간 사용량 기준 할인:
    • 100,000+ 조회: 5% 할인
    • 500,000+ 조회: 10% 할인

1.3.4 비용 최적화 전략

  1. 캐싱 전략

    • 전화번호 유효성 검증 결과 캐싱 (24시간)
    • 인증 시도 횟수 제한으로 비용 절감
  2. 요금제 선택

    • 예상 사용량에 따른 적절한 요금제 선택
    • 연간 계약 시 추가 할인 가능
  3. 비용 모니터링

    • 일일/월간 사용량 모니터링
    • 비용 한도 설정
    • 알림 설정 (80% 도달 시)

1.3.5 월 평균 비용 추산

1만 명 회원 기준 예상 비용
  1. 기본 가정

    • 월간 활성 사용자: 전체 회원의 60% (6,000명)
    • 신규 가입/재인증: 전체 회원의 10% (1,000명)
    • 비밀번호 재설정: 활성 사용자의 5% (300명)
    • 로그인 실패 재인증: 활성 사용자의 3% (180명)
  2. 월간 예상 API 호출

    • Verify API: 1,480회 (신규 가입 + 재인증 + 비밀번호 재설정)
    • Lookup API: 1,000회 (신규 가입/재인증 시 번호 검증)
  3. 예상 비용

    • Verify API: $103.60 (1,480회 × $0.07) ≈ 134,680원
    • Lookup API: $3.00 (1,000회 × $0.003) ≈ 3,900원
    • 총 예상 비용: $106.60/월 ≈ 138,580원/월
    • 연간 예상 비용: $1,279.20/년 ≈ 1,662,960원/년
10만 명 회원 기준 예상 비용
  1. 기본 가정

    • 월간 활성 사용자: 전체 회원의 40% (40,000명)
    • 신규 가입/재인증: 전체 회원의 5% (5,000명)
    • 비밀번호 재설정: 활성 사용자의 5% (2,000명)
    • 로그인 실패 재인증: 활성 사용자의 3% (1,200명)
  2. 월간 예상 API 호출

    • Verify API: 8,200회 (신규 가입 + 재인증 + 비밀번호 재설정)
    • Lookup API: 5,000회 (신규 가입/재인증 시 번호 검증)
  3. 예상 비용

    • Verify API: $533.00 (8,200회 × $0.065, 15% 할인 적용) ≈ 692,900원
    • Lookup API: $14.25 (5,000회 × $0.0028, 5% 할인 적용) ≈ 18,525원
    • 총 예상 비용: $547.25/월 ≈ 711,425원/월
    • 연간 예상 비용: $6,567/년 ≈ 8,537,100원/년

※ 환율 기준: 1 USD = 1,300 KRW (2023년 평균 환율 적용) ※ 실제 비용은 환율 변동과 사용량에 따라 달라질 수 있습니다.

비용 절감 방안
  1. 인증 횟수 최적화

    • 성공적인 인증 후 30일간 재인증 면제
    • IP/기기 기반 신뢰도 평가로 불필요한 인증 감소
  2. 대량 사용 할인 활용

    • 연간 계약을 통한 추가 할인 협상
    • 대량 구매 크레딧 사용
  3. 대체 인증 방법 병행

    • 이메일 인증 병행으로 SMS 인증 비용 절감
    • 신뢰도 높은 사용자에 대한 인증 간소화

2. 기술 스택

2.1 주요 의존성

// Twilio Core
implementation 'com.twilio.sdk:twilio:9.14.1'

// Twilio Services
implementation 'com.twilio.sdk:twilio-verify:9.14.1'
implementation 'com.twilio.sdk:twilio-rest:9.14.1'
implementation 'com.twilio.sdk:twilio-http-client:9.14.1'
implementation 'com.twilio.sdk:twilio-core:9.14.1'
implementation 'com.twilio.sdk:twilio-twiml-sms:9.14.1'
implementation 'com.twilio.sdk:twilio-twiml-messaging:9.14.1'

// Phone Number Validation
implementation 'com.googlecode.libphonenumber:libphonenumber:8.13.27'

2.2 주요 설정

twilio:
  account:
    sid: ${TWILIO_ACCOUNT_SID}
  auth:
    token: ${TWILIO_AUTH_TOKEN}
  phone:
    number: ${TWILIO_PHONE_NUMBER}
  verify:
    service:
      sid: ${TWILIO_VERIFY_SERVICE_SID}

3. 구현 내용

3.1 주요 기능

3.1.1 전화번호 형식 변환 (PhoneNumberFormatter)

  • E.164 형식으로 전화번호 변환
  • 국가별 전화번호 유효성 검증
  • Google의 libphonenumber 라이브러리 활용

3.1.2 인증 코드 관리 (VerificationCodeService)

  • 인증 코드 생성 및 저장
  • SMS를 통한 인증 코드 발송
  • 인증 코드 검증
  • 만료 시간 관리

3.1.3 요청 제한 관리 (RateLimiterService)

  • Redis 기반 요청 제한
  • 인증 시도 횟수 제한
  • 시간 기반 잠금 기능

3.2 보안 기능

3.2.1 요청 제한

  • 10분당 최대 3회 요청 제한
  • 5회 실패 시 30분 잠금
  • Redis를 통한 분산 환경 지원

3.2.2 인증 코드 보안

  • SecureRandom을 사용한 안전한 코드 생성
  • 6자리 숫자 코드
  • 10분 만료 시간
  • 일회성 사용

3.3 알림 관리

  • 인증 시도 기록
  • 상태 추적
  • 실패 원인 기록
  • 관리자 모니터링 지원

4. API 엔드포인트

4.1 인증 코드 발송

POST /api/verification/sms/generate
Content-Type: application/json

{
    "phoneNumber": "01012345678"
}

4.2 인증 코드 검증

POST /api/verification/sms/verify
Content-Type: application/json

{
    "phoneNumber": "01012345678",
    "code": "123456"
}

4.3 전화번호 인증 시작

POST /api/verification/phone/start
Content-Type: application/json

{
    "phoneNumber": "01012345678"
}

4.4 전화번호 인증 확인

POST /api/verification/phone/verify
Content-Type: application/json

{
    "phoneNumber": "01012345678",
    "code": "123456"
}

5. 에러 처리

5.1 주요 에러 코드

  • 400: 잘못된 요청 (전화번호 형식 오류 등)
  • 429: 요청 제한 초과
  • 401: 인증 실패
  • 404: 인증 코드 찾을 수 없음

5.2 에러 응답 형식

{
    "success": false,
    "message": "에러 메시지",
    "errorCode": "ERROR_CODE"
}

6. 모니터링 및 로깅

6.1 로깅 정보

  • 인증 시도 횟수
  • 성공/실패 여부
  • 에러 메시지
  • IP 주소
  • 요청 시간

6.2 모니터링 지표

  • 인증 성공률
  • 평균 응답 시간
  • 요청 제한 도달 횟수
  • SMS 발송 비용

7. 운영 가이드

7.1 필수 환경 변수

TWILIO_ACCOUNT_SID=your_account_sid
TWILIO_AUTH_TOKEN=your_auth_token
TWILIO_PHONE_NUMBER=your_phone_number
TWILIO_VERIFY_SERVICE_SID=your_verify_service_sid

7.2 Redis 설정

spring:
  data:
    redis:
      host: ${REDIS_HOST:localhost}
      port: ${REDIS_PORT:6379}
      password: ${REDIS_PASSWORD:}

7.3 모니터링 설정

  • Twilio 콘솔에서 사용량 모니터링
  • Redis 모니터링
  • 애플리케이션 로그 모니터링

8. 향후 개선 사항

8.1 기능 개선

  • 음성 통화 인증 추가
  • WhatsApp 인증 추가
  • 다국어 메시지 지원
  • 템플릿 기반 메시지 관리

8.2 성능 개선

  • 캐시 최적화
  • 비동기 처리 확대
  • 배치 처리 도입

8.3 보안 개선

  • IP 기반 필터링
  • 기기 지문 확인
  • 행위 기반 탐지

 

다음 이전