사기 탐지는 결국 SQL에서 시작된다
핀테크나 이커머스에서 일하다 보면 "이상거래 탐지"라는 말을 자주 듣게 되는데요, 거창하게 들리지만 실제 첫 단계는 결국 데이터베이스에서 SQL 쿼리를 잘 짜는 일이에요. 머신러닝 모델이 화려해 보여도, 그 모델이 학습할 라벨을 만들고 룰 기반 1차 필터를 거는 건 결국 사람이 작성한 SQL이거든요. 이번에 한 분석가가 자기가 실무에서 자주 쓰는 SQL 사기 탐지 패턴들을 정리한 글을 공개했는데, 주니어 분석가나 백엔드 개발자가 보면 정말 도움이 될 내용이라 풀어서 소개해볼게요.
핵심 패턴들
첫 번째 패턴은 속도 체크(velocity check) 예요. 이게 뭐냐면, 한 사용자나 한 카드가 짧은 시간 안에 비정상적으로 많은 거래를 일으키는지 보는 거예요. 예를 들어 같은 카드로 5분 안에 10건 결제가 일어났다면 사람의 정상적인 쇼핑 행동이라고 보기 어렵죠. SQL로는 윈도우 함수를 써서 COUNT(*) OVER (PARTITION BY card_id ORDER BY tx_time RANGE BETWEEN INTERVAL '5 minutes' PRECEDING AND CURRENT ROW) 같은 식으로 작성합니다. 결제 카드뿐 아니라 IP, 디바이스 핑거프린트, 배송지 같은 다양한 키로 같은 로직을 돌려요.
두 번째는 금액 패턴 이상 탐지예요. 사기꾼들은 보통 카드 한도를 테스트하기 위해 작은 금액(1달러, 2달러)을 먼저 긁어보거든요. 이걸 카드 테스팅이라고 부르는데, WHERE amount < 5 AND status = 'success'로 필터링한 다음 같은 카드에서 그 후 24시간 내에 큰 금액 결제가 발생하는지를 LEFT JOIN으로 연결해서 확인하는 패턴이 자주 나옵니다. 반대로 한 번에 너무 큰 금액이 나오는 거래도 평균 거래액의 z-score를 계산해서 잡아내고요.
세 번째 패턴은 그래프 형태의 연결성 분석이에요. 이게 SQL로 표현하기 가장 까다로운 부분인데요, 예를 들어 같은 이메일 도메인을 쓰는 여러 계정이 같은 IP에서 가입했고, 같은 카드 BIN을 쓴다면 이건 한 사람이 만든 어뷰징 계정 무리일 가능성이 높거든요. 이런 걸 잡으려면 SELF JOIN을 여러 번 걸거나, PostgreSQL의 재귀 CTE(WITH RECURSIVE)를 활용합니다. 본격적으로는 Neo4j 같은 그래프 DB나 GNN을 쓰지만, 1차 룰은 SQL로 충분히 가능해요.
네 번째는 시간대 이상 탐지입니다. 한국 사용자가 갑자기 새벽 3시에 동남아 IP로 접속해서 결제를 시도한다면 의심해야겠죠. EXTRACT(HOUR FROM tx_time AT TIME ZONE user_timezone)으로 사용자 현지 시간 기준의 거래 시각을 뽑고, 과거 패턴과 비교하는 식이에요. 여기에 IP 지오로케이션이 평소 사용 국가와 다른지를 결합하면 정확도가 훨씬 올라갑니다.
룰 기반에서 ML로 가는 길
이런 SQL 패턴들의 한계도 있어요. 룰을 한 번 만들어두면 사기꾼들이 그 룰을 우회하는 방법을 금방 찾아내거든요. 그래서 실무에서는 SQL로 만든 피처(feature)들을 그대로 ML 모델의 입력으로 쓰는 방식으로 진화하고 있어요. 예를 들어 위에서 만든 5분 윈도우 거래 수, 평균 거래액 대비 z-score, 같은 IP 가입 계정 수 같은 값들을 feature store에 적재하고, XGBoost나 GNN 모델이 이걸 받아서 최종 사기 점수를 계산하는 구조예요.
Stripe Radar, Sift, Forter 같은 상용 서비스도 내부적으로는 비슷한 피처들을 수천 개씩 만들어서 모델에 넣어요. 차이는 그 피처의 양과 모델의 정교함, 그리고 글로벌 단위의 학습 데이터겠죠.
한국 개발자에게 주는 시사점
네이버페이, 카카오페이, 토스 같은 한국 핀테크 회사들도 결국 같은 패턴을 씁니다. 만약 백엔드 개발자나 데이터 분석가로 이쪽 도메인에 관심이 있다면, 윈도우 함수와 시계열 분석 SQL을 깊게 파두는 게 정말 큰 무기가 돼요. 그리고 자기 회사의 거래 로그를 보면서 "이 사기 시나리오라면 어떤 쿼리로 잡을 수 있을까?"를 연습해보는 게 머신러닝 책 한 권 보는 것보다 실전에 도움이 됩니다.
마무리
사기 탐지는 결국 데이터를 보는 눈의 문제예요. 모델이 아무리 좋아도 좋은 피처가 없으면 무용지물이고, 좋은 피처는 결국 도메인 이해 + SQL 실력에서 나옵니다. 여러분 회사의 가장 의심스러운 거래는 어떤 패턴이세요?
🔗 출처: Hacker News
"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"
실제 수강생 후기- 비전공자도 6개월이면 첫 수익
- 20년 경력 개발자 직강
- 자동화 프로그램 + 소스코드 제공