사이버 범죄에 맞서는 IP 인텔리전스: 사이버 공격을 예방하는 방법
사이버 범죄에 맞서는 IP 인텔리전스: 어떤 ASN, VPN, Tor, 호스팅 신호가 어떤 공격을 막는지, 7가지 방어를 위한 검증된 Python 코드와 오늘 조회한 실제 결과를 설명합니다.

2026년 10월 15일에 공개 주소 세 개를 조회했을 때, 프로브로 확인된 상용 VPN 서버는 92점(block), Tor 출구는 100점(block), Linode 클라우드 서버에 있는 Nmap 자체 테스트 호스트는 10점(allow)이었습니다. 셋 모두 데이터센터에 있지만 차단된 것은 익명화 도구 둘뿐이었습니다. "클라우드"와 "범죄자" 사이의 이 간극이 이 가이드의 나머지 부분이 다루는 내용입니다.
위험은 예측이 아니라 측정된 것입니다. FBI 인터넷범죄신고센터(IC3)는 2025년에 1,008,597건의 신고를 접수했으며 이는 처음으로 100만 건을 넘은 해였고, 보고된 피해액은 208억 7,700만 달러로 2024년보다 26% 늘었습니다(IC3 2025 Internet Crime Report). 그리고 공격을 실어 나르는 트래픽은 점점 더 사람이 아닙니다. Imperva의 2026 Bad Bot Report에 따르면 자동화 트래픽은 2025년 전체 웹 트래픽의 53% 이상을 차지했으며 전년의 51%에서 증가했습니다.
이 가이드는 신호가 무엇인지, 어떤 범죄 범주를 방해하는지, 오늘 실제 주소에 대해 시험한 Python 코드가 포함된 7가지 방어, 신호와 공격의 대응표, 그리고 IP 데이터가 할 말이 없는 경우를 다룹니다.

IP 인텔리전스가 맨 주소에 더해 주는 것
IP 인텔리전스는 원시 IP 주소를 그 출처와 신뢰성에 대해 드러나는 모든 정보로 보강하는 일입니다. 맨 주소는 숫자일 뿐이지만, 보강 파이프라인을 통과하면 프로필이 됩니다.
- 지리적 위치: 국가, 지역, 대략적인 도시, 시간대.
- 네트워크 소유권: 자율 시스템 번호(ASN)와 해당 주소 공간을 관리하는 조직.
- 연결 유형: 주거용 광대역, 모바일, 비즈니스, 호스팅 및 데이터센터.
- 익명화 플래그: VPN, 프록시 또는 Tor 출구 노드인가?
- 위협 및 악용 신호: 이 주소가 스캔, 스팸 발송, 또는 DNS 블록리스트에서 관찰된 적이 있는가?
- 종합 위험 점수: 위의 신호를 allow, review, step-up, block 판단으로 융합하는 하나의 숫자.
사람들이 헷갈리는 구분이 있습니다. 이것은 IP 지리적 위치와 같지 않습니다. 지리적 위치는 "이 IP가 어디인가"에만 답하며, IP 지리적 위치가 실제로 얼마나 정확한지에서 다루듯 국가 수준에서는 약 99% 정확하지만 도시 수준에서는 훨씬 약합니다. 위치를 넘어 IP 인텔리전스가 다루는 범위에 대한 가이드에서 계층별로 분석하는 더 넓은 분야는 네트워크, 연결 유형, 익명화, 평판 계층을 더해 사기 및 보안 팀이 실제로 신경 쓰는 질문, 즉 이 연결을 신뢰할 수 있는가? 에 답합니다. 대부분의 구현은 국가 필드만 읽는데, 국가 필드만으로는 요청이 정당한지 거의 알 수 없습니다.
출발지 IP가 사이버 범죄 방어의 첫 번째 신호인 이유
출발지 IP가 첫 번째 신호인 이유는 공격자가 다른 거의 모든 것을 위조할 수 있어도 라우팅 가능한 주소는 보여 줘야 하기 때문입니다. 세 가지 구조적 사실이 그 가치를 만듭니다.
1. 피할 수 없습니다. 공격자는 User-Agent를 위조하고, 이메일을 만들어 내고, 도난 카드를 사고, 기기 핑거프린트를 위조할 수 있습니다. 하지만 여러분이 관찰할 수 있는 출발지 IP 없이는 서버에 도달할 수 없습니다. 인프라 뒤에 숨을 수는 있어도 그 인프라 자체가 단서를 남깁니다.
2. 공격자는 인프라를 대규모로 재사용합니다. 수익성 있는 사이버 범죄는 산업화되어 있습니다. 크리덴셜 스터핑 도구는 임대한 서버에서 수천 개의 계정을 두드리고, 카드 테스트 조직은 데이터센터 대역을 순환하며, 스크레이퍼와 매점매석꾼은 클라우드와 프록시 풀에서 실행됩니다. 바로 그 재사용을 네트워크 신호가 드러냅니다. 호스팅 ASN에서의 로그인, 데이터센터 대역에서의 결제, 열린 프록시를 통해 도착하는 "쇼핑객"이 그렇습니다.
3. 비용이 큰 단계 전에 확보할 수 있습니다. IP는 인증과 결제 승인 전, 첫 패킷부터 존재합니다. 따라서 위험을 분류하는 가장 저렴한 지점이며, 비용이 큰 방어(MFA 챌린지, 수동 검토, 추가 KYC)는 정당화될 때만 작동합니다.
아래에서 다시 다룰 함정은 IP가 신호이지 판결이 아니라는 점입니다. 중요한 기술은 일괄 차단이 아니라 누가 더 면밀한 조사를 받을 만한지 결정하는 데 IP를 사용하는 것입니다.
IP 신호가 방해하는 사이버 범죄 범주
사이버 범죄는 하나가 아니므로 이를 막는 IP의 역할도 하나가 아닙니다. 주요 공격 범주별로 출발지 IP가 어떻게 기여하는지를 각 심층 가이드와 함께 소개합니다.
계정 탈취와 크리덴셜 스터핑
크리덴셜 스터핑(유출된 사용자 이름과 비밀번호 쌍을 로그인 양식에 재생하는 것)은 이제 계정 탈취의 지배적인 경로입니다. 이 공격이 수지가 맞는 것은 자동화되어 저렴한 인프라에 분산되기 때문입니다. 조회는 대량 스터핑이 올라타는 호스팅 ASN, 프록시, 익명화된 출구를 플래그하고, 단일 로그인으로는 드러나지 않는 속도 그림(이 IP가 몇 개의 계정을 건드리고 있는가?)에 데이터를 제공합니다. 유의할 점: IP 차단만으로는 실패합니다. 정교한 행위자는 주거용 프록시로 옮겨 가므로 IP는 전체 판단이 아니라 위험 입력이어야 합니다.
결제 사기, 카드 테스트, 결제 악용
결제는 사이버 범죄가 현금으로 바뀌는 곳이어서 카딩 봇, 카드 테스트 스크립트, 그리고 점점 늘어나는 자동화된 AI 쇼핑 에이전트를 끌어들입니다. 카드 테스트는 고속, 소액 승인으로 이루어지며 대개 데이터센터와 프록시 IP에서 옵니다. 연결 유형과 위험 신호를 통해 의심스러운 소수의 결제에는 마찰을 높이고 정상 세션(좋은 에이전트 트래픽 포함)은 그대로 둘 수 있습니다. 선을 어디에 그을지는 IP 위험 점수 몇 점에서 차단해야 할까요?에서 답합니다.
봇, 스크레이퍼, 크롤러 사칭
봇이 이제 웹 트래픽의 다수이므로, 진짜 크롤러와 사칭자를 구별하는 것은 모든 엔드포인트에서 중요합니다. User-Agent: GPTBot 헤더는 누구나 보낼 수 있는 주장입니다. HUMAN Security는 AI 크롤러나 스크레이퍼 User-Agent를 내세운 관찰 트래픽의 5.7%가 위조된 것임을 확인했습니다. 방어는 출처 확인입니다. 역방향 DNS, 공개된 CIDR 대역, Web Bot Auth를 사용한 IP로 AI 크롤러와 에이전트 검증하기입니다. 조회는 User-Agent를 볼 수 없으므로 주장된 이름과 threat.crawler.verified의 비교는 여러분의 코드에서 이루어집니다. 더 넓은 그림은 IP 데이터가 봇을 클래스별로 분류하는 방법을, 콘텐츠나 가격을 복사하는 스크레이퍼는 웹 스크래핑 탐지 가이드를 참고하십시오.
익명화 악용: VPN, 프록시, Tor
익명화는 사이버 범죄자의 위장이지만 개인정보를 중시하는 수백만의 정당한 사람들도 사용합니다. 현대의 VPN 및 프록시 탐지는 오래된 블록리스트가 아니라 공급자 서버 목록, ASN 분석, 능동적 프로토콜 프로빙으로 둘을 구분합니다. 가장 위험한 유형은 주거용 프록시로, 실제 소비자 기기를 통해 트래픽을 라우팅하는 네트워크입니다. Infoblox는 주거용 프록시 도메인에 대한 DNS 쿼리가 2025년 1월 월 4,000억 건에 가깝던 것이 2026년 4월 월 5,000억 건 이상으로 늘었다고 측정했습니다. IP 데이터만으로는 이를 안정적으로 플래그할 수 없고 GeoIPHub는 주거용 프록시를 탐지하지 않으므로, 기기, 행동, 속도 신호로 잡아야 합니다. 정당한 VPN 사용자를 돌려보내지 않고 익명화 트래픽을 다루는 방법은 실제 고객을 차단하지 않고 익명화 트래픽 탐지하기에서 다룹니다.
가짜 계정, 합성 신원, 신규 계정 사기
보너스 악용, 추천 농사, 머니 뮬 활동, 합성 신원 조직은 모두 계정을 대규모로 만드는 데 의존합니다. 가짜 계정마다 "새것처럼 보이는" 출처가 필요하므로 공격자는 프록시와 데이터센터 IP를 계속 갈아 치우며, 이 신호가 드러내는 인프라가 바로 그것입니다. 가입에 위험 점수를 포함시키는 것은 대량 계정 생성의 비용을 높이는 가장 저렴한 방법 중 하나입니다. IP 유형별 가입 검사는 각 유형의 주소가 무엇을 반환하고 어떻게 처리해야 하는지 보여 줍니다.
지역 사기, 위치 위조, 제재 회피
프로모션 악용, 콘텐츠 라이선스 우회, 제재 회피는 모두 위치를 속이는 데 달려 있습니다. 여기서 조회는 이중 역할을 합니다. 지리적 위치는 주장된 위치를 확립하고, VPN, 프록시, 연결 유형 플래그는 그 위치가 위조되고 있는지 드러냅니다. 아래의 지역 제한 방어는 국가 검사가 옆의 익명화 검사 없이는 아무 의미가 없음을 보여 줍니다.
오늘의 조회 세 건: VPN 92, Tor 출구 100, 클라우드 호스트 10
점수는 네트워크 유형이 아니라 증거를 따릅니다. 아래 세 조회는 2026년 10월 15일에 공개 엔드포인트(키 불필요, 분당 30회 조회)에 실행했으며, 응답은 실제 출력을 간추린 것입니다. 대역이 이동하면 결과도 바뀝니다.
curl https://api.geoiphub.com/v1/lookup/102.129.235.17
{
"ip": "102.129.235.17",
"asn": {
"asn": 834,
"org": "IPXO - IPXO LLC",
"asn_type": "vpn",
"connection_type": "datacenter"
},
"detection": {
"is_vpn": true,
"is_hosting": false,
"is_anonymous": true,
"vpn_provider": "none",
"vpn_confidence": 100
},
"scoring": {
"fraud_score": 92,
"recommended_action": "block",
"detection_methods": ["known_vpn_server", "openvpn_open", "ipsec_open"]
}
}
{
"ip": "185.220.101.47",
"asn": {
"asn": 60729,
"org": "TORSERVERS-NET - Stiftung Erneuerbare Freiheit",
"asn_type": "hosting",
"connection_type": "datacenter"
},
"geo": {
"country_code": "DE",
"city": "Hamburg (Hamburg-Nord)"
},
"detection": {
"is_tor": true,
"is_hosting": true,
"is_anonymous": true
},
"threat": {
"is_spammer": true,
"threat_types": ["spammer", "tor"],
"dnsbl_sources": ["bl.spamcop.net"]
},
"scoring": {
"fraud_score": 100,
"recommended_action": "block",
"detection_methods": ["tor_exit", "datacenter_blocklisted", "no_ptr_datacenter", "known_spammer"]
}
}
{
"ip": "45.33.32.156",
"asn": {
"asn": 63949,
"org": "AKAMAI-LINODE-AP - Akamai Connected Cloud",
"asn_type": "hosting",
"connection_type": "datacenter"
},
"detection": {
"is_vpn": false,
"is_hosting": true,
"is_anonymous": false
},
"scoring": {
"fraud_score": 10,
"recommended_action": "allow",
"detection_methods": ["datacenter_ip"]
}
}
VPN 서버의 detection_methods는 독립적인 세 가지 확인을 보여 줍니다. IP가 알려진 VPN 서버와 일치하고, 우리 프로브가 그 서버에서 실제 OpenVPN과 IPsec 핸드셰이크를 완료했습니다. 이 교차 확인이 점수를 block 구간으로 밀어 올립니다. 이 주소는 어떤 공급자의 목록에도 없으므로 vpn_provider는 "none"입니다. Tor 출구는 Tor Project의 출구 목록에 SpamCop 등재가 겹쳐 상한인 100에 도달합니다.
Tor 응답의 method 하나는 보이는 것보다 약합니다. no_ptr_datacenter는 이 주소에 역방향 DNS가 없다는 뜻이지만, 같은 날 아침 실행한 실제 dig -x는 호스트명을 반환했습니다. 우리의 저장된 PTR 데이터는 일부 주소에서 빈틈이 있으므로, 이 판정을 검토할 때는 해당 method에 가장 적은 비중을 두십시오.
Nmap의 테스트 호스트는 호스팅 신호만 있으므로 10점으로 allow를 받습니다. 정당한 API, 모니터, AI 에이전트가 클라우드 서버에서 실행되는 경우가 많으며, 호스팅만으로는 범죄의 증거가 아닙니다. VPN의 block조차 아래 방어에서 보듯 흐름별로 재정의할 수 있는 기본값입니다.
위험 점수가 블록리스트보다 나은 이유
점수가 블록리스트보다 나은 이유는 IP가 판결이 아니라 신호이기 때문입니다. 주거용 IPv4 하나를 통신사급 NAT 뒤의 수백 명이 공유할 수 있으므로 실제 고객과 사기꾼이 같은 주소에 있을 수 있습니다. 깨끗한 주거용 IP가 프록시를 호스팅할 수 있습니다. 데이터센터 IP가 정당한 기업 VPN에 속할 수도 있습니다.
오래가는 패턴은 IP 신호를 위험 점수로 변환한 다음 그 점수로 판단을 라우팅하는 것입니다.
Incoming request
|
v
[ IP lookup ] ASN, connection type, VPN / proxy / Tor, hosting, reputation
|
v
[ Risk score 0-100 ] fuse with device, behavioral, velocity and identity signals
|
+-- low : allow (don't punish the legitimate majority)
+-- medium : step-up / challenge (MFA, CAPTCHA, manual review)
+-- high : block or hold
이것이 IP 블록리스트 운영(취약하고, 오탐이 많고, 쉽게 회피됨)과 연결 위험 점수 산정(단계적이고, 설명 가능하며, 회복력이 있음)의 차이입니다. 설명 가능한 점수가 명명할 수 있는 모든 이유와 가중치는 위험 점수 이유를 필드별로 설명한 글에 나열되어 있습니다.
IP 지리적 위치와 네트워크 신호로 사이버 공격을 예방하는 방법
IP 지리적 위치로 사이버 공격을 예방하려면 국가 이상을 읽어야 합니다. 한 번의 조회에서 나오는 geo, asn, detection, threat, scoring 그룹이 각각 다른 방어를 이끕니다. 아래 일곱 가지는 우리가 가장 자주 보는 것들이며, 각각 붙여 넣어 쓸 수 있는 Python 코드가 있습니다. 모두 작은 헬퍼 하나를 호출합니다.
import json
import urllib.request
API = "https://api.geoiphub.com/v1/lookup/"
def geoiphub_lookup(ip: str, api_key: str = "") -> dict:
# The API currently answers 403 to urllib's default User-Agent, so send your own.
# Without a key you get 30 lookups a minute; with one, 1,500 a day on the free tier.
headers = {"User-Agent": "my-app/1.0"}
if api_key:
headers["x-api-key"] = api_key
req = urllib.request.Request(API + ip, headers=headers)
with urllib.request.urlopen(req, timeout=5) as resp:
return json.load(resp)
1. 에지에서 알려진 악용을 차단하되 검증된 크롤러는 통과시키기
가장 저렴한 방어는 스캐너, 봇넷 노드, Tor 출구가 애플리케이션에 닿기 전에 거절하고 나머지는 점수에 넘기는 것입니다. 두 가지 세부 사항이 중요합니다. 검증된 크롤러가 먼저입니다. 진짜 크롤러가 블록리스트 대역에 있을 수 있기 때문입니다(AhrefsBot의 5.39.1.230은 is_abusive: true를 반환합니다). 그리고 스캐너 플래그는 fraud_score를 움직이지 않으므로 직접 읽습니다. 162.142.125.10의 Censys 스캐너는 0점입니다.
def check_ip_at_entry(ip: str) -> dict:
data = geoiphub_lookup(ip)
threat, scoring = data["threat"], data["scoring"]
# Verified search and AI crawlers can sit on blocklisted ranges: let them through
if threat["crawler"]["verified"]:
return {"action": "allow", "reason": "verified_crawler"}
# Scanner and botnet flags don't move fraud_score, so read them directly
if threat["is_scanner"] or threat["is_botnet"]:
return {"action": "block", "reason": "scanner_or_botnet"}
# Tor exit at an entry point that handles accounts or money
if data["detection"]["is_tor"]:
return {"action": "block", "reason": "tor_exit"}
return {"action": scoring["recommended_action"], "fraud_score": scoring["fraud_score"]}
흐름별로 보정하십시오. 비밀번호 재설정 양식은 step_up에 조치할 수 있고, 공개 콘텐츠 엔드포인트는 block에만 조치할 수 있습니다. scoring.confidence 필드(0.0에서 1.0)는 점수 뒤에 얼마나 많은 증거가 있는지 알려 주므로, 강제 차단은 증거가 강한 판정에 남겨 두십시오.
2. VPN, 프록시, Tor 트래픽을 흐름별로 처리하기
익명화 도구는 흐름마다 다르게 취급할 가치가 있습니다. 상용 VPN은 수백만 명의 일반 사용자를 실어 나르지만, 결제 단계의 열린 프록시나 Tor 출구는 거의 그렇지 않기 때문입니다. 모든 VPN을 차단하는 것은 대부분의 제품에 너무 광범위합니다.
SENSITIVE_FLOWS = {"login", "signup", "checkout"}
def anonymization_response(ip: str, flow: str) -> str:
det = geoiphub_lookup(ip)["detection"]
sensitive = flow in SENSITIVE_FLOWS
if det["is_tor"] or det["is_proxy"]:
return "block" if sensitive else "challenge"
# Commercial VPNs carry millions of ordinary users: add friction only where money moves
if det["is_vpn"]:
return "challenge" if flow == "checkout" else "allow_and_log"
# iCloud Private Relay is a Safari setting, not an attack tool
return "allow"
각 플래그 뒤의 증거는 다음과 같습니다.
detection.is_vpn: 공급자 자체 서버 목록과 공개 타사 목록(그 목록이 담은 WireGuard 태그 포함)에 대한 일치, 그리고 우리 프로브의 실제 OpenVPN 및 IPsec 핸드셰이크.detection.is_proxy: SOCKS4, SOCKS5, HTTP CONNECT, HTTP forward 프록시에 대한 핸드셰이크 프로브.detection.is_tor: Tor Project의 공식 출구 목록, 매일 갱신.detection.is_relay: iCloud Private Relay와 Cloudflare 프라이버시 출구로, 우리는 의도적으로 통과시킵니다.
주거용 프록시는 이 목록에 없습니다. API는 이를 탐지하지 않으므로 is_residential_proxy에 규칙을 만들지 마십시오.
3. VPN 탐지와 함께일 때만 지역 제한 적용하기
지역 제한은 국가 검사와 익명화 검사가 함께 실행될 때만 작동합니다. 제재 대상 국가를 차단하면서 is_vpn: true 요청을 허용하면, 그곳 사용자는 독일의 VPN 서버를 통해 접속하여 차단이 실패합니다.
BLOCKED_COUNTRIES = {"KP", "IR", "CU"} # example only: your compliance team owns this list
RESTRICTED_FLOWS = {"checkout", "download", "api_access"}
def check_geo_compliance(ip: str, flow: str) -> dict:
if flow not in RESTRICTED_FLOWS:
return {"action": "allow"}
data = geoiphub_lookup(ip)
det = data["detection"]
# Behind an anonymizer the apparent country is the server's, not the user's
if det["is_anonymous"]:
return {"action": "block", "reason": "country_unverifiable"}
# Relay geolocation is approximate: confirm the country from Apple's egress list
if det["is_relay"]:
return {"action": "verify_country", "reason": "private_relay"}
if data["geo"]["country_code"] in BLOCKED_COUNTRIES:
return {"action": "block", "reason": "geo_compliance"}
return {"action": "allow"}
릴레이 분기가 있는 것은 우리 데이터에서 발견한 결함 때문입니다. Apple은 Private Relay 출구를 사용자의 국가 안에 두지만, 릴레이 주소 104.28.46.99에 대해 우리 데이터베이스는 앙골라라고 하고 Apple 자체 출구 목록은 잠비아라고 합니다. 릴레이는 is_anonymous: false를 보고하므로, 그 분기가 없으면 국가 검사가 잘못된 답을 신뢰하게 됩니다.
4. 로그인에서 불가능한 이동 플래그하기
불가능한 이동은 계정 탈취의 가장 신뢰할 수 있는 신호 중 하나입니다. 런던에서 로그인하고 30분 뒤 캘리포니아에서 로그인하는 사람은 없습니다. 각 로그인의 좌표를 저장하고, 직전 로그인과의 거리를 계산하여, 시속 약 900km보다 빠른 제트기가 필요한 쌍을 플래그하십시오.
import math
from datetime import datetime, timezone
MIN_DISTANCE_KM = 500 # below this, city-level geolocation error can fake a "jump"
MAX_SPEED_KMH = 900 # roughly a commercial jet
def haversine_km(lat1, lon1, lat2, lon2) -> float:
r = 6371
dlat = math.radians(lat2 - lat1)
dlon = math.radians(lon2 - lon1)
a = (math.sin(dlat / 2) ** 2
+ math.cos(math.radians(lat1)) * math.cos(math.radians(lat2)) * math.sin(dlon / 2) ** 2)
return r * 2 * math.asin(math.sqrt(a))
def check_impossible_travel(previous, current_ip: str) -> dict:
# previous: your last stored login for this user, e.g.
# {"latitude": 51.5, "longitude": -0.12, "at": datetime(..., tzinfo=timezone.utc)}
data = geoiphub_lookup(current_ip)
det, geo = data["detection"], data["geo"]
# A VPN, Tor or relay location is not where the person is: don't compare it or store it
if det["is_anonymous"] or det["is_relay"]:
return {"action": "skip", "reason": "location_not_reliable"}
if previous is None:
return {"action": "allow"}
distance_km = haversine_km(previous["latitude"], previous["longitude"],
geo["latitude"], geo["longitude"])
hours = (datetime.now(timezone.utc) - previous["at"]).total_seconds() / 3600
if distance_km > MIN_DISTANCE_KM and hours < distance_km / MAX_SPEED_KMH:
return {"action": "step_up", "reason": "impossible_travel",
"distance_km": round(distance_km), "hours_elapsed": round(hours, 1)}
return {"action": "allow"}
30분 전의 런던 로그인이 저장된 상태에서 프리몬트의 Linode 호스트는 8,617km로 step_up이 반환되었습니다. 보정 시 유의할 점이 두 가지 있습니다. VPN 사용자는 서버를 바꿀 때마다 불가능한 이동에 걸리므로, 익명화된 로그인은 저장하지 않고 건너뜁니다. 그리고 모바일 통신사는 도시 데이터가 거친 공유 주소를 통해 많은 사용자를 라우팅하므로, 500km 하한이 위치 오차가 비행처럼 보이는 것을 막아 줍니다.
5. 네트워크 유형별로 제한하기
속도 제한은 IP 뒤의 네트워크를 따를 때 더 잘 작동합니다. 모바일 주소 하나는 통신사 NAT 뒤의 수백 명을 실어 나를 수 있으므로 강하게 제한하면 고객이 차단됩니다. 클라우드 주소는 보통 스크립트 하나이지만 실제 구매자를 대신하는 AI 에이전트일 때도 있으므로, 금지하지 말고 챌린지하십시오.
RATE_LIMITS = {
"isp": {"per_minute": 60, "on_exceed": "delay"},
"mobile": {"per_minute": 120, "on_exceed": "delay"}, # carrier NAT puts many people on one IP
"hosting": {"per_minute": 10, "on_exceed": "challenge"}, # usually one script, sometimes a real AI agent
"vpn": {"per_minute": 20, "on_exceed": "challenge"},
}
DEFAULT_LIMIT = {"per_minute": 30, "on_exceed": "delay"} # "unknown" and any new type
def rate_limit_for(ip: str) -> dict:
data = geoiphub_lookup(ip)
if data["threat"]["crawler"]["verified"]:
return {"per_minute": 120, "on_exceed": "delay"}
if data["scoring"]["recommended_action"] == "block":
return {"per_minute": 3, "on_exceed": "block"}
return RATE_LIMITS.get(data["asn"]["asn_type"], DEFAULT_LIMIT)
숫자는 측정된 최적값이 아니라 자사 트래픽에 맞춰 조정할 시작값입니다. 기본값을 유지하십시오. Censys 스캐너는 asn_type: "unknown"으로 돌아왔는데, 고정된 표에는 이런 값이 없습니다. 가정과 모바일 IP를 임대하는 스크레이퍼는 어떤 네트워크 유형 규칙도 빠져나가며, 이들을 잡는 로그 수준의 검사는 사이트가 스크래핑당하는지 확인하는 방법 가이드에서 다룹니다.
6. 결제에서 IP 국가와 청구 국가 비교하기
영국 청구 주소가 있는 카드가 다른 나라의 IP에서 사용되는 것은 IP의 국가를 신뢰할 수 있는 한 결제 사기의 강한 신호 패턴입니다. 익명화 도구가 이를 가리고 있다면 대신 3-D Secure(3DS) 인증을 요구하십시오.
def assess_checkout_geo_risk(ip: str, billing_country: str) -> dict:
data = geoiphub_lookup(ip)
det = data["detection"]
if det["is_vpn"] or det["is_proxy"] or det["is_tor"]:
return {"risk": "high", "reason": "anonymizer_hides_country", "action": "require_3ds"}
# Private Relay keeps the user's country but our relay geolocation can miss it: skip the compare
if det["is_relay"]:
return {"risk": "standard", "reason": "private_relay", "action": "allow"}
ip_country = data["geo"]["country_code"]
if ip_country != billing_country:
return {"risk": "elevated", "reason": f"ip_{ip_country}_billing_{billing_country}",
"action": "require_3ds"}
return {"risk": "standard", "action": "allow"}
손으로 쓴 "위험 국가" 목록을 유지하지 마십시오. 공격자는 일부러 저위험 국가의 깨끗해 보이는 IP를 거쳐 가므로, 인프라가 와 보이는 지역이 아니라 인프라(익명화 상태, 악용 플래그, ASN 유형)를 겨냥하십시오. 결제 흐름은 지불 거절 감소 가이드에서 더 깊이 다룹니다.
7. 봇 세션을 분석에서 제외하기
자동화된 세션이 분석에 기록되기 전에 걸러 내면 전환 데이터와 그것으로 학습된 입찰 모델이 실제 사람에 대한 것으로 유지됩니다. 검증된 크롤러는 여전히 응답을 받지만 집계되지 않을 뿐입니다.
def should_record_session(ip: str) -> bool:
data = geoiphub_lookup(ip)
det, threat, scoring = data["detection"], data["threat"], data["scoring"]
if threat["crawler"]["verified"]:
return False # serve the crawler, but keep it out of analytics
if det["is_tor"] or det["is_proxy"]:
return False
if scoring["recommended_action"] == "block":
return False
if det["is_hosting"] and scoring["fraud_score"] > 50:
return False
return True
유료 트래픽에는 자체 플레이북이 있으며, 그것은 IP 제외 목록을 포기하는 것에서 시작합니다. IP 주소로 클릭 사기를 탐지하는 방법을 참고하십시오.
실제 주소 여섯 개에 대해 일곱 가지 검사가 반환한 결과
위의 모든 함수를 게시된 그대로 2026년 10월 15일에 공개 주소 여섯 개에 대해 실행했습니다. 결제 열은 각 IP를 미국 청구 주소와 비교합니다.
| IP (정체) | 에지 검사 | 로그인 익명화 | 속도 제한 | 결제 대 미국 카드 | 분석에 집계 |
|---|---|---|---|---|---|
| 185.220.101.47 (Tor 출구) | block: tor_exit | block | 3/min, block | high: require_3ds | 아니요 |
| 102.129.235.17 (상용 VPN) | block: score 92 | allow_and_log | 3/min, block | high: require_3ds | 아니요 |
| 45.33.32.156 (Nmap 테스트 호스트, Linode) | allow: score 10 | allow | 10/min, challenge | standard: allow | 예 |
| 162.142.125.10 (Censys 스캐너) | block: scanner_or_botnet | allow | 30/min, delay | standard: allow | 예 |
| 5.39.1.230 (AhrefsBot, 검증됨) | allow: verified_crawler | allow | 120/min, delay | elevated: FR vs US | 아니요 |
| 104.28.46.99 (iCloud Private Relay) | allow: score 9 | allow | 30/min, delay | standard: private_relay | 예 |
두 행이 검사들을 함께 실행해야 하는 이유를 보여 줍니다. Censys 스캐너는 스캐너 플래그가 유일한 신호이기 때문에 에지 검사를 제외한 모든 검사를 통과합니다. 그리고 에지 검사가 점수만으로 차단하는 VPN은 로그인에서는 기록만 됩니다. 이것이 원하는 흐름별 동작입니다. 점수로 강제 차단하는 곳에서는 차단하고, VPN이 정상인 곳에서는 기록합니다.
어떤 IP 신호가 어떤 공격을 막는가
각 신호는 서로 다른 공격과 서로 다른 조치에 대응합니다. 이를 시작 설정으로 삼고 흐름별로 조정하십시오.
| 신호 | 잡아내는 것 | 권장 조치 |
|---|---|---|
| detection.is_tor: true | 크리덴셜 스터핑, 카딩, 사기에서의 Tor 익명화 | 민감한 흐름에서 차단 |
| detection.is_proxy: true | 열린 SOCKS 또는 HTTP 프록시, 대개 악용 도구 | 로그인, 결제, 가입에서 차단 |
| detection.is_vpn: true | 상용 VPN, 정당한 사용과 악용이 섞여 있음 | 결제에서는 챌린지, 그 외에는 허용하고 기록 |
| detection.is_relay: true | iCloud Private Relay 또는 Cloudflare 프라이버시 출구 | 허용, 도시는 신뢰하지 말 것 |
| 소비자 흐름에서 detection.is_hosting: true | 스크립트, 또는 실제 사람을 대신해 구매하는 AI 에이전트 | 챌린지, 높은 점수일 때만 차단 |
| threat.is_scanner 또는 is_botnet: true | 스캐닝 및 봇넷 인프라(점수를 움직이지 않음) | 에지에서 차단 |
| threat.crawler.verified: true | 운영자가 공개한 대역의 실제 검색 또는 AI 크롤러 | 허용, 분석에서 제외 |
| 500km 초과 거리를 시속 900km보다 빠르게 | 탈취한 자격 증명을 이용한 계정 탈취 | 추가 인증 후 계정 플래그 |
| geo.country_code가 청구 국가와 다르고 익명화 도구 없음 | 카드 테스트, 또는 휴가 중인 고객 | 3DS 요구 |
| scoring.fraud_score 75 초과(block) | 여러 신호가 동시에 뒷받침 | 차단 또는 수동 검토를 위해 보류 |
IP 데이터가 잡지 못하는 것
IP 데이터는 1차 필터이며, 세 가지 유형의 공격은 그냥 통과합니다. 소유자 확인부터 판정까지 사건별 절차는 의심스러운 IP 주소를 조사하는 방법을 참고하십시오.
평판이 깨끗한 주거용 프록시. 어제 프록시 풀에 추가된 IP는 악용 이력이 없고 블록리스트 검사를 통과하며, GeoIPHub는 주거용 프록시를 탐지하지 않습니다. 이를 잡으려면 기기 핑거프린트 이상, 세션 타이밍, 상호작용 빈도가 필요합니다.
깨끗한 연결의 탈취된 계정. 피해자와 같은 나라의 가정 회선에서 유효한 자격 증명을 쓰는 공격자는 IP 데이터에 플래그할 흔적을 남기지 않습니다. 행동 신호(타이핑 리듬, 탐색 경로, 구매 이력과의 괴리)가 필요합니다.
표적 공격. 여러분의 방어를 조사한 공격자는 피해자의 도시에서 깨끗한 주거용 IP를 골라 모든 IP 수준 검사를 통과할 것입니다. 이 경우의 방어는 이메일 인증과 기기 바인딩입니다.
올바른 모델은 이렇습니다. 조회가 요청당 거의 0에 가까운 비용으로 자동화되고 정교하지 않은 공격의 물량을 걸러 내면, 비용이 큰 검사(기기 핑거프린팅, 행동 분석, 수동 검토)가 남은 것에 집중할 수 있습니다.
프로덕션에서 이 검사를 운영하기
세 가지 습관이 출시 후에도 IP 기반 방어의 정확도를 유지합니다.
IP별로 짧게 캐시하십시오. 네트워크 사실은 세션 내에서는 천천히 바뀌지만 바뀌기는 합니다. 우리의 VPN 및 프록시 프로브는 최대 12시간마다 실행되고 위협 피드는 6시간마다 갱신됩니다. 각 조회를 세션 동안 캐시하되, 보안 판단용은 한 시간 안에, 일반 지리 필드는 하루 안에 만료시키십시오. 세션당 IP별 조회 한 번이 현실적인 비용 모델입니다.
판정만이 아니라 전체 응답을 기록하십시오. 차단이 발동하면 어떤 신호가 촉발했는지 알고 싶을 것입니다. 모든 결정과 함께 scoring.detection_methods와 원시 scoring.fraud_score를 저장하십시오. 위 Tor 샘플의 오래된 PTR method 같은 오탐을 찾고 임계값을 조정하는 방법이 이것입니다.
사이트별이 아니라 흐름별로 임계값을 조정하십시오. 비밀번호 재설정은 블로그 읽기보다 낮은 차단 임계값을 가질 만합니다. 보안 팀이 배포 없이 조정할 수 있도록 임계값을 설정에 두십시오.
FLOW_THRESHOLDS = {
"checkout": {"block_above": 75, "challenge_above": 50},
"login": {"block_above": 80, "challenge_above": 55},
"signup": {"block_above": 85, "challenge_above": 60},
"api_read": {"block_above": 90, "challenge_above": 75},
}
각 위협에 대해 GeoIPHub 조회 한 번이 반환하는 것
GeoIPHub는 이 계층 전체를 API 호출 한 번으로 묶어 제공합니다. 조회 한 번이 10개 응답 그룹에 걸친 100개 이상의 데이터 필드(지리적 위치, ASN과 네트워크, 연결 유형, 이동통신사, 역방향 DNS, 익명화 플래그, 산출된 위험 점수)를 반환하므로, 질문 하나에 답하려고 공급자 다섯 곳을 이어 붙일 필요가 없습니다. 각 위협에 대해 작동하는 요소는 다음과 같습니다.
- 36개의 가중 이유로 구성된 0-100 위험 점수. 예 또는 아니요 플래그 대신 GeoIPHub는 내장된 판단 구간 allow(25 이하), review(50 이하), step-up(75 이하), block(75 초과)을 갖춘 설명 가능한 점수를 반환하므로, 같은 조회를 로그인보다 결제에서 더 엄격하게 조정할 수 있습니다.
- 능동적 프로빙에 의한 VPN 및 프록시 탐지. 정적 목록을 넘어 GeoIPHub는 25개 이상의 포트와 8개 프로토콜에 걸쳐 실제 핸드셰이크 프로브를 실행하고, VPN 공급자 자체 서버 목록과 공개 타사 목록을 교차 참조하므로, 답이 지난달의 블록리스트가 아니라 실시간 인프라를 반영합니다.
- 데이터센터 및 호스팅 탐지. 엄선된 호스팅 ASN 853개와 클라우드 공급자 10곳의 공식 대역을 포괄하며, 브라우저로 위장한 카딩 봇, 스크레이퍼, 스터핑 인프라를 드러내는 신호입니다.
- 매일 갱신되는 Tor 출구 데이터와 19개의 공식 크롤러 및 AI 봇 대역 피드(Googlebot, GPTBot, ClaudeBot, PerplexityBot 등)로, 익명화된 출구와 스스로 신원을 밝히는 봇이 최신 기준 정보로 점수화됩니다.
- 이 모든 것 뒤에 30개 이상의 데이터 소스와 5개 RIR WHOIS 피드가 있으며, 1밀리초 미만의 캐시된 조회와 2.5초 이내에 실시간으로 분류되는 미확인 IP를 제공하므로 로그인, 가입, 결제에 인라인으로 두기에 충분히 빠릅니다.
또한 설계상 개인정보를 존중합니다. 분류하려는 IP만 보내고 네트워크 및 위험 속성을 돌려받습니다. 요청을 점수화하는 데 이름, 이메일, 결제 데이터가 필요하지 않습니다.
무료 IP 조회 도구로 신호를 직접 시험하거나, 어떤 IP의 위험 점수든 확인하거나, 본인의 연결에서 VPN 탐지를 테스트해 볼 수 있습니다. 앱에 연결할 준비가 되었다면 10분 연동 가이드가 cURL, Node, Python으로 모든 요청을 점수화하는 방법을 안내하며, 무료 플랜은 모든 필드, 하루 1,500회 조회를 필드 제한 없이 제공합니다.
공격자의 비용을 높이고 고객의 마찰은 높이지 마십시오
사이버 범죄는 산업화되고, 자동화되고, 점점 더 사람이 아니게 되었으며, 그 모든 것이 여러분이 먼저 살펴볼 수 있는 IP 주소를 통해 이동합니다. IP 데이터가 사기를 혼자서 막지는 못하며, 정직한 설명이라면 그렇게 말합니다. 그러나 계층 방어의 출처 확인 계층, 즉 어떤 세션을 더 자세히 봐야 하는지 알려 주는 신호로서 이것은 배포할 수 있는 가장 유용하고 마찰이 적은 통제 중 하나입니다. 잘 사용하면 정당한 다수에게 부담을 주지 않으면서 범죄를 저지르는 소수의 공격 비용을 높입니다.
FAQ
IP 인텔리전스란 무엇인가요?
IP 인텔리전스는 원시 IP 주소를 그 출처와 신뢰성에 대해 드러나는 모든 정보로 보강하는 활동입니다. 지리적 위치, 소유 네트워크(ASN), 연결 유형, 데이터센터·VPN·프록시·Tor 출구 여부, 악용 이력, 산출된 위험 점수가 포함됩니다. 온라인 요청의 가장 보편적인 속성 하나를 비밀번호가 입력되거나 카드가 결제되기 전에 조치할 수 있는 의사결정 신호로 바꿔 줍니다. "이 IP가 어디인가"에만 답하는 IP 지리적 위치보다 범위가 넓으며, 보강된 정보는 "신뢰할 수 있는가"에도 답합니다.
IP 데이터는 사이버 공격 예방에 어떻게 도움이 되나요?
거의 모든 공격(크리덴셜 스터핑, 카드 테스트, 스크래핑, 가짜 계정 생성, 부정 결제)은 IP 주소를 통해 들어오며, 공격자는 인프라를 대규모로 재사용합니다. 조회는 그 인프라가 남기는 단서를 드러냅니다. 호스팅 ASN에서의 로그인, 프로브로 확인된 VPN 서버에서의 결제, 실제로는 클라우드 스크립트인 "브라우저"가 그렇습니다. 로그인, 가입, 결제에서 실시간 위험 신호로 사용하면 정상적인 다수에게 마찰을 더하지 않고도 의심스러운 소수에게 추가 인증을 요구하거나 차단할 수 있습니다.
IP 지리적 위치만으로 사이버 공격을 막을 수 있나요?
아니요. 그렇다고 주장하는 공급자는 과장하는 것입니다. IP 데이터는 심층 방어 모델의 한 계층입니다. 공유 모바일 IP에는 사기꾼과 실제 고객이 함께 있을 수 있고, 깨끗한 주거용 IP가 프록시를 호스팅할 수 있으며, 피해자와 같은 도시의 가정 회선에서 탈취한 자격 증명을 쓰는 공격자는 모든 IP 검사를 통과합니다. IP 신호는 기기, 행동, 속도, 신원 신호와 결합할 때 가장 강력합니다. 위험 점수는 어떤 세션을 더 면밀히 살펴야 하는지 판단하는 데 쓰고, 일괄 차단에 쓰지 마십시오.
IP 신호는 어떤 유형의 사이버 범죄를 탐지할 수 있나요?
IP 신호는 계정 탈취와 크리덴셜 스터핑, 신규 계정 및 합성 신원 사기, 결제 및 카드 테스트 사기, 자동화된 봇과 스크레이퍼 트래픽, IP가 뒷받침하지 못하는 이름을 주장하는 크롤러, VPN과 프록시를 통한 정책 또는 제재 회피를 탐지하는 데 기여합니다. 각 경우에서 IP 신호는 출처 계층입니다. 연결이 실제 사람과 일치하는 인프라에서 오는지, 아니면 자동화되었거나 익명화된 활동에서 오는지 알려 줍니다. 주거용 프록시는 잡지 못하며, 그것은 기기 및 행동 신호가 필요합니다.
불가능한 이동 탐지란 무엇이며 어떻게 작동하나요?
불가능한 이동 탐지는 같은 계정에 대한 두 번의 로그인이 그 사이의 시간 안에 이동할 수 없을 만큼 멀리 떨어진 곳에서 이루어졌을 때 이를 플래그합니다. 런던과 싱가포르는 약 10,850km 떨어져 있으므로 런던 로그인 30분 뒤의 싱가포르 로그인은 둘 중 하나가 계정 소유자가 아니라는 뜻입니다. 각 로그인의 위도와 경도를 저장하고, 직전 로그인과의 거리를 계산하여, 시속 약 900km(대략 상업용 제트기 속도)를 넘어야 하는 쌍을 플래그합니다. VPN, Tor, 릴레이 주소의 로그인은 그 위치가 사용자의 위치가 아니므로 건너뛰십시오.
특정 국가의 모든 트래픽을 차단해야 하나요?
국가 단위 차단은 부수적 피해가 큰 무딘 도구입니다. 한 국가 전체를 차단하기 전에 그곳에 정당한 사용자가 있는지 확인하십시오. 한 번 설정한 차단은 그들에게도 적용되기 때문입니다. 더 표적화된 대안은 이렇습니다. 결제와 비밀번호 재설정 같은 민감한 흐름에는 추가 인증을 요구하고, 강제 지역 제한은 법률이나 계약이 요구하는 곳에서만 사용하며, 국가를 네트워크 신호(호스팅 ASN, VPN 탐지)와 결합하여 인구 집단이 아니라 악용되는 인프라를 겨냥하십시오.
IP 인텔리전스는 IP 지리적 위치와 같은 것인가요?
아니요. IP 지리적 위치는 그 일부입니다. 지리적 위치는 IP를 국가, 지역, 대략적인 도시에 대응시키며 국가 수준에서는 약 99% 정확하지만 도시 수준에서는 훨씬 약합니다. 전체 조회에는 지리적 위치가 포함되며 네트워크 소유권(ASN), 연결 유형, VPN, 프록시, Tor, 데이터센터 플래그, 악용 신호, 종합 위험 점수가 더해집니다. 지리적 위치는 어디인지를 알려 주고, 나머지는 신뢰해도 되는지를 알려 줍니다.
IP 기반 위험 점수 산정은 사용자 개인정보 보호나 GDPR을 위반하나요?
이름, 이메일, 결제 정보가 아니라 IP 주소와 네트워크 메타데이터를 대상으로 합니다. GeoIPHub에서는 분류하려는 IP만 보내고 네트워크 및 위험 속성을 돌려받습니다. 요청을 점수화하는 데 개인 데이터 교환은 필요하지 않습니다. GDPR에서 IP 주소는 개인 데이터일 수 있으므로 올바른 관행은 여전히 적용됩니다. 사기 방지와 보안이라는 정당한 목적으로 사용하고, 보관을 최소화하고, 문서화하십시오. IP의 위험 점수 산정은 보안 통제이지 사용자 추적이 아닙니다.
GeoIPHub API를 만드는 팀
GeoIPHub IP 인텔리전스 API와 스캐너를 만드는 GeoIPHub 팀이 작성했습니다. 초안은 AI의 도움을 받아 준비하고 팀이 편집합니다. API 예시는 예시용으로 표시된 경우를 제외하고 라이브 API에 대한 실제 조회 결과입니다.


