AI 기반 피싱 URL 탐지기 구축하기
요약
Python을 사용하여 피싱 URL을 탐지하는 실용적인 보안 시스템 구축 방법을 다룹니다. 피처 엔지니어링부터 그래디언트 부스팅 분류기 학습, 언어 모델을 활용한 에스컬레이션 레이어 추가까지의 전 과정을 설명합니다.
핵심 포인트
- 도메인 길이, 점 개수, 엔트로피 등 URL 구조적 특징을 활용한 피처 엔지니어링
- HistGradientBoostingClassifier를 이용한 빠르고 해석 가능한 분류 모델 학습
- 모호한 사례 판별을 위한 언어 모델(LLM) 에스컬레이션 레이어 도입
- 저지연(Low-latency) 보안 스택 구축을 통한 실질적인 방어 전략
피싱은 2026년에도 가장 효과적인 공격 벡터 중 하나로 남아 있습니다. 이는 방어자가 무능해서가 아니라, 공격자들이 악성 URL을 합법적인 것처럼 보이게 만드는 데 매우 능숙해졌기 때문입니다. secure-login.paypal-account-verification.com/oauth와 같은 URL은 대충 훑어보면 통과됩니다. 사용자는 이를 잡아내지 못할 것입니다. 하지만 잘 만들어진 탐지기는 잡아낼 수 있습니다.
이 포스트에서는 Python을 사용하여 실용적인 피싱 URL 탐지기를 구축하는 과정, 즉 피처 엔지니어링 (Feature engineering), 분류기 (Classifier) 학습, 그리고 모호한 사례를 위한 언어 모델 (Language model) 에스컬레이션 레이어 추가 과정을 살펴봅니다.
URL 기반 탐지가 효과적인 이유
대부분의 피싱 URL은 합법적인 URL이 피하는 구조적 패턴을 공유합니다. 도메인의 문자 분포가 특이하거나, 경로 (Path)가 비정상적으로 길 수 있습니다. 호스트 이름 (Hostname)에 브랜드 이름(paypal, netflix, google)이 등록 가능한 도메인 자체가 아닌 서브도메인 (Subdomain)이나 경로 구성 요소로서 이상한 위치에 포함되기도 합니다.
이러한 신호들은 개별적으로는 완벽하지 않지만, 분류기 (Classifier)를 구성하는 데에는 매우 유용합니다. 목표는 100% 정확도를 달성하는 것이 아니라, 사용자가 클릭하기 전에 검토할 가치가 있는 URL을 표시해 주는 신뢰할 수 있고 지연 시간이 낮은 (Low-latency) 보안 스택 레이어를 추가하는 것입니다.
피처 엔지니어링 (Feature engineering)
모델을 다루기 전에 무엇을 측정할지 결정해야 합니다. 실제 사례에서 지속적으로 나타나는 피처 (Features)들은 다음과 같습니다:
- 도메인 길이 (Domain length): 피싱 도메인은 더 긴 경향이 있습니다.
- 호스트 이름 내 점(.) 개수 (Dot count in hostname):
mail.secure.paypal.verification.com은paypal.com보다 점이 더 많습니다. - 숫자 비율 (Digit ratio): 숫자가 많을수록 자동 생성된 호스트 이름일 가능성이 높습니다.
- IP 주소 존재 여부 (Presence of IP address):
http://192.168.1.1/login은 전형적인 징후입니다. - URL 단축 서비스 사용 (Use of URL shorteners) (bit.ly, tinyurl 등)
- 경로/쿼리에 의심스러운 키워드 포함 (Suspicious keywords in path/query):
login,verify,account,secure,update등 - 도메인의 엔트로피 (Entropy of the domain): 높은 Shannon 엔트로피는 알고리즘에 의해 생성된 이름을 시사합니다.
import re
import math
from urllib.parse import urlparse
...
몇 개의 URL을 대상으로 실행하여 무결성 검사 (sanity-check)를 수행해 보세요. paypal.com은 secure-paypal-login.verification-center.com과 매우 다른 점수를 받아야 합니다.
그래디언트 부스팅 분류기 (Gradient Boosting Classifier) 학습하기
그래디언트 부스팅 모델 (scikit-learn의 HistGradientBoostingClassifier)은 이 작업에 매우 적합합니다. 이 모델은 이진 (binary) 특징과 연속 (continuous) 특징의 혼합을 잘 처리하며, 학습 속도가 빠르고, 왜 특정 URL을 플래그(flag)했는지 설명할 수 있을 만큼 해석 가능성 (interpretability)이 높습니다.
학습 데이터의 경우, PhishTank 데이터셋 (피싱 URL)과 Tranco top-1M (정상 URL)이 표준적인 소스입니다. 다음은 학습 스캐폴드 (scaffold)입니다:
import pandas as pd
from sklearn.ensemble import HistGradientBoostingClassifier
from sklearn.model_selection import train_test_split
...
약 10만 개의 URL로 구성된 균형 잡힌 데이터셋에서, 이 모델은 일반적으로 96~98%의 정확도와 2% 미만의 오탐률 (false positive rate)에 도달합니다. 이는 합리적인 시작점입니다.
언어 모델 (Language Model)을 제2의 의견으로 활용하기
분류기는 빠르고 저렴하므로 첫 번째 필터로 사용해야 합니다. 하지만 경계선에 있는 사례들 (점수가 0.3에서 0.7 사이인 경우)에 대해서는 문맥 분석 (contextual analysis)을 위해 언어 모델로 에스컬레이션 (escalate)할 수 있습니다.
LLM은 특징 추출기 (feature extractor)가 할 수 없는 것들에 대해 추론할 수 있습니다. 예를 들어, 도메인이 사칭하고 있는 브랜드에 속하는 것이 타당한지, 경로 구조가 알려진 피싱 키트 (phishing kit) 패턴과 일치하는지 등을 판단할 수 있습니다. 핵심은 구조화된 출력 (structured output)입니다. 자유 형식의 텍스트가 아니라, 판결 (verdict)과 추론 문자열 (reasoning string)을 출력해야 합니다:
import json
def build_prompt(url: str) -> str:
...
이러한 하이브리드 (hybrid) 접근 방식은 비용을 낮게 유지합니다. 언어 모델은 모호한 중간 대역에 속하는 약 20%의 URL만 처리하게 됩니다.
탐지기 운영화 (Operationalizing)
노트북에서 프로덕션 (production) 환경으로 넘어갈 때 몇 가지 중요한 사항이 있습니다:
지연 시간 (Latency): 특징 추출기는 마이크로초 (microseconds) 단위로 실행됩니다. 분류기는 몇 밀리초 (milliseconds)를 추가합니다. LLM 호출은 경계선 사례를 위해 남겨두고 엄격한 타임아웃 (timeout)을 설정하십시오 (동기식 보안 검사의 경우 500ms가 적절합니다).
도메인 연령 (Domain age): WHOIS 조회를 수행하면 지연 시간 (latency)이 추가되지만, 높은 신뢰도의 판정을 내리는 데 그만한 가치가 있습니다. 최근 30일 이내에 등록된 도메인은 악성일 확률이 불균형적으로 높습니다. 결과값을 공격적으로 캐싱 (cache)하십시오.
피드백 루프 (Feedback loop): 모든 오탐 (false positive)은 사용자의 신뢰를 잃게 만듭니다. 첫날부터 보고 엔드포인트 (reporting endpoint)를 구축하고, 수집된 수정 사항을 사용하여 매달 재학습 (retrain)을 진행하십시오.
모델이 탐지하지 못하는 것: 호모그래프 공격 (homograph attacks), 학습 데이터에 아직 포함되지 않은 제로데이 피싱 키트 (zero-day phishing kits), 그리고 단지 의심스러워 보일 뿐인 합법적인 서비스 등이 있습니다. 알려진 악성 리스트와 URL을 대조하는 위협 인텔리전스 피드 (threat intelligence feed)는 분류기 (classifier) 단독으로는 메울 수 없는 공백을 채워줍니다. URL 탐지와 함께 쌓아 올릴 가치가 있는 추가적인 방어 계층에 대한 구조화된 참조를 보려면 당사의 보안 강화 체크리스트 (security hardening checklists)를 확인하십시오.
핵심 요약 (The takeaway)
피싱 URL 탐지는 실질적인 현실 세계의 영향력을 측정할 수 있는, 범위가 잘 정해진 문제입니다. 특징 기반 (feature-based) 그래디언트 부스팅 분류기 (gradient boosting classifier)를 사용하면 최소한의 인프라로 약 97%의 정확도를 얻을 수 있습니다. 여기에 언어 모델 에스컬레이션 계층 (language model escalation layer)을 추가하면 결정 경계 (decision boundary)에 위치한 모호한 사례들을 처리할 수 있습니다. 이 둘을 결합하면 견고하고, 설명 가능하며, 운영 비용이 저렴한 첫 번째 방어선이 됩니다.
특징 추출기 (feature extractor)부터 시작하십시오. PhishTank과 Tranco 데이터를 사용하여 학습하십시오. 차단 모드 (blocking mode)로 배포하기 전에 자체 트래픽을 대상으로 오탐율 (false positive rate)을 측정하십시오. 그 지점부터 반복적으로 개선해 나가십시오.
저는 사이버 보안 컨설팅 기업인 AYI NEDJIMI Consultants를 운영하고 있습니다. 저희는 PDF 및 Excel 형식의 무료 보안 강화 체크리스트 (free security hardening checklists)를 발행합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기