PerimeterX 및 Akamai 보호 우회: 실용적인 안티탐지 방법
PerimeterX와 Akamai Bot Manager는 대형 전자상거래 플랫폼, 금융 서비스 및 기업 웹사이트에서 사용하는 두 가지 가장 진보된 봇 보호 솔루션입니다. 이 시스템은 브라우저의 수백 가지 매개변수, 사용자 행동 및 네트워크 특성을 분석하여 단순한 IP 주소 변경으로는 우회할 수 없는 다층 보호를 생성합니다.
이 가이드에서는 두 시스템의 아키텍처를 자세히 분석하고, 탐지 방법을 연구하며, 실제 사례와 기술 실험을 기반으로 한 포괄적인 우회 전략을 수립합니다.
PerimeterX 및 Akamai 아키텍처: 탐지 작동 방식
PerimeterX(현재 HUMAN Security)와 Akamai Bot Manager는 요청 처리의 다양한 단계에 통합되는 다층 보호 시스템으로 작동합니다. 이들의 아키텍처를 이해하는 것은 우회 전략 개발에 매우 중요합니다.
PerimeterX 아키텍처
PerimeterX는 세 단계로 작동합니다. 첫 번째 단계에서는 JavaScript 센서가 HTML 페이지에 삽입되어 클라이언트 브라우저에서 실행되며, 실행 환경에 대한 데이터를 수집합니다: WebGL 지문, Canvas 지문, 오디오 컨텍스트, 사용 가능한 글꼴, 플러그인, 화면 해상도 및 기타 많은 매개변수. 이 센서는 난독화되어 있으며 정기적으로 업데이트되어 분석을 어렵게 만듭니다.
두 번째 단계에서는 PerimeterX의 서버 구성 요소가 HTTP 헤더, TLS 지문, IP 평판 및 네트워크 특성을 분석하여 요청이 주요 애플리케이션에 도달하기 전에 이를 수행합니다. 이 시스템은 실시간으로 업데이트되는 알려진 봇 및 의심스러운 IP 주소의 데이터베이스를 사용합니다.
세 번째 단계는 행동 분석입니다. PerimeterX는 마우스 움직임, 스크롤 속도, 클릭 패턴, 행동 간 시간 등을 추적하여 행동 프로파일을 구축합니다. 기계 학습 모델은 이 프로파일을 실제 사용자 및 알려진 봇의 패턴과 비교합니다.
Akamai Bot Manager 아키텍처
Akamai Bot Manager는 CDN 수준에서 통합되어 분석 속도에서 이점을 제공합니다. 이 시스템은 요청을 Akamai의 경계 서버에서 원본 서버로 전송하기 전에 분석하는 자체 기술인 BMP(Bot Manager Premier)를 사용합니다.
Akamai의 주요 차별점은 그들의 CDN으로 보호되는 수백만 개의 사이트에서 수집된 텔레메트리를 사용하는 것입니다. 이를 통해 시스템은 새로운 유형의 봇을 빠르게 식별하고 전 세계적으로 탐지 규칙을 업데이트할 수 있습니다. Akamai는 또한 PerimeterX의 센서와 유사한 Web SDK 기술을 사용하지만 클라이언트의 무결성을 암호화하여 확인하는 데 중점을 둡니다.
중요: 두 시스템 모두 검증 결과에 대한 암호화된 데이터가 포함된 쿠키를 사용합니다. 이 쿠키는 서버 키를 알지 못하면 위조할 수 없으므로 세션 간 쿠키를 단순히 복사하는 것은 작동하지 않습니다.
탐지 방법: 보호 시스템이 분석하는 것
현대의 안티봇 시스템은 요청을 수백 가지 매개변수에 따라 분석하며, 이를 여러 카테고리로 통합합니다. 각 카테고리를 이해하는 것은 자동화 마커를 체계적으로 제거하는 데 도움이 됩니다.
HTTP 헤더 및 TLS 분석
HTTP 헤더 순서는 탐지의 가장 간단한 방법 중 하나입니다. 브라우저는 특정한 순서로 헤더를 전송하며, 이는 버전 및 제조업체에 따라 다릅니다. Python의 requests 또는 Node.js의 axios와 같은 라이브러리는 고유한 순서를 사용하여 자동화를 즉시 드러냅니다.
TLS 지문(JA3 지문)은 TLS 핸드쉐이크의 매개변수에서 생성됩니다: TLS 버전, 지원되는 암호 목록, 확장 및 그 순서. 브라우저와 운영 체제의 조합마다 고유한 지문이 생성됩니다. 예를 들어, Windows 11의 Chrome 120은 macOS의 Chrome 120 또는 같은 시스템의 Firefox와는 다른 지문을 가집니다.
// User-Agent 및 TLS 지문 불일치 예시
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0
TLS Fingerprint: JA3 해시가 Python requests와 일치
// 결과: 즉각적인 차단
JavaScript 실행 환경
헤드리스 브라우저는 JavaScript 환경에서 수십 가지 흔적을 남깁니다. navigator.webdriver 속성, window.chrome 객체의 존재, navigator.plugins의 불일치, WebGL 및 Canvas 렌더링의 이상을 확인합니다.
PerimeterX와 Akamai는 고급 검증 기술을 사용합니다: JavaScript 함수의 실행 시간을 측정하고(헤드리스 브라우저에서는 다르게 나타남), DOM에서 자동화 아티팩트의 존재를 확인하며, 함수 호출 스택을 분석합니다. 시스템은 데이터의 일관성도 확인합니다 — 예를 들어, User-Agent가 모바일 장치를 나타내지만 navigator.maxTouchPoints가 0이면 이는 탐지 트리거가 됩니다.
네트워크 특성 및 IP 평판
보호 시스템은 IP 주소를 여러 매개변수에 따라 확인합니다: 알려진 프록시 제공업체에 속하는지, 블랙리스트에 있는지, 해당 IP의 활동 기록, 요청의 다른 매개변수(브라우저 언어, 시간대)와의 지리적 일관성.
IP 사용 패턴에 특별한 주의를 기울입니다. 하나의 주소에서 다양한 User-Agent 또는 브라우저 지문으로 요청이 오는 경우 이는 자동화의 강력한 신호입니다. 마찬가지로, 하나의 세션 내에서 IP가 너무 자주 변경되는 경우(공격적인 프록시 회전)는 차단을 유발합니다.
| 탐지 매개변수 | PerimeterX | Akamai |
|---|---|---|
| TLS 지문 | 높은 우선순위 | 중요한 우선순위 |
| Canvas 지문 | 중간 우선순위 | 높은 우선순위 |
| 행동 분석 | 중요한 우선순위 | 높은 우선순위 |
| IP 평판 | 높은 우선순위 | 높은 우선순위 |
| HTTP/2 지문 | 중간 우선순위 | 중요한 우선순위 |
브라우저 지문 및 TLS 지문
브라우저 지문은 브라우저의 특성을 기반으로 고유한 식별자를 생성하는 기술입니다. 쿠키 없이도 보호 시스템은 사용자를 추적하고 이상을 식별할 수 있습니다.
Canvas 및 WebGL 지문
Canvas 지문은 텍스트와 그래픽이 포함된 보이지 않는 이미지를 렌더링하여 작동합니다. 그래픽 드라이버, 글꼴 및 안티앨리어싱 설정의 차이로 인해 각 시스템은 약간 다른 이미지를 생성합니다. 이 이미지의 해시가 지문의 일부가 됩니다.
WebGL 지문은 3D 렌더링을 사용하여 더욱 고유한 지문을 생성합니다. 시스템은 GPU에 대한 정보, 지원되는 확장, 최대 텍스처 크기 및 기타 매개변수를 요청합니다. 이러한 데이터의 조합은 장치를 식별하는 데 충분한 엔트로피를 가진 지문을 생성합니다.
// WebGL 지문을 얻는 예시
const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl');
const debugInfo = gl.getExtension('WEBGL_debug_renderer_info');
const vendor = gl.getParameter(debugInfo.UNMASKED_VENDOR_WEBGL);
const renderer = gl.getParameter(debugInfo.UNMASKED_RENDERER_WEBGL);
// 결과는: "Google Inc. (NVIDIA)" + "ANGLE (NVIDIA GeForce RTX 3080)"
// 각 장치에 대한 고유한 조합
오디오 컨텍스트 및 글꼴
Audio Context API는 오디오 처리에 기반하여 고유한 지문을 생성할 수 있습니다. 운영 체제의 오디오 스택의 차이는 오디오 신호 처리에서 미세한 차이를 초래하며, 이를 측정하여 식별에 사용할 수 있습니다.
설치된 글꼴 목록도 각 시스템에 대해 고유합니다. 보호 시스템은 다양한 글꼴로 텍스트 크기를 측정하는 기술을 사용합니다 — 글꼴이 설치되지 않은 경우 브라우저는 대체 글꼴을 사용하여 크기가 변경됩니다. 수백 개의 글꼴을 확인하면 고유한 서명이 생성됩니다.
TLS 및 HTTP/2 지문
JA3 지문은 TLS Client Hello의 매개변수에서 생성됩니다: SSL/TLS 버전, 암호 스위트 목록, 확장 목록, 지원되는 타원 곡선 그룹 목록, 타원 곡선 포인트 형식. 이러한 매개변수는 연결되어 해시되어 고유한 문자열을 생성합니다.
HTTP/2 지문은 SETTINGS 프레임의 매개변수, 스트림의 순서 및 우선 순위를 분석합니다. 각 브라우저는 고유한 HTTP/2 설정을 사용하므로 올바른 TLS 지문이 있더라도 클라이언트를 식별할 수 있습니다.
실용적인 조언: 지문 우회를 위해서는 모든 매개변수의 일관성을 보장해야 합니다. Chrome User-Agent를 Firefox TLS 지문과 함께 사용하면 즉시 드러납니다. curl-impersonate와 같은 도구나 tls-client 라이브러리는 완전히 일관된 지문을 생성하는 데 도움이 됩니다.
행동 분석 및 기계 학습
행동 분석은 현대 안티봇 시스템에서 가장 우회하기 어려운 측면입니다. 완벽한 기술 지문을 가지고 있더라도 비인간적인 행동은 자동화를 드러냅니다.
마우스 움직임 및 상호작용 분석
PerimeterX와 Akamai는 마우스 움직임의 경로, 가속 및 감속, 인간의 손에 특유한 미세 움직임을 추적합니다. 봇은 일반적으로 마우스를 직선으로 이동시키거나 아예 마우스 이벤트를 생성하지 않습니다. 시스템은 반응 시간을 분석하기도 합니다 — 페이지 로드 직후 클릭하는 것은 의심스럽게 보입니다.
스크롤 패턴도 독특합니다. 사람은 페이지를 고르지 않게 스크롤합니다: 처음에는 빠르게, 읽기 위해 느려지고, 때때로 뒤로 스크롤합니다. 봇은 일반적으로 일정한 속도로 스크롤하거나 window.scrollTo()를 사용하여 즉시 스크롤합니다.
시간 패턴 및 행동 속도
행동 간 시간은 중요한 매개변수입니다. 사람은 10개 필드로 구성된 양식을 0.5초 안에 작성할 수 없거나 1분 안에 50개의 링크를 클릭할 수 없습니다. 보호 시스템은 각 행동 유형에 대한 속도 프로파일을 구축하고 이를 사용자 행동과 비교합니다.
지연의 일관성에도 특별한 주의를 기울입니다. 각 클릭 사이에 정확히 2초가 걸린다면 이는 코드에서 sleep(2000)의 명백한 신호입니다. 인간의 지연은 자연스러운 변동성을 가지며 특정 통계적 분포를 따릅니다.
기계 학습 모델
두 시스템 모두 실제 사용자와 알려진 봇의 수백만 세션에서 학습된 ML 모델을 사용합니다. 모델은 행동의 순서, 사이트 탐색 깊이, 탐색 패턴, 요소와의 상호작용 등 수백 가지 특징을 동시에 분석합니다.
PerimeterX는 다양한 유형의 사이트에 대해 서로 다른 가중치를 가진 모델 앙상블을 사용합니다. 전자상거래 사이트를 위한 모델은 구매 패턴에 중점을 두고, 미디어 사이트를 위한 모델은 콘텐츠 읽기 패턴에 중점을 둡니다. 이는 각 사이트의 특성에 맞춰 조정해야 하므로 우회를 더 어렵게 만듭니다.
// 변동성을 가진 인간적인 지연 예시
function humanDelay(baseMs) {
// 균일 분포 대신 로그 정규 분포
const variance = baseMs * 0.3;
const delay = baseMs + (Math.random() - 0.5) * variance;
// 브라우저 이벤트 처리에 특유의 미세 지연 추가
const microDelay = Math.random() * 50;
return Math.max(100, delay + microDelay);
}
// 사용 예: await new Promise(r => setTimeout(r, humanDelay(2000)));
프록시 선택 및 회전 전략
PerimeterX 및 Akamai와 작업할 때 프록시 유형 및 회전 전략의 선택이 매우 중요합니다. 잘못된 프록시 구성이 브라우저 지문을 숨기려는 모든 노력을 무효화할 수 있습니다.
레지던트 vs 모바일 vs 데이터 센터 프록시
데이터 센터 프록시는 가장 낮은 비용을 가지고 있지만 탐지 위험도 가장 높습니다. PerimeterX와 Akamai는 데이터 센터 IP 주소 데이터베이스를 지원하며, 이러한 요청에 대해 자동으로 검증 수준을 높입니다. 데이터 센터 프록시는 낮은 우선 순위 작업이나 매우 높은 품질의 브라우저 지문과 결합하여 사용할 수 있습니다.
레지던트 프록시는 실제 인터넷 제공업체의 IP 주소를 사용하여 탐지 가능성을 크게 줄입니다. 그러나 레지던트 프록시의 품질은 크게 다를 수 있습니다. 스팸이나 기타 의심스러운 활동에 사용되지 않은 깨끗한 IP 풀을 가진 제공업체를 선택하는 것이 중요합니다.
모바일 프록시는 모바일 운영자의 IP 주소를 사용하므로 가장 높은 신뢰 수준을 제공합니다. 이러한 주소는 일반적으로 여러 사용자 간에 공유되므로(캐리어급 NAT) 차단이 어렵습니다. 모바일 프록시는 Akamai에 대해 특히 효과적이며, 모바일 트래픽 차단에 더 주의합니다.
회전 전략
공격적인 회전(각 요청마다 IP 변경)은 일반적인 실수입니다. 이는 의심스러운 패턴을 생성합니다: 한 사용자가 몇 초마다 IP 주소를 물리적으로 변경할 수는 없습니다. 하나의 IP가 전체 사용자 세션(10-30분의 활동)에 사용되는 세션 회전이 더 효과적입니다.
장기 작업의 경우 30-60분의 지속 세션을 권장합니다. 이는 세션 동안 하나의 IP에서 머무는 실제 사용자의 행동을 모방합니다. 이때 하나의 IP를 너무 오랫동안 사용하지 않는 것이 중요합니다 — 몇 시간 동안의 세션도 의심스럽게 보입니다.
지리적 일관성
IP 주소의 지리적 위치와 다른 매개변수(브라우저 언어, 시간대, 로케일 설정) 간의 일관성을 보장하는 것이 매우 중요합니다. IP 주소가 독일에 있지만 navigator.language가 "en-US"를 반환하고, 시간대가 "America/New_York"인 경우 이는 즉각적인 탐지 트리거가 됩니다.
여러 지리적 지역에서 작업할 때는 각 지역에 대해 별도의 브라우저 프로파일을 사용하십시오. 하나의 세션 내에서 지역 간 전환(IP가 프랑스에서 일본으로 변경되는 경우)은 실제 사용자에게는 불가능하며 즉시 드러납니다.
| 프록시 유형 | PerimeterX에 대한 효율성 | Akamai에 대한 효율성 | 권장 사항 |
|---|---|---|---|
| 데이터 센터 | 낮음 (30-40%) | 매우 낮음 (20-30%) | 테스트 용도만 |
| 레지던트 | 높음 (75-85%) | 중간 (65-75%) | 대부분의 작업에 대한 주요 선택 |
| 모바일 | 매우 높음 (85-95%) | 높음 (80-90%) | 중요한 작업 및 고보안 사이트용 |
안티탐지 브라우저 및 도구 설정
자동화 도구의 올바른 설정은 PerimeterX 및 Akamai를 성공적으로 우회하는 데 핵심 요소입니다. 최고의 프록시도 브라우저 지문에 명백한 자동화 마커가 포함되어 있다면 도움이 되지 않습니다.
Playwright 및 Puppeteer: 고급 구성
Playwright 또는 Puppeteer의 기본 설치는 명백한 헤드리스 브라우저를 생성합니다. 자동화를 숨기기 위해 스텔스 플러그인과 추가 구성을 사용해야 합니다. puppeteer-extra-plugin-stealth 라이브러리는 주요 마커를 숨기지만 추가 설정이 필요합니다.
// 안티탐지를 위한 Playwright 고급 구성
const { chromium } = require('playwright-extra');
const stealth = require('puppeteer-extra-plugin-stealth')();
chromium.use(stealth);
const browser = await chromium.launch({
headless: false, // 헤드리스 모드는 쉽게 탐지됩니다
args: [
'--disable-blink-features=AutomationControlled',
'--disable-features=IsolateOrigins,site-per-process',
'--disable-site-isolation-trials',
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-dev-shm-usage',
'--disable-accelerated-2d-canvas',
'--disable-gpu',
'--window-size=1920,1080',
'--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
]
});
const context = await browser.newContext({
viewport: { width: 1920, height: 1080 },
locale: 'en-US',
timezoneId: 'America/New_York',
permissions: ['geolocation', 'notifications'],
geolocation: { latitude: 40.7128, longitude: -74.0060 }
});
Selenium과 undetected-chromedriver
표준 Selenium WebDriver는 navigator.webdriver 속성을 통해 쉽게 탐지됩니다. undetected-chromedriver 라이브러리는 ChromeDriver를 자동으로 패치하여 주요 자동화 마커를 제거하고 새로운 탐지 방법을 우회하기 위해 정기적으로 업데이트됩니다.
import undetected_chromedriver as uc
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('--disable-blink-features=AutomationControlled')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--no-sandbox')
options.add_argument('--window-size=1920,1080')
# 일관성을 위해 특정 Chrome 버전 사용
driver = uc.Chrome(options=options, version_main=120)
# CDP를 통한 추가 마스킹
driver.execute_cdp_cmd('Network.setUserAgentOverride', {
"userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
})
driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
안티탐지 브라우저: AdsPower, Multilogin, GoLogin
상업용 안티탐지 브라우저는 지문 관리를 위한 준비된 솔루션을 제공합니다. AdsPower와 Multilogin은 고유한 Canvas, WebGL, 오디오 지문을 가진 프로파일을 생성하고 이를 API를 통해 관리할 수 있습니다. 이러한 도구는 여러 계정 작업 시 특히 유용합니다.
주요 장점은 세션 간 일관된 지문을 유지할 수 있는 기능입니다. 각 프로파일은 고정된 Canvas, WebGL, 글꼴 매개변수를 가지므로 장기 작업에 필수적입니다. 이때 현실적인 구성을 사용하는 것이 중요합니다 — 무작위 지문 생성을 통해 기술적으로 불가능한 조합이 생성될 수 있으며, 이는 쉽게 드러납니다.
올바른 지문을 가진 HTTP 클라이언트
JavaScript 렌더링이 필요 없는 작업의 경우, 올바른 TLS 및 HTTP/2 지문을 가진 HTTP 클라이언트가 더 효과적입니다. curl-impersonate(파이썬의 경우 curl_cffi) 및 tls-client 라이브러리는 실제 브라우저의 TLS 지문을 모방할 수 있습니다.
from curl_cffi import requests
# 올바른 TLS 및 HTTP/2 지문을 가진 Chrome 120 모방
response = requests.get(
'https://example.com',
impersonate="chrome120",
proxies={
"http": "http://user:pass@proxy:port",
"https": "http://user:pass@proxy:port"
},
headers={
'Accept-Language': 'en-US,en;q=0.9',
'Accept-Encoding': 'gzip, deflate, br',
'sec-ch-ua': '"Not_A Brand";v="8", "Chromium";v="120"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"'
}
)
# TLS 지문이 자동으로 Chrome 120에 맞춰집니다
탐지 트리거 없이 자동화 기술
완벽한 기술 지문을 가지고 있더라도 자동화 패턴이 봇을 드러낼 수 있습니다. 웹사이트와의 상호작용 수준에서 인간 행동을 모방해야 합니다.
마우스 움직임 에뮬레이션
A 지점에서 B 지점으로의 직선 마우스 움직임은 자동화의 명백한 신호입니다. 인간의 손은 미세 조정이 있는 부드러운 곡선을 생성합니다. pyautogui와 같은 라이브러리는 베지어 곡선을 사용하여 현실적인 경로를 생성할 수 있습니다.
// 인간 같은 마우스 경로 생성
async function humanMouseMove(page, targetX, targetY) {
const current = await page.evaluate(() => ({
x: window.mouseX || 0,
y: window.mouseY || 0
}));
const steps = 25 + Math.floor(Math.random() * 15);
const points = generateBezierCurve(current.x, current.y, targetX, targetY, steps);
for (let point of points) {
await page.mouse.move(point.x, point.y);
await new Promise(r => setTimeout(r, 10 + Math.random() * 20));
}
// 클릭 전 미세 조정
await page.mouse.move(targetX + (Math.random() - 0.5) * 2,
targetY + (Math.random() - 0.5) * 2);
}
function generateBezierCurve(x1, y1, x2, y2, steps) {
const cp1x = x1 + (x2 - x1) * (0.3 + Math.random() * 0.2);
const cp1y = y1 + (y2 - y1) * (0.3 + Math.random() * 0.2);
const points = [];
for (let i = 0; i <= steps; i++) {
const t = i / steps;
const x = Math.pow(1-t, 2) * x1 + 2 * (1-t) * t * cp1x + Math.pow(t, 2) * x2;
const y = Math.pow(1-t, 2) * y1 + 2 * (1-t) * t * cp1y + Math.pow(t, 2) * y2;
points.push({x: Math.round(x), y: Math.round(y)});
}
return points;
}
현실적인 스크롤 및 콘텐츠 읽기
사람은 콘텐츠를 읽기 위해 페이지를 스크롤하며, 흥미로운 섹션에서 멈춥니다. 봇은 일반적으로 페이지 끝까지 또는 필요한 요소까지 최대한 빨리 스크롤합니다. 읽기를 모방하려면 콘텐츠를 분석하고 현실적인 일시 정지를 생성해야 합니다.
async function humanScroll(page, targetElement) {
const elementPosition = await page.evaluate(el => {
const rect = el.getBoundingClientRect();
return rect.top + window.pageYOffset;
}, targetElement);
const currentScroll = await page.evaluate(() => window.pageYOffset);
const distance = elementPosition - currentScroll;
const scrollSteps = Math.floor(Math.abs(distance) / 100);
for (let i = 0; i < scrollSteps; i++) {
const scrollAmount = (distance / scrollSteps) * (0.8 + Math.random() * 0.4);
await page.evaluate((amount) => {
window.scrollBy({top: amount, behavior: 'smooth'});
}, scrollAmount);
// "읽기"를 위한 무작위 일시 정지
if (Math.random() > 0.7) {
await new Promise(r => setTimeout(r, 1000 + Math.random() * 2000));
} else {
await new Promise(r => setTimeout(r, 200 + Math.random() * 400));
}
}
}
자연스러운 탐색 패턴
사용자는 목표 페이지로 직접 이동하지 않고 사이트와 자연스럽게 상호작용합니다. 홈페이지에서 시작하여 여러 섹션을 방문하고, 검색 또는 탐색 메뉴를 사용합니다. 이는 상호작용 기록을 생성하여 보호 시스템의 신뢰를 높입니다.
오류 및 수정도 모방하는 것이 중요합니다 — 사람은 잘못된 링크를 클릭하고 뒤로 돌아가거나, 검색 필드에 입력할 때 실수를 하고 오타를 수정할 수 있습니다. 목표에 대한 직접적인 경로는 의심스럽게 보입니다.
쿠키 및 스토리지 관리
PerimeterX와 Akamai는 세션 추적을 위해 쿠키 및 localStorage를 사용합니다. 요청 간 쿠키를 완전히 지우는 것은 의심스럽게 보입니다 — 실제 브라우저는 일부 쿠키(분석, 설정)를 저장합니다. 하나의 "사용자"에 대해 세션 간 쿠키를 저장하되, 서로 다른 프로파일에 대해 서로 다른 쿠키 세트를 사용하십시오.
중요: 보호 시스템은 쿠키의 나이를 분석합니다. 보호 쿠키(_px, _abck)가 방금 생성되었지만 사용자가 지속적인 방문자의 행동을 보인다면 이는 불일치입니다. 장기 작업을 위해 "예열" 프로파일을 생성하여 방문 기록을 만드십시오.
실용적인 사례 및 일반적인 문제 해결
PerimeterX 및 Akamai를 우회하는 구체적인 시나리오와 과정에서 발생하는 일반적인 문제에 대한 해결책을 살펴보겠습니다.
사례 1: PerimeterX로 전자상거래 데이터 파싱
과제: PerimeterX로 보호된 대형 온라인 상점에서 제품 데이터 추출. 사이트는 서로 다른 IP로도 3-5개의 요청 후 차단합니다.
해결책: 스티키 세션(30분)과 Playwright를 사용하여 행동을 완전히 에뮬레이션하는 레지던트 프록시 조합을 사용합니다. 주요 사항: 홈페이지에서 시작하여 탐색을 위해 검색 또는 카테고리를 사용하고, 요청 간에 3-7초의 무작위 지연을 추가하며, 스크롤 및 마우스 움직임을 모방합니다. 중요한 것은 세션 내에서 _px 쿠키를 요청 간에 유지하는 것입니다.
// 예열 세션 예시
async function scrapeWithWarmup(page, targetUrls) {
// 프로파일 예열
await page.goto('https://example.com');
await humanScroll(page, await page.$('footer'));
await new Promise(r => setTimeout(r, 3000 + Math.random() * 2000));
// 메뉴를 통한 탐색
await humanMouseMove(page, menuX, menuY);
await page.click('nav a.category');
await new Promise(r => setTimeout(r, 2000 + Math.random() * 1000));
// 예열 후에만 목표 페이지로 이동
for (let url of targetUrls) {
await page.goto(url);
await humanScroll(page, await page.$('.product-info'));
// 데이터 추출
const data = await page.evaluate(() => extractProductData());
await new Promise(r => setTimeout(r, 5000 + Math.random() * 3000));
}
}
사례 2: API 요청을 위한 Akamai 우회
과제: Akamai Bot Manager로 보호된 API에 접근. API는 페이지에서 생성된 특정 헤더 및 토큰을 요구합니다.
해결책: Akamai는 종종 sensor_data를 사용합니다 — 브라우저 검증 결과가 포함된 암호화된 문자열. 이 문자열은 JavaScript에서 생성되며 요청에 포함되어야 합니다. 브라우저 자동화를 사용하여 유효한 sensor_data를 얻은 후, 이를 올바른 TLS 지문을 가진 HTTP 클라이언트에서 사용합니다.
// 브라우저를 통한 sensor_data 추출
async function getSensorData(page) {
await page.goto('https://example.com');
// Akamai 센서 실행 대기
await page.waitForTimeout(5000);
// 쿠키 또는 localStorage에서 sensor_data 추출
const sensorData = await page.evaluate(() => {
const cookie = document.cookie.split(';')
.find(c => c.trim().startsWith('_abck='));
return cookie ? cookie.split('=')[1] : null;
});
return sensorData;
}
// HTTP 클라이언트에서 사용
const sensorData = await getSensorData(page);
const response = await fetch('https://example.com/api/data', {
headers: {
'Cookie': `_abck=${sensorData}`,
'User-Agent': 'Mozilla/5.0...',
// 나머지 헤더는 브라우저와 일치해야 합니다
}
});
사례 3: CAPTCHA 및 챌린지 페이지 해결
문제: PerimeterX 또는 Akamai가 때때로 추가 검증을 위해 챌린지 페이지나 CAPTCHA를 표시합니다.
해결책: PerimeterX의 챌린지 페이지는 일반적으로 추가 검증을 수행합니다. 이를 우회하기 위해서는...