CodeGym /행동 /Python SELF KO /Proxy 사용하기

Proxy 사용하기

Python SELF KO
레벨 24, 레슨 0
사용 가능

6.1 왜 프록시가 필요할까?

요즘에는 나라별로 인터넷이 다르게 작동해. 이제는 개별 사용자가 아니라 전체 사이트, 도메인, 애플리케이션, 심지어 국가까지도 차단되고 있어. 별로 기분 좋은 일은 아니지만, 프로그래머라면 걱정할 필요 없어. 인터넷에는 프록시 서버가 넘쳐나니까...

Proxy Server (또는 그냥 프록시)는 클라이언트(예: 네 컴퓨터)와 네가 접근하려는 서버 사이에서 중재자 역할을 하는 중간 서버야. 프록시 서버는 클라이언트로부터 요청을 받고, 목표 서버로 전달하고, 응답을 받아 다시 클라이언트로 보내줘.

큰 제품들은 대개 여러 개의 프록시 서버를 가지고 있어, 여러 가지 유용한 기능을 수행하기 위해서지. 예를 들어, 이런 기능들:

  • 익명화: 프록시 서버는 클라이언트의 실제 IP 주소를 감춰서 인터넷 리소스에 익명으로 접근할 수 있게 해줘. IP 주소는 네트워크에서의 디바이스의 고유 식별자야, 이걸 숨기면 사용자의 개인정보를 보호할 수 있어.
  • 캐싱: 프록시 서버는 자주 요청되는 리소스를 캐싱할 수 있어, 접근 속도를 높이고 네트워크 리소스의 부하를 줄여줘. 예를 들어, 많은 사용자가 같은 웹 페이지를 요청하면, 프록시 서버는 그걸 저장하고 매번 원본 서버에 가지 않아도 바로 반환할 수 있어.
  • 콘텐츠 필터링: 프록시 서버는 특정 웹사이트나 콘텐츠 유형에 대한 접근을 차단하여 제어와 보안을 제공해.
  • 접근 제한 우회: 프록시 서버는 지역적인 콘텐츠 접근 제한을 우회 도와줘, 특정 지역에서 차단된 리소스에 접근할 수 있게 해주지.
  • 로그와 모니터링: 프록시 서버는 모든 요청과 응답의 로그를 기록해 네트워크 트래픽을 추적하고 분석할 수 있어.

프록시 서버 작동 원리

  • 클라이언트가 요청을 보냄: 클라이언트 장치 (예: 컴퓨터나 스마트폰)가 프록시 서버에 요청을 보냄.
  • 프록시 서버가 요청을 처리함: 프록시 서버는 요청을 받고, 그걸 수정할 수 있어 (예: 헤더 추가나 삭제) 그리고 이를 목표 서버로 전달해.
  • 목표 서버가 응답을 보냄: 목표 서버는 요청을 처리하고 프록시 서버에 응답을 보냄.
  • 프록시 서버가 클라이언트에 응답을 반환함: 프록시 서버는 목표 서버에서 응답을 받아서 나중에 사용하기 위해 캐시할 수 있고, 이를 클라이언트에게 전달해.

프록시 서버 사용의 장점

  • 보안 향상: 프록시 서버는 내부 네트워크를 외부 세계로부터 숨길 수 있어, 공격 위험을 줄여줘.
  • 접근 속도 향상: 자주 요청되는 리소스를 캐싱함으로써 접근 시간을 줄여줘.
  • 접근 제어: 프록시 서버는 특정 사이트나 콘텐츠 유형에 대한 접근을 제한하여 네트워크 사용을 제어할 수 있어.
  • 네트워크 부하 감소: 캐싱과 트래픽 필터링으로 프록시 서버는 전체 데이터 전송량과 네트워크 부하를 줄일 수 있어.

많은 서버 프로그램들은 보안을 위해 인터넷에 직접 접근하지 않아. 대신 프록시를 통해서 접근해, 그리고 그 프록시는 허용된 사이트와 리소스 목록을 가지고 있지. 그래서 네 프로그램도 프록시와 작동할 수 있어야 해.

모든 장점에도 불구하고, 프록시 서버 사용에는 단점도 있어. 예를 들어, 요청이 추가적인 단계를 거치기 때문에 연결 속도가 느려질 수 있어. 또한, 일부 사이트는 알려진 프록시 서버에서의 접근을 차단할 수 있어.

6.2 프록시와 requests 모듈

requests 라이브러리는 proxies 매개변수를 통해 프록시 서버 사용을 지원해.

HTTP (Hypertext Transfer Protocol)와 HTTPS (HTTP Secure)는 인터넷 상의 데이터 전송 프로토콜이야. HTTPS는 HTTP의 보안 버전이야. 이들은 암호화 특징 때문에 각각의 처리 요구가 다를 수 있어, 다른 프록시 서버가 사용될 수 있어.

HTTP 프록시 사용 예제

프록시로는 보통 단일 프록시가 아니라 여러 개의 프록시 리스트가 전달돼. 어떤 프록시가 차단되거나 사용 불가하게 될 경우 유용해.

프록시를 통한 requests.get() 함수 호출 예제야.


import requests

# 요청할 URL 주소
url = 'http://httpbin.org/ip'
            
# 프록시 서버 설정
proxies = { 'http': 'http://10.10.1.10:3128', 'https': 'http://10.10.1.10:1080', }
            
# 프록시를 통한 GET 요청 전송
response = requests.get(url, proxies=proxies)
            
print(response.json())
        

http 요청은 첫 번째 프록시 서버를 통해 가고, https는 두 번째 프록시 서버를 통해 가.

인증 있는 프록시 사용 예제

많은 프록시 서버는 먼저 인증을 거치고 나서야 사용 가능하게 해줘. 여기서 쓸만한 방법이 있어...

URL이 처음 만들어졌을 때, URL에 로그인과 비밀번호를 리소스에 함께 전달할 수 있도록 설계됐어. 이건 이렇게 보여:


http://user:password@domain/path

그래서 만약 프록시 서버가 인증을 요구할 경우, URL에 계정 정보를 포함시킬 수 있어.

예제:


import requests

# 요청할 URL 주소
url = 'http://httpbin.org/ip'
            
# 인증 있는 프록시 서버 설정
proxies = { 'http': 'http://user:password@10.10.1.10:3128',
    'https': 'http://user:password@10.10.1.10:1080', }
            
# 프록시를 통한 GET 요청 전송
response = requests.get(url, proxies=proxies)
            
print(response.json())
        

이런 방식이 실무에서 많이 사용되는지 보진 못했지만, 테스트용 프록시 서버를 운영할 때라면 시도해볼 수 있는 방법이지.

하지만 URL로 로그인과 비밀번호를 전달하는 것은 보안상 위험할 수 있어, URL이 브라우저 기록이나 서버 로그에 저장될 수 있기 때문이야. 실제 애플리케이션에서는 더 안전한 인증 방법을 사용하는 것이 좋겠어.

실제 애플리케이션에서 프록시 서버의 계정 정보를 안전하게 저장하는 게 중요해. 절대 코드나 설정 파일에 비밀번호를 평문으로 저장하면 안 돼. 대신 환경 변수를 사용하거나 보안 저장소를 이용해.

6.3 프록시와 http.client

http.client 모듈에서 프록시 서버를 사용하려면 연결과 요청 헤더를 수동으로 설정해야 해.

그냥 host와 port를 지정해서 연결을 생성하면 돼.

예제:


# 프록시 서버 설정
proxy_host = '10.10.1.10'
proxy_port = 3128
            
# 프록시 서버와의 연결 생성
conn = http.client.HTTPConnection(proxy_host, proxy_port)
        

그 다음 프록시 서버와의 터널을 설정한 후에야 요청을 보낼 수 있어:


dest_url = 'httpbin.org'
dest_path = '/ip'
            
# 요청 생성 및 전송
conn.set_tunnel(dest_url)
conn.request('GET', dest_path)
        

프록시 서버가 제대로 작동하는지 확인하려면, 프록시를 사용하기 전과 후의 IP 주소를 비교할 수 있어. 현재 IP 주소를 보여주는 서비스(예: httpbin.org/ip)를 사용할 수 있어.

정말 "간단"해. http.client를 사용한 HTTP 프록시 사용의 전체 예제는 다음과 같아:


import http.client

# 프록시 서버 설정
proxy_host = '10.10.1.10'
proxy_port = 3128
dest_url = 'httpbin.org'
dest_path = '/ip'
            
# 프록시 서버와의 연결 생성
conn = http.client.HTTPConnection(proxy_host, proxy_port)
            
# 요청 생성 및 전송
conn.set_tunnel(dest_url)
conn.request('GET', dest_path)
            
# 응답 받기
response = conn.getresponse()
print(response.status, response.reason)
print(response.read().decode('utf-8'))
            
# 연결 닫기
conn.close()
        

뭐랄까? requests 모듈을 사용하는 게 확실히 더 간단해. 하지만! 많은 모듈과 프레임워크는 실제로는 저 수준의 http.client를 사용하고 있어. 이걸 알아야 그들의 작업을 적절히 설정할 수 있어.

모든 장점에도 불구하고, 프록시 서버 사용에는 단점도 있어. 예를 들어, 요청이 추가적인 단계를 거치기 때문에 연결 속도가 느려질 수 있어. 또한, 일부 사이트는 알려진 프록시 서버에서의 접근을 차단할 수 있어. 그래서 프록시를 사용할 때는 항상 그 장점뿐만 아니라 잠재적 제한도 고려해야 해.

2
과제
Python SELF KO, 레벨 24, 레슨 0
잠금
requests 모듈을 사용하여 프록시 서버 활용하기
requests 모듈을 사용하여 프록시 서버 활용하기
2
과제
Python SELF KO, 레벨 24, 레슨 0
잠금
http.client 모듈을 사용한 프록시 서버 사용
http.client 모듈을 사용한 프록시 서버 사용
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION