KYC 없이 — 신분증, 셀카, 문서 없이. 암호화폐로 결제: BTC, USDT, USDC, ETH, SOL, LTC
언어: 한국어
시작하기

프록시 오류 참조 · HTTP 상태 코드

407 Proxy Authentication Required: 의미와 해결 방법

HTTP 상태 코드 (4xx, 클라이언트 오류): 각 도구에서 정확한 메시지, 가능한 원인들의 순서, 그리고 효과적인 해결 방법.

마지막 업데이트: · 4 분 읽기

빠른 답변

프록시에서 407 Proxy Authentication Required는 무엇을 의미하나요?

407 Proxy Authentication Required는 프록시가 자격 증명을 받지 못했거나 잘못 받았기 때문에 요청을 거부한 것을 의미합니다. 대상 웹사이트에는 절대 연결되지 않았습니다. CrawlRelay 레지던셜 프록시의 경우, 대시보드에 표시된 사용자 이름, 비밀번호 일치 여부, 그리고 어느 쪽에든 특수 문자가 있을 경우 URL 인코딩 되었는지를 꼭 확인하세요. 같은 요청을 반복해도 407은 해결되지 않습니다.

407 Proxy Authentication Required 한눈에 보기

오류407 Proxy Authentication Required
유형HTTP 상태 코드 (4xx, 클라이언트 오류)
전송 주체프록시 게이트웨이이며, 목표 웹사이트가 절대 아님
정의 위치RFC 9110, section 15.5.8 (headers: Proxy-Authenticate 11.7.1, Proxy-Authorization 11.7.2)
다시 시도할까요?아닙니다. 동일한 자격 증명으로 다시 실패하니 먼저 수정하세요
먼저 확인하세요아래 curl 테스트를 사용자 이름만으로, 타겟팅 매개변수 없이 실행하세요

407 Proxy Authentication Required가 무엇을 의미하나요?

407 오류는 당신이 도달하려는 사이트가 아니라 프록시에서 발생합니다. RFC 9110에서는 이를 401의 프록시 버전으로 설명하며, 클라이언트가 프록시와 먼저 인증해야 합니다. 프록시는 거의 항상 Basic 인증 방식을 명시하는 Proxy-Authenticate 헤더를 보냅니다. 클라이언트는 Base64로 인코딩된 username:password를 포함한 Proxy-Authorization 헤더로 응답합니다.

HTTPS 대상의 경우, 407은 터널을 여는 CONNECT 요청에 대한 응답으로 도착합니다. 그래서 많은 라이브러리에서 407을 HTTP 상태가 아니라 터널 혹은 연결 에러로 보고하는 이유입니다: 웹사이트와 TLS 세션이 절대 시작되지 않았기 때문입니다.

Python, curl, Node.js, 브라우저에서 a 407는 어떻게 나타나나요?

같은 실패가 도구마다 다르게 출력됩니다. 로그에서 검색할 메시지들:

  • Python requests: ProxyError('Unable to connect to proxy', OSError('Tunnel connection failed: 407 Proxy Authentication Required'))
  • curl: curl: (56) CONNECT tunnel failed, response 407
  • Scrapy: TunnelError: Could not open CONNECT tunnel with proxy ... [{'status': 407, 'reason': b'Proxy Authentication Required'}]
  • Chrome, Playwright, Puppeteer: net::ERR_TUNNEL_CONNECTION_FAILED 또는 보이는 브라우저의 로그인 팝업
  • http:// 대상의 Node.js 클라이언트: Request failed with status code 407

a 407의 원인은 무엇인가요?

가장 가능성 높은 첫 번째 원인:

  • 잘못된 사용자 이름이나 비밀번호. 오타, 초기화 후 옛 비밀번호 사용, 또는 다른 서브 사용자의 자격 증명일 수 있습니다.
  • 인코딩되지 않은 특수 문자. 비밀번호에 @, :, / 또는 #가 들어가면 user:pass@host URL이 깨집니다. 퍼센트 인코딩하세요: @는 %40가 되고, :는 %3A가 됩니다.
  • 잘못된 타겟팅 접미사. 사용자 이름에서 타겟팅 정보를 읽는 게이트웨이는 하나의 긴 사용자 이름으로 인식합니다. 키나 국가 코드의 오타는 프록시가 모르는 사용자 이름이 됩니다.
  • 코드 내에서 절대 나가지 않는 자격 증명. Chrome은 --proxy-server 내부에 작성된 사용자 이름과 비밀번호를 무시합니다. Puppeteer는 page.authenticate()가 필요하고 Selenium은 로컬 포워더가 필요합니다.
  • 잔액 부족. 디버그 전 반드시 계정에 트래픽이 남아있는지 확인하세요.

a 407를 단계별로 진단하는 방법은?

  1. curl로 타겟팅 없이 자격 증명을 테스트하세요 (아래 명령어). verbose 출력에 HTTP/1.1 407 문구가 뜨면 자격 증명 문제입니다.
  2. 타겟팅 매개변수를 하나씩 추가하며 테스트를 반복하세요.
  3. 프로그램이 실제로 구축한 프록시 URL을 비밀번호를 가린 상태로 로그에 남기고 대시보드와 글자 단위로 비교하세요.
  4. curl이 성공하고 프로그램이 실패하면 라이브러리가 자격 증명을 보내지 않는 것입니다. 아래 도구별 해결법을 참조하세요.
curl로 실패한 URL 테스트하기(HTTP 포트, 상세 모드)
# Use the URL that fails; with https://api.ipify.org instead, you test the gateway alone.
# "HTTP/1.1 200 Connection established" first, then the site's own status: the site answered.
curl -v -x http://USERNAME:[email protected]:7777 https://TARGET_URL

# Same test through the SOCKS5 port, with DNS resolved at the exit
curl -v --socks5-hostname gw.crawlrelay.com:7778 --proxy-user USERNAME:PASSWORD https://TARGET_URL

a 407를 어떻게 고치나요?

  • Python에서는 URL을 만들기 전에 urllib.parse.quote(value, safe='')로, JavaScript에서는 encodeURIComponent()로 자격 증명을 인코딩하세요.
  • 브라우저는 Playwright의 proxy 옵션에 username와 password를 넣어 통과시키고, Puppeteer에서는 page.authenticate()를 호출하며 Selenium은 로컬 포워더를 사용합니다. Playwright 및 Puppeteer](/docs/puppeteer/) 가이드 참고]
  • 환경 변수 HTTPS_PROXY를 설정했다면 셸에서 값 전체를 인용 부호로 감싸 @와 $가 유지되게 하세요.
  • 누출이 의심되면 대시보드에서 비밀번호를 변경하고 해당 비밀번호를 사용하는 모든 스크레이퍼를 업데이트하세요.
Python: 인코딩된 자격 증명으로 프록시 URL 빌드하기
from urllib.parse import quote

import requests

user = "USERNAME-country-us"
password = "p@ss:word/1"  # example containing special characters

# safe="" also encodes "/", "@" and ":" inside the credentials
proxy = "http://{}:{}@gw.crawlrelay.com:7777".format(
    quote(user, safe=""), quote(password, safe="")
)
proxies = {"http": proxy, "https": proxy}  # http:// for both keys

r = requests.get("https://api.ipify.org", proxies=proxies, timeout=(10, 30))
print(r.status_code, r.text)
Playwright (Python): 자격 증명을 별도 필드로 설정하기
from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(proxy={
        "server": "http://gw.crawlrelay.com:7777",
        "username": "USERNAME-country-us",
        "password": "PASSWORD",
    })
    page = browser.new_page()
    response = page.goto("https://api.ipify.org")
    print(response.status, page.inner_text("body"))
    browser.close()

a 407 이후에 다시 시도해야 하나요?

407은 자동으로 재시도하지 마세요. 같은 자격 증명으로 재시도하면 항상 같은 결과가 나옵니다. 무작정 재시도하면 로그만 가득 차므로 407은 설정 오류로 간주하세요: 작업을 멈추고 자격 증명을 수정한 후 재시작하세요. 며칠 간 문제없이 작동하던 작업에서 갑자기 407이 뜨면 비밀번호가 바뀌었거나 서브 사용자가 비활성화된 경우일 가능성이 큽니다.

407 Proxy Authentication Required가 CrawlRelay에 어떻게 적용되나요?

CrawlRelay 게이트웨이는 신규 연결마다 사용자 이름과 비밀번호를 읽습니다. 타겟팅과 세션 설정이 사용자 이름에 있기 때문에 접미사가 망가지면 유효한 비밀번호라도 실패할 수 있습니다. 사용자 이름 생성 함수는 한 곳에 모아 시작 시 출력 로그를 남기세요. 빠른 시작 페이지에서 정확한 형식을 확인할 수 있습니다.

게이트웨이: gw.crawlrelay.com, 포트 7777 (CONNECT를 통한 HTTP, HTTPS) 및 포트 7778 (SOCKS5). 사용자 이름 형식: USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}. 관련: 401 vs 407 · ERR_TUNNEL_CONNECTION_FAILED · Cannot connect to proxy.

407 Proxy Authentication Required: 개발자들이 묻는 질문들

407은 제가 크롤링하는 웹사이트가 보낸 건가요?

아닙니다. 407은 항상 당신과 웹사이트 사이에 있는 프록시에서 보내는 응답입니다. 요청이 웹사이트에 도달하지 않았으므로 사이트는 당신의 트래픽을 볼 수도, 계산할 수도, 차단할 수도 없습니다. 만약 사이트에서 로그인을 원했다면 401을 보냈을 것입니다. 프록시 자격 증명을 고치면 407이 없어집니다.

curl은 같은 프록시로 작동하는데 제 코드는 왜 407이 나오나요?

라이브러리가 자격 증명을 보내지 않거나 다른 형식으로 보내는 것입니다. 일반적인 원인은 브라우저 플래그에 입력한 자격 증명을 무시당하거나, 특수 문자가 포함된 환경 변수가 깨졌거나, 비밀번호가 URL 인코딩되지 않았기 때문입니다. 프로그램이 만드는 프록시 URL을 비밀번호를 가리고 출력해서 curl 명령어와 비교하세요.

407이 제 트래픽을 차감하나요?

407 응답은 수백 바이트 정도에 불과하며 요청은 대상에 도달하지 않으니 페이지가 다운로드되지 않습니다. 비용은 여기에 있지 않고, 407 재시도 루프에 걸린 스크레이퍼가 시간과 로그를 낭비하는 데 있습니다. 407은 오류 처리에서 반드시 작업을 중단해야 하는 신호로 삼으세요.

이 참조에서 다른 프록시 오류들

HTTP 상태 코드

브라우저 및 클라이언트 오류

연결 및 TLS 오류

실패 사례를 다루는 문서가 있는 레지덴셜 프록시들

US$0.50/GB의 레지덴셜 프록시 CrawlRelay개, 트래픽이 절대 만료되지 않음.

US$0.50/GB 부터 · KYC 없이

시작하기