실시간 금융 사기 탐지를 위한 스트리밍·그래프 아키텍처
실시간 트랜잭션 모니터링과 그래프 분석을 결합해 금융 사기를 탐지하는 스트리밍 파이프라인, 모델 운영, 감사 아키텍처를 정리한다.
2026-08-14 · 최초 발행 2024-04-29
거래 판정은 점수 하나로 끝나지 않는다
카드 결제, 계좌이체, 로그인, 디바이스 지문 이벤트는 거래가 진행되는 동안 위험 여부를 판단해야 한다. 실시간 트랜잭션 모니터링은 이 이벤트를 서브초 단위로 수집하고, 특징을 만들고, 점수를 계산한 뒤 판정까지 이어 가는 스트리밍 기반 위험 평가 체계다. 목표 지연 시간은 P95 50~150ms 수준으로 둔다.
그래프 기반 사기 네트워크는 계정, 기기, 카드, IP, 수취인처럼 서로 연결된 엔티티와 관계를 그래프로 표현한다. 공모, 대포통장, 자금 세탁처럼 개별 거래만으로는 드러나지 않는 패턴을 찾을 때 중심성, 커뮤니티, 경로 기반 특징을 사용한다.
판정 계층은 규칙 기반 탐지와 지도학습·이상 탐지, 그래프 분석을 함께 쓴다. 규칙은 속도와 설명 가능성을, 학습 모델은 정확도와 적응성을, 그래프는 네트워크 맥락을 담당한다. 온라인과 오프라인의 피드백 루프도 이 구조 안에서 운영한다.
처리 일관성과 거버넌스도 판정 정확도만큼 중요하다. Exactly-once 처리, 지연·유실 대응, 감사 추적성을 갖추고 개인정보는 최소 수집, 가명화, 권한 분리 원칙으로 다룬다. 최신 규제·감독 지침은 최신 정보 확인이 필요하다.
이벤트에서 조치까지 이어지는 경로
채널에서 들어오는 이벤트는 Kafka 등으로 모으고 Flink 또는 Spark에서 윈도우 집계와 조인을 수행한다. Watermark, Idempotency, Exactly-once는 중복, 지연, 재처리에 대응하기 위한 기반이다.
이벤트 스키마는 고정하고 스키마 레지스트리와 호환성 관리를 둔다. 세션·슬라이딩 윈도우처럼 상태ful 연산을 운용하면서 지연 데이터 처리 전략을 정하고, 장애 뒤 재처리나 리플레이도 안전하게 수행할 수 있어야 한다. 오프셋 커밋은 트랜잭션적으로 처리한다.
온라인 피처에는 거래 빈도, 금액 분포, 지리·디바이스 다양성, 시간대 패턴, 수취인 신선도 등이 포함된다. 그래프에서 얻는 노드 차수, 커뮤니티 점수, 위장거리도 동기화한다. 온라인·오프라인 피처의 동등성을 유지하고 Materialization 주기를 관리하며, 데이터 드리프트와 KS-검정은 모니터링과 자동 경보 대상으로 둔다. 실시간 조회 SLA는 <10ms로 두고 캐시와 TTL을 운용한다.
모델 계층에서는 규칙 기반 필터, Gradient Boosting/Deep Learning 점수, LOF/Isolation Forest 기반 이상 탐지, GNN/Graph 알고리즘을 결합할 수 있다. 점수 집계와 임계값, 단계적 인증(스텝업) 정책을 연결해 승인·추가인증·보류로 리스크를 버킷팅하고 필요한 경우 케이스를 만든다. 앙상블·스택킹, 비용 민감 손실함수, 임계값 캘리브레이션을 적용하며, SHAP/LIME 기반 설명과 규칙 히트 로그를 남긴다.
그래프 스토리지는 Neo4j, TigerGraph, JanusGraph 등으로 엔티티와 관계를 보존한다. 실시간 근접 탐색과 커뮤니티 탐지를 수행하되, 대규모 그래프에서는 오프라인 전계산과 온라인 증분 업데이트를 함께 사용한다. Entity Resolution과 유사도 머지 전략, 고정·가중 그래프, 시간 축 그래프(temporal edge)를 운영하고, 저지연 질의용 핫패스와 배치 분석용 콜드패스를 분리한다.
입력 이벤트는 Kafka로 들어와 스트리밍 집계, 피처 조회, 그래프 질의, 모델 스코어링, SLA 판단과 폴백을 거친다. 결과는 승인·차단 액션으로 이어지고, Outbox 이벤트를 통해 케이스 관리와 감사 로그에 적재된다.
SLA를 초과하면 폴백 규칙을 적용한다. 모델이나 피처가 실패한 경우에도 기본 정책으로 보수적 차단 또는 스텝업을 강제한다. 재시도 과정에서는 멱등 키로 중복을 막고, Exactly-once 싱크와 Outbox 패턴으로 부수 효과를 분리한다. 케이스와 감사 로그는 원거래 키를 기준으로 원자적으로 기록한다.
사기 유형별로 달라지는 판정 맥락
카드 결제에서의 즉시 보류
해외 IP에서의 최초 결제, 고액 거래, 신규 수취인이 동시에 나타나고 그래프상 고위험 커뮤니티와의 근접도가 높아지는 상황을 생각할 수 있다. 100ms 안에 피처와 그래프를 조회한 뒤 모델 점수 0.92를 받아 보류로 판정하고, 3DS/OTP 기반 스텝업 인증을 요구한다. 인증에 실패하면 거래를 차단하고 케이스를 생성한다.
이 경로에서는 P95 120ms를 유지하면서 화이트리스트와 동적 임계값으로 오탐을 완화한다.
계정 탈취 징후의 처리
짧은 시간에 여러 디바이스에서 로그인하고 토큰이 재사용되며 비정상적인 지역 이동이 관찰되면 계정 탈취(ATO) 가능성을 평가한다. 로그인 이벤트를 스트리밍으로 점수화해 위험 임계를 넘으면 세션 토큰을 폐기하고 MFA를 강제한다. 같은 디바이스에서 자금 이체가 이어질 경우 거래를 일시 보류한다.
로그인 경로의 SLA 목표는 80ms이며, 고객 불편을 줄이기 위해 리스크 기반 MFA를 적용한다.
대포통장과 보이스피싱 연결망
다계좌와 다수취인 사이의 환류, 자금 쪼개기와 분산 이체는 네트워크 관점에서 확인할 수 있다. 커뮤니티 탐지와 경로 길이 제한으로 위험 군집을 식별하고, 관련 계좌의 거래 상한을 축소하면서 모니터링을 강화한다. 필요하면 FIU 의심거래 보고 트리거로 연결한다.
그래프는 오프라인 전계산을 15분 주기로 수행하고, 온라인 증분 갱신은 5초 내 반영한다.
규칙·그래프·하이브리드의 운영상 차이
| 접근 방식 | 성능(지연) | 확장성 | 일관성 | 안정성 | 운영 편의 |
|---|---|---|---|---|---|
| 규칙 기반 | 매우 낮음 | 높음 | 높음 | 높음 | 매우 높음 |
| 그래프 분석 | 중간 | 중간 | 중간 | 중간 | 중간 |
| 하이브리드(권장) | 낮음 | 높음 | 높음 | 높음 | 중간 |
하이브리드 경로에서는 실시간 판정에 경량 규칙과 ML을 두고, 그래프는 요약 피처와 근접 점수로 경량화해 지연을 줄인다. 배치 그래프 분석은 심층 수사와 정책 보강에 사용한다.
손실과 운영 부담에 미치는 영향
이 구조는 연간 사기 손실을 3060% 감소시킬 수 있으며, 채널별 고위험 구간에 집중하면 추가 1015%p 개선이 가능하다. 규칙 단독 방식과 비교한 오탐율은 20~40% 감소하고 고객 경험 유지율은 높아진다.
공모·대포통장 네트워크 탐지율은 23배 향상되고 신규 패턴 대응 시간 TTR은 50% 단축된다. 조사관 처리량은 1.52배 증가하며, 케이스 자동 라우팅으로 처리 지연은 30% 축소된다. 온라인 경로는 P95 < 120ms, 가용성은 99.95% 수준 달성을 목표로 한다.
일관성, 개인정보, 신뢰성을 함께 운영하기
스트리밍 일관성에는 Exactly-once 싱크, 멱등 키, Outbox/인박스 패턴을 적용한다. 엄격한 일관성은 지연을 늘릴 수 있으므로 승인 경로에서는 멱등성과 폴백을 우선하고, 후속 보정은 비동기로 처리한다.
모델 거버넌스에서는 피처와 모델 버전을 고정하고 학습-서빙 스큐를 테스트한다. 재현 가능한 데이터 스냅샷도 보관한다. 설명 가능성과 성능 최적화 사이에는 긴장이 있으므로 고위험 정책에는 규칙과 해석 가능한 모델을 병행한다.
PII는 가명화와 필드레벨 암호화를 적용하고 최소권한과 감사 추적을 유지한다. 키 관리(HSM/KMS)는 일원화한다. 암호화와 마스킹은 조회 지연을 높일 수 있으므로 핫패스에는 토큰화 캐시를 활용한다.
배포는 카나리·블루그린, 서킷브레이커, 백프레셔 관리로 운영한다. 카드 처리를 위해 다중 리전 활성-활성을 구성할 수 있지만 데이터 합의 비용이 증가한다. 지연 최적화를 위해 지역 안에서 판정하고 글로벌 데이터는 사후 동기화한다.
규제 측면에서는 AML/KYC/PSD2 SCA/전자금융감독규정 맵핑 매트릭스와 정기 모델 검증, 바이어스 점검을 둔다. 규정이 강화되면 오탐이 늘어날 수 있으므로 비율 상한과 예외 승인 위원회로 균형을 조정한다. 최신 정보 확인이 필요하다.
스트리밍 점수화 파이프라인 예시
전제: Python 3.10, Apache Flink 1.17, Kafka 3.6, 피처 스토어 HTTP API, 모델 서버 gRPC
# pip install apache-flink confluent-kafka requests grpcio
from pyflink.datastream import StreamExecutionEnvironment
from confluent_kafka import Consumer, Producer
import requests, grpc, json, time
SLA_MS = 150
def fetch_features(tx):
r = requests.get("http://feature-svc/v1/get", params={"aid": tx["acct_id"], "mid": tx["merchant"]}, timeout=0.01)
return r.json()
def score(tx_with_feat):
# gRPC 호출 생략: 응답 예시로 점수 반환
return 0.87
def decide(score):
if score >= 0.9: return "BLOCK"
if score >= 0.7: return "STEP_UP"
return "ALLOW"
# 최소 실행 예시(프로덕션: Flink Source/Sink로 대체)
c = Consumer({"bootstrap.servers":"kafka:9092","group.id":"fraud"})
p = Producer({"bootstrap.servers":"kafka:9092"})
c.subscribe(["tx-input"])
while True:
msg = c.poll(0.01)
if not msg: continue
t0 = time.time()
tx = json.loads(msg.value())
try:
feat = fetch_features(tx)
s = score({**tx, **feat})
except Exception:
s = 1.0 # 폴백: 보수적 차단
latency = (time.time()-t0)*1000
action = decide(s) if latency <= SLA_MS else "STEP_UP"
out = json.dumps({"tx_id": tx["id"], "score": s, "latency_ms": latency, "action": action})
p.produce("tx-decisions", out.encode("utf-8"))
c.commit(asynchronous=False)
그래프 근접 위험을 조회하는 Cypher 예시
전제: Neo4j 5.x, 거래-계정-디바이스 그래프 모델
// 계정 a가 고위험 커뮤니티와 얼마나 인접한지 근접도 평가
MATCH (a:Account {id:$acctId})
MATCH (m:Community {risk:'HIGH'})
MATCH path = shortestPath((a)-[:USED|TRANSFERRED_TO*..4]-(m))
RETURN length(path) AS hop, 1.0 / (1 + length(path)) AS proximity
ORDER BY hop ASC LIMIT 1;
실시간 경로의 기본선을 먼저 세우고 온라인 피처와 모델 서빙의 정합성을 맞춘 뒤 그래프 특성을 주입한다. 이후 거버넌스와 규정 준수 체계를 고도화하는 순서로 확장할 수 있다.