Python 가이드: 도메인이 사기인지 감지하는 방법
Source: Dev.to
소개
온라인 쇼핑과 새로운 웹사이트 가입은 일상적인 활동이지만, 사기 도메인을 마주치는 일도 일상입니다. 이런 수상한 사이트는 돈을 빼앗거나 민감한 정보를 탈취하거나, 몇 주만 운영하고 사라질 수 있습니다. 이 가이드는 Python을 사용해 웹사이트를 자동으로 스캔하여 사기 신호를 감지하는 방법을 보여주고, 각 검사가 왜 중요한지 설명하며, 작동하는 스크립트를 제공하고, 결과 해석 방법을 알려줍니다.
사기 도메인을 찾기 어려운 이유
사기꾼은 몇 분 안에 세련된 웹스토어나 가짜 랜딩 페이지를 만들 수 있습니다. 흔히 쓰이는 수법은 다음과 같습니다:
- 최근 1년 이내에 등록된 저렴하거나 무료 도메인, 종종 몇 주 전만에 등록
- WHOIS 프라이버시 보호(예: WhoisGuard, DomainsByProxy)로 소유자 신원 은폐
- 실제 이메일 설정이 없고—웹 폼만 존재, 그 정도
- HTTPS가 깨졌거나 누락
- 충동 구매자를 유인하기 위한 과도한 할인 또는 공격적인 판매 문구
- “실제” 정책 페이지, 사회적 증명, 기업 흔적이 거의 없음
많은 정식 스타트업도 초기에는 이러한 신호 중 일부를 보일 수 있습니다. 여러 레드 플래그가 동시에 발견될수록 위험도는 높아집니다.
가장 중요한 기술 신호
| 신호 | 왜 중요한가 |
|---|---|
| 도메인 연령 – 최근 몇 개월 내에 등록된 사이트인가? | 대부분의 사기는 새로 만든 도메인을 사용합니다. |
| WHOIS 프라이버시 – 소유자가 프라이버시 서비스 뒤에 숨김 | 검증이 어려워집니다. |
| MX 레코드 없음 – 공개 이메일 설정 부재 | 실제 사업체는 보통 MX 레코드를 가지고 있습니다. |
| HTTPS/SSL – 인증서가 없거나 만료됨 | 방문자에게 신뢰 문제가 됩니다. |
| 페이지 내 의심스러운 콘텐츠 – “오늘만 70% 할인!”, 일반적인 “보안 결제” 배지 | 전형적인 사기 수법입니다. |
| 연락처/정책 페이지 누락 또는 위조 – 연락 방법이 없고, 복사·붙여넣기된 정책 | 신뢰성이 낮음을 나타냅니다. |
단일 신호만으로는 사기를 확정할 수 없지만, 여러 신호가 동시에 나타나면 위험도가 크게 상승합니다.
Python에서 WHOIS, DNS, HTTPS 및 콘텐츠 정보를 가져오기
필요 라이브러리
- Python 3.7 이상
python-whoisrequestsbeautifulsoup4dnspythontldextract
다음 명령으로 설치합니다:
pip install python-whois requests beautifulsoup4 dnspython tldextract
스크립트
아래 스크립트는:
- WHOIS 정보를 가져와 도메인 연령과 프라이버시 여부를 확인합니다.
- 이메일용 DNS 레코드(MX)를 검사합니다.
- HTTPS로 홈페이지를 시도해 가져오고(실패 시 HTTP로 fallback)합니다.
- 의심스러운 텍스트(플래시 세일, 정책 부재, 신뢰 배지)를 스크랩합니다.
- 증거를 종합해 위험 점수와 판정을 제공합니다.
import re
import json
import whois
import requests
import dns.resolver
from bs4 import BeautifulSoup
from datetime import datetime, timezone
import tldextract
HEADERS = {"User-Agent": "Mozilla/5.0 (DomainRisk/0.1)"}
TIMEOUT = 10
def domain_age_days(w):
created = w.get("creation_date")
if isinstance(created, list):
created = created[0] if created else None
if not isinstance(created, datetime):
return None
if created.tzinfo is None:
created = created.replace(tzinfo=timezone.utc)
return (datetime.now(timezone.utc) - created).days
def whois_privacy(w):
text = " ".join(str(w.get(k, "")).lower() for k in ["registrar", "org", "name"])
return any(t in text for t in ["privacy", "proxy", "whoisguard", "redacted", "withheld"])
def resolve_dns(domain):
out = {"A": [], "MX": []}
try:
out["A"] = [r.to_text() for r in dns.resolver.resolve(domain, "A")]
except Exception:
pass
try:
out["MX"] = [r.to_text() for r in dns.resolver.resolve(domain, "MX")]
except Exception:
pass
return out
def fetch(url):
try:
r = requests.get(url, headers=HEADERS, timeout=TIMEOUT)
if 200 = 50 else ("Moderate Risk" if score >= 30 else "Lower Risk")
return {
"domain": norm,
"age_days": age,
"dns": dns,
"signals": signals,
"risk_score": score,
"risk_band": band,
}
if __name__ == "__main__":
import sys
if len(sys.argv) ")
raise SystemExit(1)
print(json.dumps(analyze(sys.argv[1]), indent=2))
스크립트 실행
-
위 코드를
scan.py파일로 저장합니다. -
터미널을 열고 아직 설치하지 않았다면 의존성을 설치합니다:
pip install python-whois requests beautifulsoup4 dnspython tldextract -
도메인을 테스트합니다:
python scan.py example.com
스크립트는 다음 정보를 포함한 JSON 객체를 출력합니다:
- 도메인 연령
- DNS 상태(특히 MX/이메일)
- 공격적인 할인, 정책 부재, 검증되지 않은 신뢰 배지 탐지 여부
risk_score와 위험 구간(High Risk,Moderate Risk,Lower Risk)
실제 사례
의심스러운 패션 스토어를 검토한 결과, 자동 “로봇” 검사가 사기 가능성을 포착하는 데 어떻게 도움이 되었는지 보여줍니다:
CKlinen.com: A Scam Fashion Store Review (실제 URL이 있다면 교체하세요)
결론
조금의 Python과 올바른 검증만 있으면 사기 도메인을 이전보다 더 빠르고 정확하게 선별할 수 있습니다. 호기심을 유지하고, 효과적인 방법을 공유하며, 온라인 쇼핑 시 가족과 친구들을 안전하게 보호하세요. 개선 아이디어가 있거나 스크립트에 기여하고 싶다면 댓글을 남기거나 GitHub gist를 열어 주세요—작은 도움이 모여 온라인 사기 방지에 큰 힘이 됩니다.