레지덴셜 프록시

레지덴셜 프록시 사용 시 지연 시간 줄이기

레지덴셜 프록시에는 지연 시간의 하한선이 존재하지만, 개발자들이 불평하는 느림의 대부분은 피할 수 있는 것이다. 프록시 지연 시간을 줄이는 여덟 가지 기법을 영향력 순으로 정리했다.

Chris Collins

Chris Collins

2026년 7월 16일 · 7 분 소요

레지덴셜 프록시는 직접 연결보다 느리며, 이는 버그가 아닙니다. 트래픽이 실제 가정용 네트워크의 실제 소비자 기기를 경유하며, 이것이 바로 실사용자 신뢰를 사는 방법이고, 여기에 밀리초 단위의 비용이 듭니다. 바닥선이 존재하며, 어떤 튜닝으로도 이 아래로는 내려갈 수 없습니다.

하지만 대부분의 성능 불만이 놓치는 지점이 있습니다: 사람들이 씨름하는 지연 시간의 대부분은 바닥선이 아니라 스스로 추가한 오버헤드입니다. 매 요청마다 재핸드셰이크하는 것, 과도하게 제한된 지역 필터, 지나치게 큰 페이로드, 재시도 폭주는 일반적으로 레지덴셜 홉 자체보다 훨씬 큰 비용을 초래합니다. 이 가이드는 줄일 수 없는 것과 줄일 수 있는 것을 구분하고, 실제로 수치를 움직이는 기법들을 대략 영향력 순으로 설명합니다.

먼저, 시간이 어디로 가는지 파악하기

프록시를 거치는 요청은 클라이언트 → 게이트웨이 → 종료 기기 → 대상, 그리고 다시 돌아오는 체인입니다. 시간은 네 가지로 나뉩니다:

  • 연결 설정 — 게이트웨이로의 TCP 핸드셰이크, CONNECT 터널, 그다음 대상으로의 TLS 핸드셰이크. 이는 보통 가장 큰 회피 가능한 비용이며, 새 연결을 맺을 때마다 다시 지불하게 됩니다.
  • 레지덴셜 홉 — 실제 소비자 기기와 그 가정용 네트워크. 이것이 바닥선입니다. 기기와 네트워크 품질에 따라 달라지며, 튜닝으로 없앨 수 없습니다.
  • 대상 응답 시간 — 사이트 자체가 얼마나 걸리는지. 프록시의 잘못이 아니며, 다른 것을 탓하기 전에 분리해서 확인할 가치가 있습니다.
  • 재시도 — 차단되거나 시간 초과된 요청을 재시도해야 하면 자체 지연 시간만 소모하는 것이 아니라 실질적인 지연 시간을 배가시킵니다.

두 번째 항목만 고정되어 있습니다. 나머지 세 가지는 여러분이 최적화할 수 있는 영역입니다.

1. 연결 재사용 (가장 큰 단일 승리 요소)

새로운 연결은 매번 프록시를 거치는 전체 핸드셰이크 체인을 지불하며, 이는 실제 요청 자체를 쉽게 압도할 수 있습니다. 코드가 요청마다 새 연결을 생성한다면, 이 비용을 계속 반복해서 지불하는 것입니다.

일회성 호출 대신 연결 풀링이 있는 세션이나 클라이언트를 사용하세요:

import os, requests
USER, PASS = os.environ["SHIFTER_USER"], os.environ["SHIFTER_PASS"]
# Sticky session so the pooled connection stays on one exit IP
proxy_url = f"http://{USER}-country-us-sid-job1-ttl-600:{PASS}@p.shifter.io:443"
proxies = {"http": proxy_url, "https": proxy_url}
with requests.Session() as s: # pools + reuses connections
s.proxies.update(proxies)
for url in urls:
r = s.get(url, timeout=30) # handshake paid once, not per request

이해해 둘 가치가 있는 함정: 로테이션과 연결 재사용은 서로 상충합니다. 매 요청마다 새 IP로 로테이션하면 매 요청이 새 연결이자 새 핸드셰이크가 됩니다. 요청 단위 로테이션이 필요할 때는 괜찮지만, 로테이션을 지연 시간으로 사고 있다는 점을 인식해야 합니다.

2. 작업 특성이 허용하는 경우 고정 세션 사용

위 내용에 이어서: 고정 세션(sid + ttl)은 하나의 종료 IP에 고정시키며, 이것이 풀링된 연결을 실제로 재사용 가능하게 만드는 요인입니다. 매 요청 사이가 아니라 작업, 대상, 신원 등 논리적 작업 단위 사이에서 로테이션하세요.

여러 요청에 걸친 흐름이 어차피 하나의 사용자처럼 보여야 한다면(결과 페이지네이션, 다단계 페이지), 고정 방식은 올바른 동작이자 동시에 더 빠른 방식입니다. 적절한 모드 선택은 고정 vs 로테이팅 레지덴셜 프록시를 참고하세요.

3. 더 빠른 요청을 좇기보다 동시성으로 확장하기

요청당 레지덴셜 지연 시간에는 바닥선이 있으므로, 처리량을 움직이는 방법은 단일 호출의 밀리초를 깎는 것이 아니라 병렬화입니다. 비동기 방식은 마이크로 최적화보다 훨씬 큰 효과를 줍니다:

import asyncio, httpx
async def fetch(client, url):
r = await client.get(url, timeout=30)
return r.status_code
async def main(urls):
async with httpx.AsyncClient(proxy=proxy_url) as client: # reused connections
return await asyncio.gather(*(fetch(client, u) for u in urls))

하지만 무턱대고 동시성을 늘리지 마세요. 한 대상에 대한 병렬 요청이 너무 많으면 속도 제한과 행동 탐지에 걸리고, 차단은 절약한 동시성보다 훨씬 큰 지연 시간(재시도로 인한) 비용을 초래합니다. 대상이 견디는 수준을 찾아 그 아래에 머무르세요.

4. 지역 필터를 과도하게 제한하지 말 것

각 타겟팅 플래그는 자격을 갖춘 종료 IP의 풀을 좁힙니다. country + city + asn을 겹쳐 쌓으면 작은 집합에서 선택하게 될 수 있으며, 이는 더 적고 어쩌면 더 느린 기기, 더 많은 실패, 더 많은 재시도를 의미합니다. 데이터가 실제로 필요로 하지 않는 필터는 완화하세요.

단서 조항: 사용 사례가 데이터의 정확성을 위해 특정 위치를 진정으로 요구한다면, 유지하세요. 정확성이 속도를 이깁니다. 빠르지만 잘못된 시장의 답은 무가치합니다(도시 단위 타겟팅이 중요할 때). 다만 사용하지도 않는 정밀도에 대해 비용을 지불하지는 마세요.

5. 더 작은 페이로드가 더 빠른 페이로드

여기서 지연 시간과 대역폭 최적화는 같은 작업입니다: 회선을 통과하는 바이트가 적을수록 전송 시간이 짧아집니다. HTML이나 JSON 엔드포인트에 원하는 데이터가 있으면 브라우저 렌더링을 건너뛰고, 렌더링이 반드시 필요할 때는 이미지/미디어/폰트를 차단하고, 압축을 계속 켜두세요. 전체 목록은 프록시 대역폭 비용을 줄이는 방법에 있으며, 거기 나온 모든 항목은 요청 시간뿐 아니라 비용도 줄여줍니다.

6. 타임아웃을 설정하고 빠르게 실패하기

정체된 요청은 워커를 붙잡아 두고 꼬리 지연 시간을 늘립니다. 명시적인 연결 및 읽기 타임아웃을 설정하고, 무언가 멈추면 기본값 60초를 기다리기보다 포기하고 새 IP로 재시도하세요. 나쁜 종료 지점에서 빠르게 실패하는 것이 회복을 기대하는 것보다 거의 항상 더 빠릅니다.

7. 차단되지 않음으로써 재시도 줄이기

이것이 숨은 요인입니다. 차단되어 재시도되는 요청은 한 번이 아니라 두세 번의 왕복 시간을 소모하므로, 실질적인 지연 시간은 측정된 요청당 지연 시간보다 훨씬 나쁩니다. 차단율을 낮추는 것은 곧 지연 시간 최적화입니다: 품질 좋은 IP를 사용하고, 사실적인 헤더와 일치하는 핑거프린트를 보내고, 합리적으로 속도를 조절하세요. 스크래퍼가 차단되는 이유차단을 피하는 방법을 참고하세요.

8. 백분위수를 측정하고, 대상을 분리하기

볼 수 있는 것을 최적화하세요. 평균이 아니라 p50과 p95를 추적하세요. 동시 워커를 정체시키는 것은 꼬리 부분이며, 실제 대상과 함께 빠른 중립 엔드포인트의 시간을 측정하여 프록시 오버헤드와 대상의 느림을 분리하세요. 그 방법은 레지덴셜 프록시 속도, 성공률, 위치 정확도 테스트 방법에 있습니다. 이 구분 없이는 대상이 느린 부분이었는데도 일주일 동안 프록시를 튜닝하게 될 수 있습니다.

고칠 수 없는 것과 그에 대한 대처법

레지덴셜 홉은 바닥선입니다. 완벽하게 튜닝하더라도 레지덴셜은 데이터센터의 p50과 맞먹지 못합니다. 실제 소비자 기기가 설계상 경로에 있기 때문입니다. 그것이 트레이드오프입니다: 방어된 대상에서 실제 페이지를 얻게 해주는 신뢰를 위해 지연 시간을 지불하는 것(레지덴셜 vs 데이터센터).

작업이 진정으로 더 낮고 더 일관된 지연 시간 안정적인 IP를 필요로 하고, 로테이팅 레지덴셜 풀이 필요하지 않다면, 이는 더 빠른 레지덴셜 구성이 아니라 다른 제품이 필요하다는 신호일 수 있습니다. ISP 프록시는 그 중간에 위치합니다: 레지덴셜로 등록된 주소를 가진 데이터센터급 속도입니다(중간 지점). 올바른 도구를 선택하는 것이 잘못된 도구를 과도하게 튜닝하는 것보다 낫습니다.

FAQ

레지덴셜 프록시는 왜 데이터센터 프록시보다 느린가요? 트래픽이 가정용 네트워크의 실제 소비자 기기를 경유하기 때문이며, 이는 설계상 홉을 추가합니다. 이 홉이 바로 데이터센터 IP를 차단하는 사이트에서 여러분을 진짜 사용자처럼 보이게 만드는 요소입니다. 이는 결함이 아니라 의도된 트레이드오프입니다.

레지덴셜 프록시 지연 시간을 줄이는 가장 빠른 방법은 무엇인가요? 연결을 재사용하세요. 고정 IP를 사용하는 풀링된 세션은 매 요청마다가 아니라 한 번만 TCP/TLS 핸드셰이크를 지불하며, 이는 보통 순진한 설정에서 회피 가능한 지연 시간 중 가장 큰 부분입니다.

IP를 로테이션하면 요청이 느려지나요? 네, 어느 정도는요. 새 IP는 새 연결과 새 핸드셰이크를 의미하므로, 요청 단위 로테이션은 연결 재사용을 포기하는 것입니다. 사용 사례가 허용한다면 매 요청이 아니라 논리적 작업 단위 사이에서 로테이션하세요.

더 좁은 지역 필터가 속도를 늦추나요? 그럴 수 있습니다. 모든 필터는 자격을 갖춘 풀을 좁히므로, country + city + ASN을 함께 적용하면 종료 지점이 거의 남지 않을 수 있으며, 이는 더 느린 기기와 더 많은 실패를 의미합니다. 데이터가 실제로 필요로 하는 정밀도만 유지하고 나머지는 버리세요.

프록시가 느린지 대상이 느린지 어떻게 알 수 있나요? 같은 프록시를 통해 빠르고 중립적인 엔드포인트와 실제 대상에 대해 동일한 테스트를 시간 측정하세요. 그 차이가 대략 대상 자체의 응답 시간입니다. 평균이 아니라 p50과 p95를 측정하세요.

결론

레지덴셜 프록시에는 튜닝으로 없앨 수 없는 지연 시간 바닥선이 있지만, 그 위의 거의 모든 것은 여러분의 통제 아래에 있습니다. 연결을 재사용하고, 작업이 허용하는 곳에서 고정 세션을 사용하고, 단일 요청 속도를 좇는 대신 동시성으로 확장하고, 지역을 과도하게 제한하지 말고, 페이로드를 줄이고, 정체 시 빠르게 실패하고, 무엇보다 차단되지 않도록 하세요. 재시도가 실질적인 지연 시간을 지배하기 때문입니다. 그런 다음 백분위수를 측정하여 실제로 문제를 일으키는 꼬리 부분을 최적화하세요.

이를 실행하면 레지덴셜 프록시 설정은 현실적인 상한선에 가깝게 성능을 냅니다. 그래도 고정 IP로 더 낮은 지연 시간이 필요하다면 물리 법칙과 싸우는 대신 ISP 프록시를 살펴보세요. 가격 페이지에는 여러분 자신의 작업에 대해 어느 쪽이든 테스트할 수 있는 GB당 요금제가 있습니다.

시작할 준비가 되셨나요?

205M개 이상의 IP, 195개 이상의 국가를 지원하는 Shifter의 레지덴셜 프록시를 $0.75/GB부터 이용해보세요.

시작하기