새로운 기능
글자 하나만 빠져도 문제가 발생합니다. proxy 사용자 이름에 -contry-de를 입력하면, 오타가 정상적인 옵션처럼 보여 눈에 쉽게 띄지 않습니다.
FourA proxy 포트는 인식 가능한 모든 키 목록과 함께 400 에러를 반환합니다. 이는 9월 15일에 베타를 종료한 제품의 작은 디테일 중 하나입니다. API 호출 코드를 작성할 필요 없이, proxy를 지원하는 모든 클라이언트(브라우저, 다운로드 도구, 기존 스크레이퍼)를 위해 FourA 출구 노드의 proxy URL을 제공합니다. 대시보드에서 proxy 사용자를 생성하고 해당 문자열을 붙여넣기만 하면, 터널과 트래픽이 API request와 동일한 방식으로 플랜 사용량에 반영됩니다.
전체 문법 구조와 각 규칙이 도입된 이유는 다음과 같습니다.
작동 방식
해당 포트는 proxy.foura.ai:34004에 위치하며, 443 및 80 포트의 타깃을 대상으로 Basic authentication 기반의 HTTP CONNECT를 사용합니다. 인증 정보는 proxy 사용자 단위로 관리되며 API key와 의도적으로 분리되어 있습니다. proxy 핸드셰이크는 평문으로 전송될 수 있으므로, API 연동에 영향을 주지 않고도 proxy 사용자의 비밀번호를 재설정할 수 있습니다.
인증 정보 뒤에는 순서에 상관없이 -key-value 쌍의 목록이 이어집니다.
# Shared network, a German address, one sticky session for this job
curl -x "http://USERNAME-country-de-session-job42:PASSWORD@proxy.foura.ai:34004" \
https://example.com
# Premium network, an Android address in Germany, held 30 minutes
curl -x "http://USERNAME-network-premium-country-de-os-android-session-s1-lifetime-30:PASSWORD@proxy.foura.ai:34004" \
https://example.com
Shared는 FourA 자체 출구 노드이며, 기본값으로 플랜에 포함되어 있습니다. Premium은 주거용 IP 주소로, 플랜의 프리미엄 트래픽과 추가 구매한 트래픽에서 차감됩니다. 공유 네트워크에서는 -fallback-premium 설정을 통해 공유 노드가 요청을 처리하지 못할 때 프리미엄 출구 노드로 연결을 전환할 수 있습니다. 직접 활성화하지 않는 한 꺼져 있으며, 프리미엄 잔여량이 있을 때만 동작합니다. 이를 기본으로 활성화하면 사용자의 동의 없이 해당 허용량을 소모하게 되기 때문입니다.
국가는 중복 지정이 가능하므로 -country-de-country-fr는 2개 국가 범위가 됩니다. 지역, 도시, AS 번호 기준 네트워크, 기기 유형(windows, android, ios, mac) 및 lifetime(3~1440분)은 프리미엄 전용입니다. 공유 네트워크에서 도시를 요청하면 best effort 대신 400 에러를 반환합니다. 대부분 수용할 수 없는 도시 필터는 필터가 전혀 없는 것보다 나쁘므로, 공유 네트워크는 국가 단위까지만 선택할 수 있습니다.
-session-<name>(1~32자의 영문, 숫자, 밑줄)는 세션 고정 연결을 지원합니다. 해당 이름을 사용하는 모든 연결은 동일한 주소를 공유합니다. 공유 네트워크에서 주소는 10분의 슬라이딩 윈도우 동안 유지되므로 계속 사용하는 한 유지됩니다. 프리미엄에서는 설정한 lifetime 또는 네트워크 기본값 동안 유지됩니다. 세션을 지정하지 않으면 각 연결은 매번 새로운 주소에서 나갑니다.
저장된 기본값 기능도 제공됩니다. 대시보드의 프록시 사용자에 저장된 타겟팅은 해당 사용자가 생성하는 모든 연결에 적용되므로, 연결 문자열을 기본 인증 정보만으로 축소할 수 있습니다. 개별 연결에서는 username 설정이 여전히 우선하며, any를 통해 저장된 값을 초기화할 수 있습니다. 예를 들어 -city-any는 뮌헨으로 저장된 키를 독일 전체 대상으로 요청합니다. CONNECT 요청에 헤더를 추가할 수 있는 클라이언트(curl은 --proxy-header 사용 가능)는 X-Foura-Country, X-Foura-Session 등의 동일한 옵션을 전송할 수 있으며, 헤더가 username보다 우선합니다.
영향
이러한 변경으로 더 이상 불필요한 문의를 할 필요가 없어집니다.
요청이 거부된 이유는 무엇인가요? 인증 정보 확인 후 발생하는 모든 거부 응답에는 한 줄 사유가 담긴 X-Foura-Error 헤더가 포함됩니다. 400 응답은 잘못된 옵션과 허용되는 값을 명시합니다. 429 응답은 동시 오픈 터널 수, 분당 터널 생성 수, 청구 주기 내 표준 트래픽 중 플랜의 어떤 제한에 도달했는지 알려줍니다.
허용량은 누구 기준인가요? 계정 기준입니다. 터널 및 생성 횟수는 프록시 사용자가 아닌 계정 단위로 계산되므로, 두 번째 인증 정보를 생성해도 허용량이 추가되지 않습니다. 바이트는 플랜 대역폭에 반영되며, 프리미엄 바이트는 총대역폭 내 프리미엄 허용량에서 차감되고 추가 합산되지 않습니다. 크레딧 기반 플랜에서는 포트에 포함된 기가바이트가 제공되며, 이는 결제 페이지에서 충전할 수 있습니다. 터널이 열리지 않으면 아무것도 차감되지 않습니다.
인증 정보의 소유자는 누구인가요? 이제 조직이 소유할 수 있으므로 담당자가 퇴사해도 회사의 다운로더가 중단되지 않습니다. 멤버는 이를 사용하고 비밀번호를 확인할 수 있으며, 관리자와 소유자는 순환 교체, 비활성화 또는 재타겟팅할 수 있습니다. 조직 외부로의 이전은 소유자만 가능합니다.
어떤 기능인가요? Overview, Metrics 또는 Activity에서 Product 스위치를 Proxy로 전환하세요. API request와 동일한 결과 클래스 내 터널 현황, 현재 열려 있는 터널 수, 설정 시간 및 트래픽을 proxy 사용자, 타겟, 송출 국가 또는 클라이언트 IP별로 확인할 수 있습니다. 이미 주소가 할당된 세션은 대개 1초 미만으로 연결됩니다.
하지만 포트는 파이프 역할을 하므로 트레이드오프가 존재합니다. 클라이언트가 터널을 통해 대상 사이트와 직접 통신하므로, 언블로커, validate 규칙, 브라우저 기반 챌린지 해결 기능이 해당 경로에 포함되지 않습니다. 또한 바이트 단위로 측정됩니다. 오픈된 터널을 통해 수신된 거부 페이지도 일반 바이트와 동일하게 취급되는 반면, API에서는 성공하지 않은 request에 비용이 청구되지 않습니다. 일반 데이터 전송은 포트를 이용하고, 차단이 발생하는 페이지는 API로 전송하세요.
고급 사용자를 위한 안내
프리미엄 허용량이 소진되면 해당 네트워크로 진입하는 3가지 라우트에 의도적으로 각기 다른 응답이 반환됩니다. -network-premium를 지정한 연결은 403 오류와 함께 명시적으로 거부됩니다. 다른 곳에서 조용히 처리될 경우 호출자가 계속 재시도하여 청구 내역에 반영되지도 않은 프리미엄 라인을 찾는 문제가 발생하기 때문입니다. 폴백은 적용되지 않으며, proxy 사용자에 저장된 프리미엄 기본값은 공유 네트워크로 전환되어 터널은 정상적으로 열립니다. 두 경우 모두 해당 연결에 추가 비용을 지출하도록 설정되지 않았습니다.
어중간하게 처리하는 대신 완전히 거부되는 조합 3가지는 공유 네트워크에서의 세부 타겟팅, -fallback-premium와 -network-premium의 조합, 그리고 폴백이 활성화된 상태에서의 세부 타겟팅입니다. 해당 포트는 CONNECT만 지원하므로 터널링 대신 일반 http:// request를 전달하는 클라이언트는 405 응답을 받습니다(cURL은 --proxytunnel 옵션으로 터널링함). 또한 단일 페이지 로드 시 수십 개의 연결이 생성되므로, 해당 포트를 통해 실행되는 브라우저는 항상 세션 이름을 포함해야 합니다.
각각 고유한 주소를 사용하는 여러 worker가 있나요? 각 worker에 고유한 세션 이름을 지정하세요.
import requests
TEMPLATE = "http://USERNAME-country-de-session-{name}:PASSWORD@proxy.foura.ai:34004"
def worker_session(name):
proxy = TEMPLATE.format(name=name)
s = requests.Session()
s.proxies = {"http": proxy, "https": proxy}
return s
workers = [worker_session(f"w{i}") for i in range(4)]
print(workers[0].get("https://example.com").status_code)
Dashboard에서도 동일한 작업을 대규모로 수행할 수 있습니다. Sticky를 설정하고 수량을 선택하면 Connection string 탭에 주소당 한 줄씩 URL 형식이나 프록시 관리자용 host:port:user:pass 형식으로 표시됩니다. 요청 거부 원인을 확인하려면 curl 호출에 -sv를 추가하고 2>&1 | grep -i x-foura-error로 파이프하십시오. 모든 옵션은 proxy port 레퍼런스에 나와 있으며, Dashboard 관련 내용은 Proxy Users에서 확인할 수 있습니다.
향후 계획
프록시 사용자를 기반으로 처음 구축한 클라이언트는 자사 제품입니다. FourA Chrome 확장 프로그램은 브라우저 트래픽을 프록시 사용자 중 하나를 통해 라우팅합니다. 네트워크와 국가를 선택하고 스위치를 켜면 웹사이트에 표시되는 주소가 상태 표시줄에 나타납니다. 현재 베타 버전으로 Chrome 웹 스토어에는 없으며, 개발자 모드에서 Dashboard의 Tools 메뉴를 통해 설치할 수 있습니다. 향후 계획으로는 공개 로드맵에 조직 청구(organization billing) 기능이 예정되어 있습니다. 이는 조직의 프록시 사용자 비용이 해당 조직의 소유자에게 청구되는 구조이므로 중요한 부분입니다.
프록시 URL은 가장 오래된 연동 규격이며, 보유한 거의 모든 도구가 이미 이를 지원합니다. 중요한 것은 터널 자체가 아니었습니다. 터널 앞의 문자열이 어떤 의미를 가질 수 있는지, 그리고 설정이 잘못되었을 때 어떤 일이 발생하는지가 핵심입니다.