Twilio
1. 개요
1.1 Twilio란?
Twilio는 클라우드 커뮤니케이션 플랫폼으로, SMS, 음성 통화, 이메일 등 다양한 커뮤니케이션 채널을 제공하는 서비스입니다. 본 프로젝트에서는 SMS 인증과 전화번호 검증을 위해 Twilio의 다음 서비스들을 사용합니다:
- 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 비용 최적화 전략
캐싱 전략
- 전화번호 유효성 검증 결과 캐싱 (24시간)
- 인증 시도 횟수 제한으로 비용 절감
요금제 선택
- 예상 사용량에 따른 적절한 요금제 선택
- 연간 계약 시 추가 할인 가능
비용 모니터링
- 일일/월간 사용량 모니터링
- 비용 한도 설정
- 알림 설정 (80% 도달 시)
1.3.5 월 평균 비용 추산
1만 명 회원 기준 예상 비용
기본 가정
- 월간 활성 사용자: 전체 회원의 60% (6,000명)
- 신규 가입/재인증: 전체 회원의 10% (1,000명)
- 비밀번호 재설정: 활성 사용자의 5% (300명)
- 로그인 실패 재인증: 활성 사용자의 3% (180명)
월간 예상 API 호출
- Verify API: 1,480회 (신규 가입 + 재인증 + 비밀번호 재설정)
- Lookup API: 1,000회 (신규 가입/재인증 시 번호 검증)
예상 비용
- 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만 명 회원 기준 예상 비용
기본 가정
- 월간 활성 사용자: 전체 회원의 40% (40,000명)
- 신규 가입/재인증: 전체 회원의 5% (5,000명)
- 비밀번호 재설정: 활성 사용자의 5% (2,000명)
- 로그인 실패 재인증: 활성 사용자의 3% (1,200명)
월간 예상 API 호출
- Verify API: 8,200회 (신규 가입 + 재인증 + 비밀번호 재설정)
- Lookup API: 5,000회 (신규 가입/재인증 시 번호 검증)
예상 비용
- 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년 평균 환율 적용) ※ 실제 비용은 환율 변동과 사용량에 따라 달라질 수 있습니다.
비용 절감 방안
인증 횟수 최적화
- 성공적인 인증 후 30일간 재인증 면제
- IP/기기 기반 신뢰도 평가로 불필요한 인증 감소
대량 사용 할인 활용
- 연간 계약을 통한 추가 할인 협상
- 대량 구매 크레딧 사용
대체 인증 방법 병행
- 이메일 인증 병행으로 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 기반 필터링
- 기기 지문 확인
- 행위 기반 탐지