# 인증 프록시와 셀레니움: 작동하는 로컬 포워더

> Selenium 인증 프록시: Chrome이 프록시 자격증명을 무시하는 이유와 40줄 파이썬 로컬 포워더 예제. 레지덴셜, KYC 없이.

- URL: https://crawlrelay.com/ko/docs/selenium/
- 마지막 업데이트: 2026-10-13
- Publisher: CrawlRelay (https://crawlrelay.com)

Chrome의 프록시 플래그에는 비밀번호 입력란이 없습니다. 127.0.0.1에서 매우 작은 로컬 포워더가 자격증명을 추가해 주므로 Selenium은 오픈 로컬 프록시만 인식합니다.

**빠른 답변 — Selenium에서 사용자 이름과 비밀번호가 필요한 프록시를 어떻게 사용하나요?**

`Proxy-Authorization` 헤더를 추가하는 작은 로컬 포워더를 실행하고, `--proxy-server=http://127.0.0.1:8899` 옵션으로 Chrome을 연결하세요. Chrome은 해당 플래그 안의 자격증명을 무시하고 Selenium에는 프록시 비밀번호를 위한 범용 옵션이 없습니다. **CrawlRelay** 레지덴셜 프록시는 `gw.crawlrelay.com:7777`에서 이렇게 작동하며, US$0.50/GB에서 구입 가능, KYC 없이 크립토로 결제됩니다.

## Selenium 설치 요약

| 속성 | 값 |
| --- | --- |
| 왜 포워더가 필요한가요 | Chrome의 `--proxy-server` 플래그에는 사용자 이름이나 비밀번호를 넣을 수 없습니다 |
| 포워더 | `127.0.0.1:8899`에서 수신해 `Proxy-Authorization`를 추가하고 `gw.crawlrelay.com:7777`에 전달합니다 |
| 크롬 옵션 | `--proxy-server=http://127.0.0.1:8899` |
| 회전 | 각 새로운 CONNECT 터널은 새로운 연결이므로 보통 새로운 출구 IP입니다; 세션 ID를 추가해 하나의 IP를 유지할 수도 있습니다 |
| 간단한 대안 | [Playwright](https://crawlrelay.com/ko/docs/playwright/)는 사용자 이름과 비밀번호를 직접 입력합니다 |

## 로컬 포워더는 어떻게 작동하나요?

브라우저의 프록시 요청을 받아서, 자격 증명이 포함된 헤더 하나를 삽입한 후 양방향으로 바이트를 복사합니다. HTTPS 사이트의 경우 브라우저가 `CONNECT host:443`를 보내고, 게이트웨이가 `200 Connection established`로 응답하며, TLS는 Chrome과 웹사이트 간에 종단 간으로 실행됩니다. 포워더는 페이지 내용을 평문으로 절대 볼 수 없습니다.

이 최소한의 버전은 HTTPS 사이트를 처리하며, 각 연결이 하나의 CONNECT 터널을 가집니다. 이것이 오늘날 거의 모든 웹사이트를 포함합니다. `127.0.0.1`에 바인딩해 다른 기기가 자격 증명을 사용할 수 없게 하세요.

*forwarder.py (Python 3.8+, 표준 라이브러리만 사용)*

```python
import asyncio
import base64
import os

UPSTREAM = ("gw.crawlrelay.com", 7777)
USER = os.environ.get("CRAWLRELAY_USER", "USERNAME-country-us")
PASSWORD = os.environ.get("CRAWLRELAY_PASSWORD", "PASSWORD")
AUTH = b"Proxy-Authorization: Basic " + base64.b64encode(("%s:%s" % (USER, PASSWORD)).encode())


async def pipe(reader, writer):
    try:
        while True:
            data = await reader.read(65536)
            if not data:
                break
            writer.write(data)
            await writer.drain()
    except ConnectionError:
        pass
    finally:
        writer.close()


async def handle(client_reader, client_writer):
    try:
        head = await client_reader.readuntil(b"\r\n\r\n")  # request line and headers from the browser
    except asyncio.IncompleteReadError:
        client_writer.close()
        return
    lines = head.split(b"\r\n")
    lines.insert(1, AUTH)  # add the credentials right after the request line
    up_reader, up_writer = await asyncio.open_connection(*UPSTREAM)
    up_writer.write(b"\r\n".join(lines))
    await up_writer.drain()
    await asyncio.gather(pipe(client_reader, up_writer), pipe(up_reader, client_writer))


async def main():
    server = await asyncio.start_server(handle, "127.0.0.1", 8899)
    async with server:
        await server.serve_forever()


if __name__ == "__main__":
    asyncio.run(main())
```

## Selenium을 포워더에 어떻게 지정하나요?

한 터미널에서 `forwarder.py`를 시작한 다음, 로컬 프록시 주소로 Selenium 스크립트를 실행하세요. Selenium 4.6 이상에 내장된 Selenium Manager가 맞는 ChromeDriver를 다운로드하므로 별도 설치가 필요 없습니다.

*selenium_example.py*

```python
from selenium import webdriver
from selenium.webdriver.common.by import By

options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://127.0.0.1:8899")  # the local forwarder
options.add_argument("--headless=new")

driver = webdriver.Chrome(options=options)
try:
    driver.set_page_load_timeout(60)
    driver.get("https://api.ipify.org")
    print("exit IP:", driver.find_element(By.TAG_NAME, "body").text)
finally:
    driver.quit()
```

## Selenium 세션마다 IP를 하나씩 받거나 페이지마다 새 IP를 받으려면?

포워더는 주어진 사용자명대로 작동하므로, 세션 동작은 사용자명으로 결정됩니다:

- **연결당 회전:** 세션 부분(`USERNAME-country-us`)을 빼세요. Chrome은 페이지당 여러 연결을 열어 한 페이지가 여러 출구를 통해 로드될 수 있습니다.
- **Selenium 세션당 하나의 IP:** 포워더 시작 전에 `CRAWLRELAY_USER`을 `USERNAME-country-us-session-run42-ttl-30`로 설정하세요. 이후 모든 연결이 최대 30분 동안 같은 IP를 사용하며, 조기 변경 가능성은 있습니다.
- **병행 세션 여러 개:** 각 세션마다 8899, 8900 등 다른 로컬 포트에서 포워더를 실행하고 각 WebDriver에 해당 포트를 지정하세요.

## selenium-wire나 브라우저 확장 기능은 어떤가요?

트래픽을 가로채서 프록시 인증을 도입했던 인기 패키지 selenium-wire는 2024년 1월 작성자가 저장소를 아카이브하며 더 이상 업데이트되지 않습니다. 프록시 인증 요청을 처리하는 브라우저 확장도 작동하지만, 각 프로필에 설치해야 합니다. 위 포워더는 의존성이 없고 Selenium이 제어하는 모든 브라우저와 호환됩니다. 새 프로젝트는 [Playwright](https://crawlrelay.com/ko/docs/playwright/)가 더 간편하며 프록시 사용자명과 비밀번호를 직접 받습니다.

## Selenium과 프록시에 관한 질문들

### Selenium에서 프록시를 쓰면 Chrome이 로그인 팝업을 보여주는 이유는?

프록시가 인증을 요청했으나 Chrome에 자격 증명이 없기 때문입니다. `--proxy-server` 플래그는 호스트와 포트만 인수로 받습니다. 헤드리스 모드에선 같은 문제가 `ERR_TUNNEL_CONNECTION_FAILED`로 나타납니다. 자격 증명을 추가하는 로컬 포워더를 쓰거나, 사용자명과 비밀번호를 허용하는 Playwright를 사용하세요.

### 포워더가 스크래핑 속도를 늦추나요?

거의 아닙니다. 포워더는 두 개의 로컬 소켓과 하나의 원격 소켓 간에 바이트를 복사할 뿐, 암호를 해독하지 않습니다. 페이지 로딩 시간은 레지덴셜 출구와 대상 사이트 성능에 따라 결정되며, 같은 머신에서 실행되는 포워더는 영향을 주지 않습니다.

### Selenium에서 Chrome 대신 Firefox를 사용할 수 있나요?

예. `FirefoxOptions`를 통해 Firefox 프록시 설정을 다음과 같이 하세요: `network.proxy.type`은 1로, `network.proxy.http`와 `network.proxy.ssl`은 8899번 포트를 포함한 `127.0.0.1`로 설정합니다. 포워더를 항상 앞에 두세요. Firefox는 프록시 인증 대화상자를 띄우며, Selenium이 이를 신뢰할 만하게 채우지 못합니다.

### 포워더 내에서 비밀번호가 안전한가요?

포워더가 `127.0.0.1`에서 수신 대기하는 동안은 당신의 머신에만 남아 있습니다. 환경 변수에서 읽고 절대 커밋하지 마세요. 유출된 비밀번호로 전체 요금제가 소진되지 않도록 스크래퍼마다 트래픽 한도가 있는 별도 서브 유저를 사용하세요.

**Selenium에 레지덴셜 프록시 출구를 적용하세요** US$1.50는 테스트용 1 GB, US$0.50/GB는 50 GB에서 왔습니다. [가격 확인](https://crawlrelay.com/ko/pricing/) · [Playwright 가이드](https://crawlrelay.com/ko/docs/playwright/)

---

CrawlRelay: CrawlRelay는 개발자 중심의 회전형 레지덴셜 프록시 및 4G/5G 모바일 프록시 서비스로, 스크래퍼와 AI 데이터 파이프라인을 위한 비만료 선불 과금 트래픽을 US$0.50/GB부터 암호화폐로 결제하며 신분증 업로드가 없습니다. KYC 없이 — 신분증, 셀카, 문서 없이 이용 가능. 암호화폐로 결제하세요.
