프록시 제공업체들은 풀 크기를 광고한다. 수백만 개의 IP, 수억 개의 IP. 풀 크기는 중요하지만, 신뢰성 측면에서 그 못지않게 중요한 두 번째 질문을 가린다. 그 주소들이 얼마나 다양한 네트워크에서 나오는가 하는 점이다. 소수의 네트워크에 몰려 있는 천만 개의 IP 풀은 수천 개의 네트워크에 분산된 풀과 매우 다르게 작동한다.
ASN 다양성이란 프록시 풀의 주소들이 서로 다른 네트워크에 얼마나 넓게 분산되어 있는지를 뜻한다. 모든 IP 주소는 한 조직이 운영하는 네트워크에 속하며, 이는 자율 시스템 번호(ASN)로 식별된다. 다양성이 높은 풀은 많은 네트워크에서 출구를 끌어오며 어느 하나도 지나치게 큰 비중을 차지하지 않는다. 반면 집중된 풀은 대부분 소수의 네트워크에 머문다.
레지덴셜 프록시의 경우 ASN은 보통 소비자용 인터넷 제공업체다. 이 글에서는 풀이 ASN에 걸쳐 분산되어 있는 것이 왜 중요한지, 무료 Python 스크립트를 이용해 출구 표본으로부터 이를 측정하는 방법, 그리고 자체 벤치마크의 실제 수치를 사용해 그 숫자를 해석하는 방법을 설명한다.
ASN 다양성이 프록시 신뢰성에 중요한 이유
웹사이트와 안티봇 시스템은 IP 주소 하나만 보고 판단하는 경우가 드물다. 이들은 맥락 속에서 판단하며, 네트워크는 그 맥락 중 가장 강력한 요소 중 하나다.
- 차단이 네트워크 단위로 퍼진다. 한 네트워크에서 많은 주소로부터 악용 사례가 발견되면, 사이트는 해당 네트워크 전체에 속도 제한을 걸거나 챌린지를 띄울 수 있다. 소수의 ASN에 집중된 풀은 여기에 취약하다. 네트워크 단위의 결정 하나가 트래픽의 상당 부분에 영향을 미친다.
- 평판은 공유된다. 같은 네트워크에 속한 주소들은 해당 네트워크의 평판 일부를 물려받는다. 다양성이 높은 풀은 한 네트워크의 평판이 떨어져도 영향을 덜 받는다.
- 호스팅 네트워크는 정체를 드러낸다. 호스팅이나 데이터센터 네트워크에 속한 주소가 상당 비중을 차지하는 “레지덴셜” 풀은 완전한 레지덴셜이 아니며, 사이트는 그에 맞게 해당 주소들을 취급한다.
- 지역적 현실성에는 지역 네트워크가 필요하다. 특정 국가나 도시에서 보이는 것처럼 데이터를 수집한다면, 출구는 실제로 그곳 사람들이 사용하는 제공업체들에 분산되어 있어야 한다.
이것이 특정 작업에 있어 특정 네트워크를 타겟팅하는 것이 유용한 이유이기도 하다. 레지덴셜 프록시를 위한 ASN 타겟팅 가이드는 요청을 하나의 제공업체에 고정해야 할 때를 다루는데, 이는 반대의 경우, 즉 특정 테스트를 위한 의도적인 집중이다.
다양한 레지덴셜 풀은 어떤 모습이어야 하는가
실제 인터넷 시장은 집중되어 있다. 대부분의 국가에서 소수의 대형 제공업체가 대부분의 가구에 서비스를 제공하며, 그 뒤로 더 작은 지역 및 모바일 네트워크들이 긴 꼬리를 이룬다. 건강한 레지덴셜 풀은 이 형태를 반영한다. 소수의 대형 소비자 ISP가 출구의 상당 부분을 차지하고, 그 뒤로 더 작은 네트워크들이 많이 존재하는 형태다.
따라서 목표는 네트워크 간 비중이 완전히 균등한 것이 아니다. 중요한 것은 두 가지다.
- 단일 네트워크가 지배하지 않을 것: 해당 국가의 인터넷 시장 구조로 설명되는 수준을 넘어서지 않아야 한다.
- 긴 꼬리가 존재할 것: 서로 다른 네트워크가 많아서, 그중 하나에 걸리는 차단이 트래픽의 작은 일부에만 영향을 미쳐야 한다.
프록시 풀의 ASN 다양성을 측정하는 방법
제공업체의 전체 풀을 볼 수는 없지만, 표본을 추출할 수는 있다. 로테이팅 게이트웨이를 통해 요청을 보내고, 각 요청이 어떤 IP와 네트워크로 나가는지 기록한 다음, 표본에 대해 집중도 지표를 계산한다.
네 가지 지표가 중요한 부분의 대부분을 다룬다.
| 지표 | 측정 대상 | 해석 방법 |
|---|---|---|
| 고유 ASN 수 | 표본에 나타나는 네트워크 수 | 높을수록 좋음; 표본 크기에 따라 증가 |
| 상위 1개 및 상위 5개 비중 | 가장 큰 1개 및 5개 네트워크가 차지하는 출구 비중 | 낮을수록 한 네트워크의 결정에 대한 노출이 적음 |
| 허핀달-허쉬만 지수(HHI) | 비중의 제곱합, 0에 가까우면(분산됨) 1이면(단일 네트워크) | 시장 집중도의 표준 측정치 |
| 유효 ASN 수 | 1 / HHI: 표본이 몇 개의 동일 크기 네트워크처럼 동작하는지 | 가장 직관적인 단일 수치 |
집중도와는 무관한 점검 하나를 더 추가하자. 비(非)레지덴셜 네트워크에 속한 출구의 비중이다. 레지덴셜 풀이라면 이는 0에 가까워야 한다.
아래 모듈을 asn_diversity.py로 저장한다. 이는 무료 IP 지오로케이션 API인 ip-info.com을 통해 프록시로 출구를 샘플링하는데, 이 API는 각 주소의 ASN, 네트워크 이름, 그리고 레지덴셜 네트워크인지 호스팅 네트워크인지를 반환하며, 지표들을 계산한다.
# asn_diversity.py
from collections import Counter
import requests
def sample_exit(proxy_url, get=requests.get):
"""One exit through a rotating proxy: its IP, network (ASN) and network type."""
info = get("http://ip-info.com/json", proxies={"http": proxy_url, "https": proxy_url}, timeout=20).json()
return {"ip": info["ip"], "asn": info["asn"], "as_name": info["as_name"], "user_type": info.get("user_type")}
def diversity(exits):
"""How spread out a sample of exits is across networks."""
exits = list({e["ip"]: e for e in exits}.values()) # count each IP once
counts = Counter(e["asn"] for e in exits)
n = len(exits)
shares = sorted((c / n for c in counts.values()), reverse=True)
hhi = sum(s * s for s in shares) # Herfindahl-Hirschman index, 0 to 1
return {
"unique_ips": n,
"asns": len(counts),
"top1_share": round(shares[0], 3),
"top5_share": round(sum(shares[:5]), 3),
"hhi": round(hhi, 4),
"effective_asns": round(1 / hhi, 1), # as many equal-sized networks as this
"non_residential_share": round(sum(e["user_type"] != "residential" for e in exits) / n, 3),
}
1,000개 출구로 구성된 두 예시 표본은 넓은 풀과 좁은 풀이 얼마나 다르게 읽히는지 보여준다(합성 데이터이며 실제 제공업체 데이터가 아님).
import random
from asn_diversity import diversity
random.seed(7)
# Illustrative samples of 1,000 exits from two pools (synthetic, not real providers)
broad = [{"ip": f"ip{i}", "asn": random.choice(range(60)), "user_type": "residential"} for i in range(1000)]
narrow = [{"ip": f"ip{i}", "asn": random.choice([1, 1, 1, 1, 2, 2, 3, 4]), "user_type": "residential"}
for i in range(1000)]
print("broad ", diversity(broad))
print("narrow", diversity(narrow))
broad {'unique_ips': 1000, 'asns': 60, 'top1_share': 0.028, 'top5_share': 0.125, 'hhi': 0.0176, 'effective_asns': 57.0, 'non_residential_share': 0.0}
narrow {'unique_ips': 1000, 'asns': 4, 'top1_share': 0.506, 'top5_share': 1.0, 'hhi': 0.3466, 'effective_asns': 2.9, 'non_residential_share': 0.0}
넓은 풀은 마치 57개의 동일 크기 네트워크처럼 작동하며, 가장 큰 네트워크도 출구의 3% 미만을 차지한다. 좁은 풀은 3개 미만의 네트워크처럼 작동한다. 전체 출구의 절반이 하나의 네트워크에 몰려 있고, 모든 출구가 네 개 중 하나의 네트워크에 속한다. 좁은 풀에서는 가장 큰 ASN 하나에 대한 네트워크 단위 차단만으로도 요청의 절반이 멈출 수 있다.
게이트웨이를 통해 실제 출구 1,000개 수집하기
실제 풀을 측정하려면 sample_exit을 로테이팅 게이트웨이에 연결하고 병렬로 표본을 수집한다. Shifter의 경우 국가는 사용자명에 포함되며, 세션 ID가 없는 모든 요청은 새로운 출구를 받는다.
from concurrent.futures import ThreadPoolExecutor
from asn_diversity import diversity, sample_exit
PROXY = "http://customer-USERNAME-country-gb:PASSWORD@p.shifter.io:443"
def safe_sample(_):
try:
return sample_exit(PROXY)
except Exception:
return None # skip the odd timeout
with ThreadPoolExecutor(max_workers=20) as pool:
exits = [e for e in pool.map(safe_sample, range(1000)) if e]
print(diversity(exits))
비교하려는 모든 제공업체에 대해 동일한 스크립트를, 동일한 표본 크기와 동일한 시간대에 실행한다.
서브넷(/24) 다양성
ASN만이 중요한 그룹화 단위는 아니다. 사이트는 전체 주소 블록, 가장 흔하게는 /24 서브넷(IPv4 주소의 앞 세 자리 숫자)도 차단한다. 같은 /24에 속한 두 출구는 보통 같은 건물, 같은 거리, 또는 같은 캐리어급 NAT을 공유하므로, 하나에 대한 차단이 다른 하나까지 잡는 경우가 많다. 같은 표본에 두 줄을 추가하면 이를 계산할 수 있다.
subnets = Counter(".".join(e["ip"].split(".")[:3]) for e in exits)
print("distinct /24 subnets:", len(subnets), "largest subnet share:", round(max(subnets.values()) / len(exits), 3))
건강한 레지덴셜 표본은 고유 /24 서브넷 수가 고유 IP 수에 거의 근접한다.
공정한 ASN 표본을 얻는 방법
몇 가지 유의사항이 측정의 정확성을 지켜준다.
- 국가별로 표본을 추출한다. 다양성은 하나의 시장 내에서만 의미가 있다. 국가를 섞으면 ASN 수가 부풀려질 뿐, 각 국가에 대해서는 아무것도 알려주지 않는다.
- 충분한 요청 수를 사용한다. 고유 ASN 수는 표본 크기가 커질수록 계속 증가하므로, 동일한 표본 크기에서 풀을 비교해야 한다. 국가당 천 개의 출구가 적절한 출발점이다. 비중과 HHI는 수보다 더 빨리 안정된다.
- 각 IP를 한 번씩만 센다. 로테이팅 풀은 동일한 주소를 두 번 이상 반환할 수 있다. 위 모듈은 IP 기준으로 중복을 제거한다.
- 표본을 시간에 걸쳐 분산시킨다. 레지덴셜 풀은 기기가 오가면서 하루 동안 변한다. 여러 시간에 걸쳐 표본을 추출하면 한 번에 몰아서 추출하는 것보다 더 정확한 그림을 얻는다.
- 모든 풀에 동일한 조회 소스를 사용한다. 지오로케이션 데이터베이스가 다르면 같은 주소라도 약간 다른 네트워크로 귀속시킬 수 있다.
벤치마크에서 발견한 것
레지덴셜 프록시 벤치마크의 모든 실행에서 고유 ASN 수를 센다. Shifter와 16개의 다른 네트워크 각각에 동일한 서버에서 국가별로 동일한 수의 요청을 보냈다. 이 표본들은 1,000개 출구보다 훨씬 크며(미국에서는 250,000건, 다른 지역에서는 60,000건에서 100,000건), 따라서 수치는 소규모 테스트에서 나타나는 것보다 훨씬 높지만, 제공업체 간 비교는 가능하다.
미국에서는 가장 넓은 다섯 개의 풀이 다음과 같았다.
| 네트워크 | 고유 미국 ASN 수 | 실시간 미국 IP 수 |
|---|---|---|
| Shifter | 1,828 | 212,212 |
| Oxylabs | 1,591 | 140,811 |
| Decodo | 1,578 | 138,914 |
| Webshare | 1,518 | 150,512 |
| FleetProxy | 1,482 | 112,402 |
우리가 테스트하는 다섯 개 국가에서 Shifter를 풀 크기 면에서 가장 강력한 경쟁자인 Webshare와 비교하면 다음과 같다.
| 국가 | Shifter ASN 수 | Webshare ASN 수 |
|---|---|---|
| 미국 | 1,828 | 1,518 |
| 영국 | 166 | 209 |
| 프랑스 | 147 | 96 |
| 캐나다 | 308 | 245 |
| 독일 | 272 | 188 |
영국은 Webshare가 더 넓게 분산되어 있던 유일한 시장이다: 209개 네트워크 대 166개로, 43개 차이다. 같은 실행에서 Shifter는 더 많은 실시간 영국 주소를 반환했다, 60,487개 대 51,564개로, 그리고 우리가 테스트한 풀은 GB당 $0.75부터 시작하는 가격인 반면 Webshare의 공개된 최저가는 GB당 $1.40로, 그 절반을 조금 넘는 가격이다. Shifter의 독일 측정치는 영국과 정반대였다. Webshare보다 실시간 IP 수는 적었지만, 네트워크 수는 272개 대 188개였다.
일상 업무에서 ASN 데이터 활용하기
ASN 분산을 측정할 수 있게 되면, 같은 데이터는 제공업체 선택뿐 아니라 일상 업무에도 도움이 된다.
- 실패를 네트워크별로 읽는다. 차단율이 오를 때 실패한 요청을 출구의 ASN별로 그룹화한다. 실패가 하나나 두 개의 네트워크에 몰려 있다면, 대상 사이트가 해당 네트워크에 대해 조치를 취하고 있다는 뜻이며, 재시도보다 분산시키거나 제외하는 것이 더 효과적이다.
- 대규모 작업 전에 풀을 점검한다. 대상 국가에서 1,000개 출구로 빠르게 표본을 추출하면 그 풀이 계획한 물량에 비해 충분히 넓은지 알 수 있다.
- 필요할 때만 네트워크를 고정한다. 특정 제공업체의 고객이 무엇을 보는지 확인하는 것과 같은 일부 테스트는 의도적인 집중을 필요로 한다. ASN 타겟팅이 바로 그런 역할을 하며, 위에 링크한 가이드가 언제 그것이 가치 있는지 다룬다.
- 모든 결과에 ASN을 함께 기록한다. 데이터셋의 어떤 숫자가 이상해 보일 때, 그것이 어떤 네트워크에서 관측되었는지 아는 것이 종종 설명이 된다.
ISP 프록시와 네트워크 분산
더 오래 유지하는 IP에도 같은 사고방식이 적용된다. 장기 세션을 위해 ISP 프록시를 구매한다면, 여러 제공업체와 도시에 분산시켜 모든 아이덴티티가 하나의 네트워크에 몰리지 않도록 해야 한다. 돈을 낭비하지 않고 ISP 프록시 구매하기 가이드에는 체험용 IP 묶음을 점검하는 스크립트가 포함되어 있으며, 우리의 ISP 프록시는 900개 이상의 ISP와 1,800개 이상의 도시에서 모든 IP에 대해 도시와 ISP(ASN)를 선택할 수 있게 해준다. 제공업체가 주소를 어떻게 소싱하는지도 다양성을 좌우한다. 제공업체가 레지덴셜 IP를 윤리적으로 소싱하는 방법에 대한 설명글이 무엇을 물어봐야 하는지 다룬다.
FAQ
프록시 네트워크에서 ASN 다양성이란 무엇인가?
프록시 풀의 IP 주소가 서로 다른 네트워크(자율 시스템)에 얼마나 넓게 분산되어 있는지를 뜻한다. 다양성이 높은 풀은 어느 하나도 지배적이지 않은 많은 네트워크를 갖고 있다. 집중된 풀은 대부분의 주소가 소수의 네트워크에 몰려 있다.
스크래핑에서 ASN 다양성이 왜 중요한가?
사이트는 종종 단일 주소가 아니라 네트워크 전체에 대해 조치를 취한다. 출구 대부분이 하나의 네트워크를 공유하고 있다면, 네트워크 단위의 차단 하나가 요청의 상당 부분에 영향을 미칠 수 있다.
ASN 다양성은 어떻게 측정하는가?
프록시를 통해 요청 표본을 보내고, 각 출구의 ASN을 기록한 다음, 가장 큰 네트워크들의 비중, 허핀달-허쉬만 지수, 그리고 유효 네트워크 수를 계산한다. 국가별로, 시간에 걸쳐, 그리고 비교하려는 각 풀에 대해 동일한 크기로 표본을 추출한다.
더 큰 프록시 풀이 항상 더 다양한가?
아니다. 큰 풀이라도 여전히 소수의 네트워크에 집중될 수 있다. 풀 크기와 네트워크 다양성은 별개의 측정치다.
좋은 유효 ASN 수는 어느 정도인가?
단일한 목표치는 없다. 해당 국가의 인터넷 시장이 얼마나 집중되어 있는지에 따라 달라지기 때문이다. 같은 국가에서 같은 표본 크기로 제공업체들을 비교하라. 유효 ASN 수가 더 높고 최대 네트워크 비중이 더 낮은 풀이 더 견고한 풀이다.
출구를 몇 개나 표본으로 추출해야 하는가?
국가당 천 개의 고유 출구가 적절한 출발점이다. 비중, HHI, 유효 ASN 수는 빠르게 안정된다. 반면 고유 ASN의 원시 수는 표본 크기가 커질수록 계속 증가하므로, 동일한 크기에서 수집된 수만 비교해야 한다.
서브넷 다양성이란 무엇이며, ASN 다양성과 어떻게 다른가?
서브넷 다양성은 표본이 얼마나 많은 고유 /24 주소 블록을 포함하는지를 센다. ASN 다양성은 네트워크에 관한 것이고, 서브넷 다양성은 한 네트워크 안의 동네에 관한 것이다. 사이트는 두 수준 모두에서 차단하므로, 좋은 풀은 두 측면 모두에서 넓어야 한다.
벤치마크에서 ASN 분산이 가장 넓었던 제공업체는?
미국에서 Shifter는 1,828개의 고유 네트워크에 도달했으며, 이는 우리가 측정한 17개 네트워크 중 가장 높은 수치였고, Oxylabs가 1,591개로 그 뒤를 이었다. Shifter는 프랑스와 캐나다에서도 가장 많은 네트워크에 도달했고 독일에서는 Rayobyte와 공동 1위였다. 영국에서는 Webshare가 209개 대 166개로 더 많은 네트워크에 도달했다.
결론
IP 수는 풀의 크기를 측정하고, ASN 다양성은 풀의 회복력을 측정한다. 국가별로 출구를 표본 추출하고, 각 IP를 한 번씩만 세며, 유효 네트워크 수, 최대 네트워크 비중, 서브넷 분산, 그리고 비레지덴셜 출구의 비중을 살펴보라. 건강한 레지덴셜 풀은 지역 인터넷 시장을 반영한다. 소수의 대형 소비자 ISP와 그 뒤로 이어지는 긴 꼬리가 있으며, 어느 하나의 네트워크도 트래픽의 과도한 비중을 차지하지 않는다.