AI 에이전트 프록시 설정: browser-use·Crawl4AI·MCP

클라우드 VM의 에이전트는 데이터센터 IP로 접속합니다. browser-use, Crawl4AI, MCP 서버에서 지금 작동하는 프록시 설정을 sticky와 로테이션 선택 표, 피해야 할 비용 함정과 함께 정리했습니다.

Proxy Setup for AI Agents: browser-use, Crawl4AI and an MCP Server
이 글의 목차

클라우드 VM에서 돌아가는 AI 에이전트는 데이터센터 IP로 외부에 접속합니다. 사이트는 다른 무엇보다 먼저 이 IP를 보기 때문에, 에이전트는 엉뚱한 국가의 결과를 받거나, 자신이 일으키지도 않은 rate limit에 걸리거나, 빠져나올 수 없는 CAPTCHA 루프에 갇힙니다. 제대로 된 AI 에이전트용 프록시 설정은 이 이그레스(egress) 문제를 프롬프트가 아니라 브라우저 설정에서 해결합니다. 여러 단계로 이루어진 작업은 처음부터 끝까지 sticky IP 하나를 유지하고, 병렬 페치는 IP를 로테이션합니다. 아래에서 browser-use, Crawl4AI, MCP 서버의 작동하는 설정과 함께 비용 관리 방법, 그리고 가장 자주 마주치는 실패 유형을 살펴봅니다.

AI 에이전트의 프록시 설정이 스크립트보다 더 중요한 이유

에이전트에 프록시가 필요한 이유는 스크레이퍼와 같은 세 가지, 즉 지역, rate limit, IP 평판입니다. 다만 에이전트는 사람의 감독 없이 실행되고 재시도 여부를 스스로 결정하기 때문에 더 절실합니다. 차단된 스크립트는 멈춥니다. 차단된 에이전트는 다시 시도하고, 표현을 바꾸고, 새 탭을 열어 또 시도하며, 그때마다 대역폭과 LLM 토큰이 소모됩니다.

  • 지역. 가격, 검색 결과, 재고, 법적 고지는 국가마다 다릅니다. US-East VM에서 독일 고객을 위해 가격을 비교하는 에이전트는 잘못된 데이터를 수집하고 있는 셈입니다. 프록시 사용자 이름에 국가 타기팅을 넣으면 에이전트 로직을 건드리지 않고 이 문제를 해결할 수 있습니다. 동작 원리는 지역 타기팅 프록시의 작동 방식에서 설명합니다.
  • 클라우드 이그레스 평판. AWS, GCP, Azure, Hetzner의 IP 대역은 공개되어 있고, IP 평판 서비스는 이를 일반 소비자 접속이 아닌 호스팅으로 분류합니다. 많은 사이트가 요청 내용과 상관없이 이런 대역을 보자마자 챌린지를 띄우거나 속도를 제한합니다. 이 점수가 매겨지는 방식은 IP 평판 심층 분석에서 다룹니다.
  • 공유되는 rate limit. NAT 게이트웨이 하나 뒤에 있는 여러 에이전트는 공인 IP 하나를 함께 씁니다. 각각은 점잖게 요청하더라도 합쳐 놓으면 공격적인 클라이언트 하나처럼 보입니다.

프록시가 해결하지 못하는 것도 있습니다. 레지덴셜 IP를 쓴다고 자동화된 브라우저가 사람처럼 보이지는 않습니다. 행동 및 핑거프린트 기반 탐지는 여전히 작동하며, 자매편인 웹사이트가 AI 브라우저 에이전트를 탐지하는 방법에서 그 방식을 보여 줍니다. 프록시는 정확하고 지역에 맞는 데이터를 얻고 부하를 공정하게 분산하는 데 쓰세요. 자동화 접근을 거부한 사이트를 우회하는 데 쓰지는 마세요.

Sticky 세션과 로테이션: 프로젝트가 아니라 작업 단위로 결정하기

경험칙은 이렇습니다. 작업에 상태가 있으면 IP를 고정하고, 없으면 로테이션합니다. 로그인 → 탐색 → 장바구니 담기 → 결제로 이어지는 흐름은 처음부터 끝까지 출구 IP 하나를 유지해야 합니다. 많은 사이트가 세션 쿠키, CSRF 토큰, 위험 점수를 세션을 시작한 IP에 묶어 두기 때문입니다. 흐름 도중 IP가 바뀌면 로그아웃되거나 다시 챌린지를 받는 일이 흔합니다. 서로 독립적인 페이지 페치는 반대입니다. 여러 IP로 분산하면 각 IP가 IP당 제한을 넘지 않습니다.

백커넥트 게이트웨이에서는 사용자 이름만 바꿔 모드를 전환합니다. USERNAME-sid-abc123-ttl-10m은 같은 세션 ID를 재사용하는 동안 같은 출구 IP를 유지합니다. 그냥 USERNAME을 쓰면 로테이션되고, USERNAME-country-US는 국가를 고정합니다. 세션 유지 시간은 sticky 세션과 로테이팅 세션 비교 가이드에서 더 자세히 다룹니다.

에이전트 작업IP 모드이유
로그인 후 계정 안에서 작업Sticky, 계정당 세션 ID 하나세션 쿠키와 위험 점수는 로그인한 IP에 묶이는 경우가 많습니다. 세션 도중 IP가 바뀌면 계정 탈취처럼 보입니다.
여러 페이지에 걸친 폼 또는 결제 테스트흐름 전체에 StickyCSRF 토큰과 장바구니 상태가 유지됩니다. 실패한 단계를 같은 IP에서 다시 시도할 수 있습니다.
서로 무관한 페이지 50개를 읽는 리서치 에이전트로테이션공유 상태가 없습니다. 요청을 분산하면 특정 도메인의 IP당 스로틀링을 피할 수 있습니다.
RAG 수집용 대량 크롤링로테이션 또는 소수의 sticky 슬롯로테이션은 부하를 분산합니다. sticky 슬롯을 쓰면 JS가 많은 사이트가 몇 페이지 동안 쿠키를 유지할 수 있습니다.
지역 비교(같은 URL, 여러 국가)국가 타기팅, 국가 내에서 로테이션IP별이 아니라 시장별로 하나의 답을 얻고 싶기 때문입니다.
한 페이지를 N분마다 모니터링로테이션한 IP에서 반복해서 접속하면 패턴이 생깁니다. 로테이션하면 IP당 부하가 낮게 유지됩니다.

browser-use: 현재 API의 프록시 설정

browser-use는 Browser(BrowserSession의 별칭)에서 server, username, password, bypass 필드를 갖는 proxy=ProxySettings(...) 인자를 받습니다. 자격 증명은 브라우저로만 전달되고 LLM 컨텍스트에는 절대 들어가지 않습니다. 내부적으로 browser-use는 --proxy-server 옵션으로 Chromium을 실행하고 프록시의 인증 요청에 CDP(Fetch.authRequired)로 응답하므로, URL에 자격 증명을 넣을 필요가 없습니다. import 경로에 주의하세요. ProxySettings는 패키지 루트가 아니라 browser_use.browser에 있습니다(브라우저 파라미터 레퍼런스와 profile.py 참고).

import asyncio
import os
import uuid

from browser_use import Agent, Browser, ChatOpenAI
from browser_use.browser import ProxySettings

PROXY_USER = os.environ["PROXYHAT_USER"]
PROXY_PASS = os.environ["PROXYHAT_PASS"]


async def run_checkout_test() -> None:
    # 흐름 전체에 sticky 세션 ID 하나: 로그인 -> 장바구니 -> 결제 동안 출구 IP 하나를 유지.
    session_id = uuid.uuid4().hex[:12]

    browser = Browser(
        headless=True,
        proxy=ProxySettings(
            server="http://gate.proxyhat.com:8080",
            username=f"{PROXY_USER}-sid-{session_id}-ttl-10m",
            password=PROXY_PASS,
            bypass="localhost,127.0.0.1",
        ),
        # 에이전트를 테스트 대상 사이트에 묶어 둠. sensitive_data를 입력할 수 있는 곳도 제한됨.
        allowed_domains=["https://staging.example-shop.com"],
        # Chromium 스위치: 이미지를 아예 내려받지 않음.
        args=["--blink-settings=imagesEnabled=false"],
    )

    agent = Agent(
        task="Log in with x_user / x_pass, add the cheapest USB-C cable to the cart, "
             "stop at the payment page and report the order total.",
        llm=ChatOpenAI(model=os.environ["OPENAI_MODEL"]),
        browser=browser,
        # 모델에는 x_user / x_pass 자리 표시자만 보이고 실제 값은 보이지 않음.
        sensitive_data={
            "https://staging.example-shop.com": {
                "x_user": os.environ["SHOP_USER"],
                "x_pass": os.environ["SHOP_PASS"],
            }
        },
        use_vision=False,   # 단계마다 스크린샷을 보내지 않음: 토큰 절약
        max_failures=2,     # 기본값은 5. 실패할 때마다 페이지 로드가 한 번 더 반복됨
    )
    history = await agent.run(max_steps=25)   # 기본값은 500
    print(history.final_result())


asyncio.run(run_checkout_test())

이 패턴에 관한 참고 사항입니다.

  • 인증이 필요한 프록시에는 HTTP 포트를 쓰세요. Chromium의 네트워크 스택 문서는 SOCKSv5에 대해 어떤 인증 방식도 지원하지 않는다고 명시하므로, 자격 증명을 붙인 socks5://…:1080은 Chromium 기반 에이전트에서 모두 실패합니다. http://gate.proxyhat.com:8080을 사용하세요.
  • 프록시 자격 증명은 sensitive_data가 아닙니다. sensitive_data는 에이전트가 페이지에 직접 입력해야 하는 값을 위한 것입니다. 프록시 자격 증명은 모델이 볼 수 없는 ProxySettings에 넣으세요. "에이전트가 알 수 있도록" 프록시 URL을 task 문자열에 붙여 넣지 마세요.
  • allowed_domains는 보기보다 중요합니다. 도메인을 제한하지 않고 sensitive_data를 전달하면 browser-use가 경고를 남깁니다. 그렇지 않으면 프롬프트 인젝션이 담긴 페이지가 에이전트를 꼬드겨 다른 곳에 비밀 값을 입력하게 만들 수 있기 때문입니다.
  • 클라우드 모드는 이그레스가 다릅니다. Browser(use_cloud=True)는 자체 프록시를 갖춘 Browser Use Cloud에서 브라우저를 실행합니다. 여러분의 ProxySettings는 직접 실행하는 로컬 브라우저나 cdp_url 브라우저에만 적용됩니다.
  • 기본 확장 프로그램이 대역폭을 아껴 줍니다. enable_default_extensions는 기본으로 켜져 있으며 uBlock Origin Lite와 쿠키 배너 처리기를 로드하므로, 광고와 트래커 대부분이 트래픽에 잡히지 않습니다.

Crawl4AI: 크롤별 프록시, 로테이션, sticky 세션

Crawl4AI에서는 CrawlerRunConfig에서 크롤마다 프록시를 지정합니다. proxy_config를 쓰거나 proxy_rotation_strategy를 통해 설정합니다. 프록시 문서는 예전의 BrowserConfig proxy 인자를 지원 중단(deprecated)으로 표시하고 요청별 프록시 설정을 권장합니다. sticky 동작이 필요하면 proxy_session_id가 같은 ID를 공유하는 모든 크롤에 전략의 프록시 하나를 고정합니다.

백커넥트 게이트웨이는 호스트가 하나이므로, "프록시 목록"은 곧 세션 사용자 이름 목록을 뜻합니다. 각 세션 ID는 고유한 출구 IP를 가진 슬롯이 되고, 라운드 로빈이 URL을 슬롯에 분배합니다.

import asyncio
import os
import uuid

from crawl4ai import (AsyncWebCrawler, BrowserConfig, CacheMode,
                      CrawlerRunConfig, ProxyConfig, RoundRobinProxyStrategy)

USER = os.environ["PROXYHAT_USER"]
PASS = os.environ["PROXYHAT_PASS"]


def slot() -> ProxyConfig:
    # 슬롯마다 sticky 세션 하나: 각 슬롯이 출구 IP 하나를 유지.
    sid = uuid.uuid4().hex[:10]
    return ProxyConfig(
        server="http://gate.proxyhat.com:8080",
        username=f"{USER}-sid-{sid}-ttl-10m",
        password=PASS,
    )


strategy = RoundRobinProxyStrategy([slot() for _ in range(8)])

browser_cfg = BrowserConfig(
    headless=True,
    text_mode=True,   # 이미지 등 무거운 콘텐츠 비활성화를 시도
    avoid_ads=True,   # 흔한 광고/트래커 도메인 차단
)

bulk_cfg = CrawlerRunConfig(
    proxy_rotation_strategy=strategy,   # URL마다 다음 슬롯
    cache_mode=CacheMode.BYPASS,
    check_robots_txt=True,
    max_retries=1,
)


async def main(urls: list[str]) -> None:
    async with AsyncWebCrawler(config=browser_cfg) as crawler:
        results = await crawler.arun_many(urls, config=bulk_cfg)
        for r in results:
            print(r.url, r.success, len(r.markdown or ""))

        # 상태가 있는 시퀀스: 모든 단계에서 같은 프록시 슬롯과 같은 브라우저 페이지 사용.
        step_cfg = bulk_cfg.clone(proxy_session_id="acct-42", session_id="acct-42")
        await crawler.arun("https://example.com/login", config=step_cfg)
        await crawler.arun("https://example.com/account/orders", config=step_cfg)


asyncio.run(main(["https://example.com/a", "https://example.com/b"]))

헷갈리기 쉬운 설정이 두 가지 있습니다. session_id는 arun() 호출 사이에 같은 브라우저 페이지를 유지하고, proxy_session_id는 같은 프록시를 유지합니다. 상태가 있는 흐름에는 둘 다 필요합니다. sticky 슬롯 대신 국가를 고정한 로테이션이 필요하다면 사용자 이름을 USERNAME-country-US로 지정한 ProxyConfig 하나를 쓰세요.

재시도 증폭 함정도 있습니다. proxy_config는 차례로 대체 시도할 프록시 목록도 받는데, async_webcrawler.py의 재시도 루프는 시도할 때마다 목록 전체를 순회합니다. 그래서 차단된 URL 하나가 최대 (max_retries + 1) × len(list)번까지 요청될 수 있습니다. 대체 프록시가 10개이고 max_retries=3이면, 어차피 열리지 않을 URL 하나에 페이지 로드가 40번 발생합니다. 목록은 짧게 유지하고 max_retries는 의도를 갖고 설정하세요.

MCP 어시스턴트에 프록시를 거친 웹 접근 제공하기

방법은 두 가지입니다. Microsoft의 Playwright MCP 서버를 설정에 프록시를 넣어 실행하거나, 프록시를 거쳐 페이지를 가져와 텍스트로 반환하는 작은 MCP 도구를 직접 작성하는 것입니다. 어시스턴트가 클릭하고 입력해야 한다면 첫 번째 방법을, 페이지를 읽기만 하면 된다면 호출당 비용이 훨씬 적은 두 번째 방법을 쓰세요.

방법 1: 인증 프록시를 사용하는 Playwright MCP

@playwright/mcp에는 --proxy-server와 --proxy-bypass 플래그가 있습니다(README). 자격 증명이 필요한 프록시라면 대신 JSON 설정 파일을 사용하세요. 설정 파일의 browser.launchOptions는 Playwright에 그대로 전달되며, Playwright의 proxy 옵션은 username과 password 필드를 따로 받습니다.

{
  "browser": {
    "browserName": "chromium",
    "isolated": true,
    "launchOptions": {
      "headless": true,
      "proxy": {
        "server": "http://gate.proxyhat.com:8080",
        "username": "USERNAME-sid-mcp01-ttl-10m",
        "password": "PASSWORD"
      }
    }
  },
  "capabilities": ["core"]
}
npx @playwright/mcp@latest --config ./playwright-mcp.json --image-responses omit

이 파일은 저장소에 넣지 말고, 서버를 실행하는 사용자만 읽을 수 있게 하세요. 여기서는 세션 ID 때문에 어시스턴트 세션 전체가 IP 하나를 공유하므로 "로그인해서 X를 하라" 같은 작업에 적합합니다. 새 IP가 필요하면 새 ID로 다시 시작하세요. --image-responses omit은 스크린샷이 모델로 전달되지 않게 합니다. "isolated": true(--isolated 플래그)는 프로필을 메모리에만 유지해 작업 간에 쿠키가 새지 않게 합니다. README는 --allowed-origins와 --blocked-origins가 보안 경계가 아니라는 점도 지적합니다. 보호 수단이 아니라 위생 관리 차원으로 여기세요.

방법 2: 공식 MCP Python SDK로 만드는 최소한의 프록시 페치 도구

Python SDK v2에서는 FastMCP의 이름이 MCPServer로 바뀌었습니다(마이그레이션 가이드). from mcp.server.fastmcp import FastMCP로 작성한 v1 코드는 import를 새로 바꿔야 합니다. 아래는 게이트웨이를 거쳐 페이지를 가져오고, 응답 크기를 제한하며, 출력에 프록시 URL을 절대 넣지 않는 읽기 전용 도구입니다.

import os
import re

import httpx
from mcp.server import MCPServer

mcp = MCPServer("proxied-fetch")

_USER = os.environ["PROXYHAT_USER"]
_PASS = os.environ["PROXYHAT_PASS"]
_MAX_BYTES = 1_500_000
_COUNTRY = re.compile(r"^[A-Za-z]{2}$")
_SESSION = re.compile(r"^[A-Za-z0-9]{1,24}$")


def _proxy(country: str | None, session: str | None) -> str:
    user = _USER
    # 모델이 넘긴 값을 검증: 이 값은 프록시 사용자 이름에 들어감.
    if session:
        if not _SESSION.match(session):
            raise ValueError("session must be 1-24 alphanumerics")
        user = f"{_USER}-sid-{session}-ttl-10m"
    elif country:
        if not _COUNTRY.match(country):
            raise ValueError("country must be a 2-letter code")
        user = f"{_USER}-country-{country.upper()}"
    return f"http://{user}:{_PASS}@gate.proxyhat.com:8080"


@mcp.tool()
async def fetch_page(url: str, country: str | None = None, session: str | None = None) -> str:
    """Fetch a public http(s) page through a residential proxy and return its text.

    country: optional 2-letter exit country. session: optional ID to reuse one exit IP.
    """
    if not url.startswith(("http://", "https://")):
        return "error: only http(s) URLs are allowed"
    try:
        async with httpx.AsyncClient(proxy=_proxy(country, session), timeout=30,
                                     follow_redirects=True) as client:
            async with client.stream("GET", url) as resp:
                body = b""
                async for chunk in resp.aiter_bytes():
                    body += chunk
                    if len(body) > _MAX_BYTES:
                        break
        text = body.decode(resp.encoding or "utf-8", errors="replace")
        return f"HTTP {resp.status_code} {resp.url}\n\n{text[:200_000]}"
    except ValueError as e:
        return f"error: {e}"
    except httpx.HTTPError as e:
        # 예외 타입만 반환: 일부 메시지에는 프록시 URL이 그대로 담길 수 있음.
        return f"error: fetch failed ({type(e).__name__})"


if __name__ == "__main__":
    mcp.run(transport="stdio")

MCP 클라이언트에 stdio 서버로 등록하세요. PROXYHAT_USER와 PROXYHAT_PASS는 도구 인자가 아니라 클라이언트의 env 블록으로 전달해야 합니다. 예를 들어 Claude Code에서는 claude mcp add --env PROXYHAT_USER=… --env PROXYHAT_PASS=… --transport stdio proxied-fetch -- python server.py입니다. --transport는 마지막 --env와 서버 이름 사이에 두세요. 그렇지 않으면 CLI가 서버 이름을 또 하나의 env 쌍으로 읽습니다. 정규식 검사는 괜히 있는 것이 아닙니다. 프롬프트 인젝션이 담긴 페이지는 모델이 이상한 인자로 도구를 호출하게 만들 수 있고, 검증하지 않은 입력은 프록시 사용자 이름에 임의의 텍스트를 써넣게 됩니다. JavaScript가 필요한 페이지라면 방법 1을 쓰거나, 브라우저 계층을 직접 구축한다면 Playwright 로테이팅 프록시 가이드를 참고하세요.

비용 관리: 에이전트는 스크립트와 다른 방식으로 대역폭을 소모합니다

레지덴셜 트래픽은 기가바이트 단위로 과금되는데, 에이전트는 전체 페이지를, 그것도 단계마다 여러 번 로드하는 경우가 많습니다. 효과가 큰 순서대로 대략 정리하면 다음과 같습니다.

  1. 모델이 읽지 않을 것은 로드하지 마세요. 최신 웹 페이지 용량의 대부분은 이미지, 동영상, 폰트, 광고 스크립트입니다. Crawl4AI에서는 text_mode=True와 avoid_ads=True를, browser-use에서는 imagesEnabled=false 스위치나 uBlock을 쓰고, 서버 측에서 렌더링되는 페이지라면 브라우저 대신 페치 도구를 쓰세요.
  2. 재시도는 두 군데에서 제한하세요. 프레임워크 재시도(max_failures, max_retries)와 에이전트 수준의 재계획은 서로 곱해집니다. 403을 받은 뒤 "다른 방법을 시도하는" 에이전트는 대개 같은 차단 페이지를 다시 로드할 뿐입니다. 막힌 실행이 적은 비용으로 끝나도록 max_steps를 충분히 낮게 설정하세요.
  3. 상태가 있는 흐름에서는 컨텍스트를 재사용하세요. 새 브라우저 컨텍스트는 새 쿠키, 새 챌린지, 캐시된 모든 리소스의 재다운로드를 뜻합니다. 한 작업 안에서는 컨텍스트(와 sticky IP)를 유지하세요.
  4. 차단 신호가 오면 멈추세요. CAPTCHA 페이지, 봇 관리 벤더가 보낸 403, 429는 사람에게 보고하는 종료 상태로 처리하세요. 에이전트가 재시도로 밀고 나가게 두지 마세요. 물러서야 하는 이유는 CAPTCHA 처리 가이드에서 설명합니다.
  5. 월 단위가 아니라 작업 단위로 측정하세요. 에이전트 실행마다 바이트 수를 기록하세요. 갑자기 늘어났다면 작업이 커졌다기보다 루프에 빠졌을 가능성이 높습니다.

미리 대비해야 할 실패 유형

에이전트 프록시 사고는 대부분 네 가지 원인 중 하나에서 비롯됩니다. CAPTCHA 루프, 재시도 증폭, 조용히 IP가 바뀌는 세션, 모델 컨텍스트로 새어 들어간 자격 증명입니다.

  • CAPTCHA 루프. 비전 기능이 켜진 에이전트는 챌린지를 "풀려고" 시도하다 실패하고, 새로 고침한 뒤 다시 시도합니다. 챌린지 페이지(알려진 iframe 호스트, "Just a moment…" 같은 제목)를 감지하면 실행을 종료하세요. 챌린지를 대량으로 푸는 것은 정상적인 파이프라인이 할 일이 아니며, 레지덴셜 IP에서 실패가 반복되면 그 IP를 쓰는 모든 사람의 평판이 떨어집니다.
  • 재시도 증폭. 앞에서 다룬 대로 프레임워크 재시도 × 프록시 대체 목록 × 에이전트 재계획입니다. 실패 횟수만이 아니라 URL당 총 시도 횟수를 지켜보세요.
  • 조용한 세션 끊김. sticky 세션은 TTL이 다하면 끝나고, 업스트림 피어가 오프라인이 되면 더 일찍 끝날 수도 있습니다. 그러면 다음 요청은 새 IP로 나갑니다. 흐름 도중의 요청이 갑자기 로그인 페이지로 리디렉션된다면 IP가 바뀌었다고 보세요. 에이전트가 즉흥적으로 대처하게 두지 말고 새 세션 ID로 흐름을 다시 시작하세요.
  • LLM 컨텍스트 안의 자격 증명. 모델에 닿는 모든 것은 로그, 트레이스, 평가 데이터셋, 또는 프롬프트 인젝션을 통한 유출 요청에 담길 수 있습니다. 프록시 자격 증명은 브라우저나 HTTP 클라이언트가 읽는 환경 변수에 두세요. 작업 문자열, 시스템 프롬프트, 도구 출력에 넣지 말고, 예외 메시지는 반환하기 전에 정리하세요. Playwright MCP의 secrets 옵션은 도구 응답에서 알려진 문자열을 가릴 수 있지만, README 스스로 이를 보안 기능이 아닌 편의 기능이라고 말합니다.

에이전트를 탓하기 전에 프록시만 따로 테스트하세요. 설정한 사용자 이름 변형을 프록시 체커로 실행해 출구 국가와 IP 유형이 예상과 같은지 확인하세요. 에이전트 워크로드에 맞는 IP 유형을 폭넓게 비교한 내용은 AI 에이전트와 LLM 웹 데이터 수집을 위한 최고의 프록시를 참고하세요.

이 설정으로 해결되지 않는 것

프록시는 트래픽이 어디서 오는지를 바꿀 뿐, 어떻게 행동하는지는 바꾸지 않습니다. 에이전트가 행동 기반 봇 탐지를 통과하게 해 주지 않으며, robots.txt나 약관으로 자동화를 차단한 사이트에 접근해도 된다는 허가도 아닙니다. 개인정보 수집을 합법으로 만들어 주지도 않습니다. 사이트가 API, 피드, 서명된 에이전트 프로그램을 제공한다면 대개 어떤 프록시 설정보다 저렴하고 안정적입니다. 레지덴셜 IP는 잘하는 일에 쓰세요. 정확한 지역, 공정한 부하 분산, 그리고 클라우드 대역의 평판을 물려받지 않는 것입니다.

자주 묻는 질문

browser-use에 프록시는 어떻게 추가하나요?

browser_use.browser에서 ProxySettings를 import한 뒤 Browser에 proxy=ProxySettings(server=..., username=..., password=...)를 전달하세요. browser-use는 --proxy-server 옵션으로 Chromium을 실행하고 프록시 인증 요청에 CDP로 응답하므로 자격 증명이 LLM에 전달되지 않습니다. Chromium은 SOCKS5 인증을 지원하지 않으니 HTTP 프록시 엔드포인트를 사용하세요.

AI 에이전트에는 로테이팅 프록시와 sticky 프록시 중 무엇을 써야 하나요?

로그인, 여러 페이지에 걸친 폼, 결제처럼 상태가 있는 작업에는 sticky 세션을 쓰세요. 많은 사이트가 쿠키와 위험 점수를 세션을 시작한 IP에 묶어 두기 때문입니다. 리서치용 페이지 읽기나 대량 크롤링처럼 서로 독립적인 페치에는 로테이션을 쓰세요. 요청을 분산하면 각 IP가 사이트별 제한을 넘지 않습니다.

Crawl4AI에서 프록시를 로테이션하려면 어떻게 하나요?

ProxyConfig 객체 목록을 만들어 RoundRobinProxyStrategy로 감싼 뒤 CrawlerRunConfig의 proxy_rotation_strategy로 전달하세요. 백커넥트 게이트웨이 하나를 쓴다면 ProxyConfig마다 다른 세션 사용자 이름을 지정해 각각 고유한 출구 IP를 갖게 하세요. 여러 단계로 된 시퀀스에서 프록시 하나를 고정하려면 proxy_session_id를 추가합니다.

Claude 같은 MCP 어시스턴트에 프록시를 거친 웹 접근을 줄 수 있나요?

가능합니다. browser.launchOptions.proxy에 server, username, password를 넣은 설정 파일로 Playwright MCP를 실행하거나, Python SDK의 MCPServer 클래스로 httpx를 써서 프록시를 거쳐 페이지를 가져오는 작은 MCP 도구를 작성하면 됩니다. 어느 쪽이든 프록시 자격 증명은 프롬프트나 도구 출력이 아니라 환경 변수나 설정 파일에 두세요.

AI 에이전트는 왜 프록시 대역폭을 그렇게 많이 쓰나요?

에이전트는 전체 페이지를, 그것도 단계마다 여러 번 로드하는 경우가 많고 재시도가 누적됩니다. 프레임워크 재시도, 프록시 대체 목록, 에이전트 자체의 재계획이 서로 곱해지기 때문입니다. 이미지·폰트·광고 차단, max_steps와 재시도 제한, 브라우저 컨텍스트 재사용, CAPTCHA 페이지에서 중단하기로 낭비 대부분을 줄일 수 있습니다.

시작할 준비가 되셨나요?

195개국 이상의 주거용, ISP, 모바일 프록시. 무료 계정을 만드세요.

무료 계정 만들기
← 블로그로 돌아가기