Python 가이드: 도메인이 사기인지 감지하는 방법

발행: (2025년 12월 15일 오전 02:43 GMT+9)
7 min read
원문: Dev.to

Source: Dev.to

소개

온라인 쇼핑과 새로운 웹사이트 가입은 일상적인 활동이지만, 사기 도메인을 마주치는 일도 일상입니다. 이런 수상한 사이트는 돈을 빼앗거나 민감한 정보를 탈취하거나, 몇 주만 운영하고 사라질 수 있습니다. 이 가이드는 Python을 사용해 웹사이트를 자동으로 스캔하여 사기 신호를 감지하는 방법을 보여주고, 각 검사가 왜 중요한지 설명하며, 작동하는 스크립트를 제공하고, 결과 해석 방법을 알려줍니다.

사기 도메인을 찾기 어려운 이유

사기꾼은 몇 분 안에 세련된 웹스토어나 가짜 랜딩 페이지를 만들 수 있습니다. 흔히 쓰이는 수법은 다음과 같습니다:

  • 최근 1년 이내에 등록된 저렴하거나 무료 도메인, 종종 몇 주 전만에 등록
  • WHOIS 프라이버시 보호(예: WhoisGuard, DomainsByProxy)로 소유자 신원 은폐
  • 실제 이메일 설정이 없고—웹 폼만 존재, 그 정도
  • HTTPS가 깨졌거나 누락
  • 충동 구매자를 유인하기 위한 과도한 할인 또는 공격적인 판매 문구
  • “실제” 정책 페이지, 사회적 증명, 기업 흔적이 거의 없음

많은 정식 스타트업도 초기에는 이러한 신호 중 일부를 보일 수 있습니다. 여러 레드 플래그가 동시에 발견될수록 위험도는 높아집니다.

가장 중요한 기술 신호

신호왜 중요한가
도메인 연령 – 최근 몇 개월 내에 등록된 사이트인가?대부분의 사기는 새로 만든 도메인을 사용합니다.
WHOIS 프라이버시 – 소유자가 프라이버시 서비스 뒤에 숨김검증이 어려워집니다.
MX 레코드 없음 – 공개 이메일 설정 부재실제 사업체는 보통 MX 레코드를 가지고 있습니다.
HTTPS/SSL – 인증서가 없거나 만료됨방문자에게 신뢰 문제가 됩니다.
페이지 내 의심스러운 콘텐츠 – “오늘만 70% 할인!”, 일반적인 “보안 결제” 배지전형적인 사기 수법입니다.
연락처/정책 페이지 누락 또는 위조 – 연락 방법이 없고, 복사·붙여넣기된 정책신뢰성이 낮음을 나타냅니다.

단일 신호만으로는 사기를 확정할 수 없지만, 여러 신호가 동시에 나타나면 위험도가 크게 상승합니다.

Python에서 WHOIS, DNS, HTTPS 및 콘텐츠 정보를 가져오기

필요 라이브러리

  • Python 3.7 이상
  • python-whois
  • requests
  • beautifulsoup4
  • dnspython
  • tldextract

다음 명령으로 설치합니다:

pip install python-whois requests beautifulsoup4 dnspython tldextract

스크립트

아래 스크립트는:

  1. WHOIS 정보를 가져와 도메인 연령과 프라이버시 여부를 확인합니다.
  2. 이메일용 DNS 레코드(MX)를 검사합니다.
  3. HTTPS로 홈페이지를 시도해 가져오고(실패 시 HTTP로 fallback)합니다.
  4. 의심스러운 텍스트(플래시 세일, 정책 부재, 신뢰 배지)를 스크랩합니다.
  5. 증거를 종합해 위험 점수와 판정을 제공합니다.
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))

스크립트 실행

  1. 위 코드를 scan.py 파일로 저장합니다.

  2. 터미널을 열고 아직 설치하지 않았다면 의존성을 설치합니다:

    pip install python-whois requests beautifulsoup4 dnspython tldextract
  3. 도메인을 테스트합니다:

    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를 열어 주세요—작은 도움이 모여 온라인 사기 방지에 큰 힘이 됩니다.

Back to Blog

관련 글

더 보기 »

Python과 측량공학 결합

소개 안녕하세요, 측량 및 GIS 애호가 여러분! 저는 Python이 일상적인 측량 엔지니어링 작업을 어떻게 크게 향상시킬 수 있는지 깊이 탐구하고 있었고, 그리고 저는…