통신사 엣지(Carrier Edge)에서 모든 수신 전화 스크리닝하기: 178줄의 Python으로 구현한 사기 방화벽
요약
Telnyx API와 Python을 활용하여 통신사 엣지 단계에서 사기 전화를 차단하는 방화벽 구현 방법을 소개합니다. 178줄의 짧은 코드로 Number Lookup, AI 분류, Call Control을 결합하여 리소스 소모를 최소화합니다.
핵심 포인트
- Telnyx API를 이용한 엣지 단계의 실시간 전화 스크리닝
- OpenAI 호환 엔드포인트를 활용한 초저지연 AI 분류 구현
- 단일 토큰 출력을 통한 추론 지연 시간 및 파싱 복잡도 최소화
- 시스템 장애 시 정당한 사용자를 보호하는 Safe-fail 설계 적용
원문은 lowlatencyclub.ai에 게시되었습니다.
통신사 엣지(Carrier Edge)에서 모든 수신 전화 스크리닝하기: 178줄의 Python으로 구현한 사기 방화벽
모든 수신 전화는 하나의 결정 사항입니다. 이 발신자가 정당한 사용자인가요, 아니면 사기꾼, 로보콜러(robocaller), 또는 통화료 사기(toll-fraud) 봇인가요? 대부분의 시스템은 전화가 애플리케이션 계층(application layer)에 도달한 후에야 결정을 내리는데, 이는 너무 늦습니다. 그 과정에서 리소스를 소모하고, 상담원이 가짜 전화에 5분을 허비하게 만들 수도 있습니다.
엣지 사기 방화벽(Edge Fraud Firewall)은 이 순서를 뒤집습니다. 이 시스템은 단일 플랫폼에서 세 가지 Telnyx API를 사용하여, 앱이 전화를 인지하기 전인 통신사 엣지(carrier edge) 단계에서 모든 수신 전화를 스크리닝합니다. 사용되는 API는 발신자 식별을 위한 Number Lookup, 위험 분류를 위한 AI Inference, 그리고 거부/전달/라우팅 결정을 위한 Call Control입니다.
방화벽 전체는 단일 Flask 파일 내의 178줄의 Python 코드로 구성되어 있습니다.
작동 원리
전화가 Telnyx 번호로 들어오면, 플랫폼은 Flask 서버로 call.initiated 웹훅(webhook)을 보냅니다. 서버는 다른 작업을 수행하기 전에 Ed25519 웹훅 서명을 검증합니다. 만약 요청이 Telnyx에서 온 것이 아니라면, 401을 반환하고 중단합니다.
검증된 웹훅의 경우, 스크리닝 파이프라인(pipeline)은 다음 순서로 실행됩니다:
- 차단 목록(Blocklist) 확인 — 발신자 번호가 메모리 내 차단 목록에 있으면 즉시 거부합니다. 조회(lookup)나 AI 호출을 수행하지 않습니다.
- Number Lookup — 통신사 이름, 회선 유형(유선/VoIP/모바일), 국가 코드를 반환합니다.
- AI 분류 (AI classification) — 조회된 데이터는 OpenAI 호환 채팅 완성(chat completions) 엔드포인트로 전송됩니다. 이때 시스템 프롬프트(system prompt)는 정확히 한 단어인
CLEAN,SUSPICIOUS, 또는BLOCK만을 반환하도록 제한됩니다. - 라우팅 결정 (Route decision) — 분류 결과에 따라 다음과 같이 처리합니다:
CLEAN→ 전화를 받고 실제 번호로 전달SUSPICIOUS→ 전화를 받고 허니팟(honeypot, 무한 대기 루프)으로 라우팅BLOCK→ 거부하고 차단 목록에 추가
AI 분류기 (The AI Classifier)
시스템 프롬프트는 의도적으로 제약되어 있습니다 — 오직 한 단어만 사용합니다:
def classify_caller(phone, lookup_data):
try:
resp = requests.post(INFERENCE_URL, headers=HEADERS, timeout=15, json={
...
단일 단어 출력은 추론 지연 시간 (Inference Latency)을 단 하나의 토큰으로 유지하며 파싱을 매우 간단하게 만듭니다. JSON이나 정규 표현식 (Regex) 없이 단순한 문자열 비교만으로 충분합니다.
어떤 이유로든 AI 호출이 실패할 경우, 함수는 기본값으로 CLEAN을 반환합니다. 이는 안전한 실패 (Safe-fail) 설계입니다. 스크리닝 서비스가 사용 불가능하더라도 정당한 발신자는 여전히 연결될 수 있습니다.
허니팟 (The Honeypot)
AI가 통화를 SUSPICIOUS (의심스러움)로 분류하면, 방화벽은 해당 통화를 거절하거나 전달하는 대신 허니팟 (Honeypot)으로 라우팅합니다. 허니팟은 전화를 받고 대기 메시지를 재생한 뒤, 무한 루프를 돕니다:
# call.answered → honeypot flow
if flow == "honeypot":
requests.post(f".../calls/{call_control_id}/actions/speak",
...
사기꾼은 전화를 끊지 못한 채 연결 상태를 유지하며, 자신들의 시간과 자원을 낭비하게 됩니다.
client_state를 이용한 상태 관리 (State Management)
Telnyx Call Control은 웹훅 (Webhook) 기반으로 작동합니다. 즉, 각 통화 액션이 새로운 웹훅 이벤트를 트리거합니다. 통화가 어떤 흐름(전달 vs 허니팟)에 있는지 추적하기 위해, 앱은 client_state를 사용합니다. 이는 Telnyx가 다음 웹훅에서 다시 전달해 주는 Base64 인코딩된 JSON 블롭 (Blob)입니다:
def encode_state(data):
return base64.b64encode(json.dumps(data).encode()).decode()
...
외부 데이터베이스가 필요하지 않습니다. 상태 정보가 웹훅과 함께 이동하기 때문입니다.
웹훅 서명 검증 (Webhook Signature Verification)
웹훅 핸들러가 가장 먼저 수행하는 작업은 요청이 Telnyx로부터 온 것인지 검증하는 것입니다:
try:
client.webhooks.unwrap(request.get_data(as_text=True), headers=dict(request.headers))
except Exception:
...
Telnyx Python SDK는 원본 요청 본문 (Raw request body)에 대해 Ed25519 서명을 검증합니다. 검증에 실패하면, 어떠한 처리도 이루어지기 전에 요청이 거부됩니다.
설정 (Setup)
git clone https://github.com/team-telnyx/telnyx-code-examples.git
cd telnyx-code-examples/edge-fraud-firewall-python
cp .env.example .env
...
Telnyx Portal에서 웹훅(Webhook) URL을 설정하세요 — Call Control Application의 웹훅 URL을 https://<your-ngrok-id>.ngrok.io/webhooks/voice로 설정합니다.
왜 통신사 엣지(Carrier Edge)에서 스크리닝해야 하는가?
사기 스크리닝(Fraud screening)은 일반적으로 애플리케이션 계층(Application layer)에서 실행되며, 이는 전화가 이미 연결된 이후에 이루어집니다. 그 시점에는 이미 사기 행위가 SIP 트렁크(SIP trunks), 미디어 서버(Media servers), 그리고 상담원의 시간을 소모한 상태입니다.
통신사 엣지에서 스크리닝한다는 것은 전화를 전달하는 것과 동일한 네트워크 상에서 결정이 내려짐을 의미합니다. 번호 조회(Number Lookup) 및 AI 추론(AI Inference)은 공용 인터넷을 통해 호출되는 제3자 API가 아니라 Telnyx 인프라 위에서 실행됩니다. '선 스크리닝 후 라우팅(Screen-then-route)' 결정 방식은 모든 수신 전화에 대해 인라인(Inline)으로 동작할 수 있을 만큼 충분히 빠릅니다.
프로덕션 환경 적용하기
이 샘플은 인메모리(In-memory) 상태를 사용합니다. 프로덕션 환경에서는 다음 사항을 고려하십시오:
- 인메모리 차단 목록(Blocklist)을 Redis로 교체
- AI 분류(Classification) 호출에 속도 제한(Rate limiting) 추가
- 분류 지연 시간(Latency) 및 차단율(Block rate)에 대한 모니터링 설정
- 프로세스 관리자로
gunicorn -w 4 app:app사용 - Telnyx Portal에서 페일오버(Failover) 웹훅 URL 설정
리소스
관련 예제
- number-lookup-fraud-screener-python — Number Lookup 평판 데이터를 사용하여 발신자의 점수를 매기고 스크리닝합니다.
- fraud-alert-verification-python — 아웃바운드 확인 전화 (outbound confirmation call)를 통해 의심스러운 활동을 검증합니다.
- edge-geo-smart-router-python — 발신자의 지리적 위치를 기반으로 엣지(edge)에서 인바운드 전화를 라우팅합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기