C#을 사용한 .NET에서 HttpClient로 프록시 설정하는 방법

이 단계별 가이드로 C# HttpClient 프록시 통합을 마스터하세요. 안전한 웹 요청을 위한 설정, 인증, SSL 처리 및 IP 로테이션을 배웁니다.
3 분 읽기
How to Set a Proxy Using HttpClient blog image

이 HttpClient C# 프록시 통합 가이드를 마치면 다음을 알게 됩니다:

  • HttpClient의 정의와 .NET에서 HTTP 요청을 수행하는 역할
  • C#에서 프록시를 사용해야 하는 이유
  • HttpClient에서 프록시를 설정하는 방법
  • HttpClient에서 프록시 인증, SSL 인증서 오류 및 IP 로테이션 처리 방법

자, 시작해 보겠습니다!

.NET에서 HttpClient란 무엇인가?

HttpClient는.NET에서 HTTP 요청을 생성하고 HTTP 응답을 수신하기 위한 클래스입니다. System.Net.Http 네임스페이스의 일부로, .NET(따라서 C#)의 기본 HTTP 클라이언트를 나타냅니다.

HttpClient는 다음을 지원합니다:

  • 모든 HTTP 메서드(GET, POST, PUT, PATCH, DELETE 포함)
  • 비동기 통신
  • 헤더 및 쿠키 사용자 정의
  • 요청 본문 사용자 지정
  • 프록시 통합

이러한 기능과 .NET 표준 라이브러리의 공식 지원 덕분에 HttpClient는 C#에서 HTTP 요청을 수행할 때 널리 사용되는 선택지가 되었습니다.

C# HttpClient에서 프록시를 설정해야 하는 이유

웹 스크래핑, 데이터 수집 또는 기타 인터넷 관련 작업을 수행할 때 온라인 신원을 보호하는 것이 중요합니다. 이를 달성하는 한 가지 방법은 프록시 서버를 통해 트래픽을 라우팅하는 것입니다.

프록시 서버는 사용자와 대상 사이트 사이의 중개자 역할을 하여 HttpClient에 다음과 같은 이점을 제공합니다:

  • 숨겨진 IP 및 위치: 대상 서버는 사용자의 IP가 아닌 프록시 서버의 IP를 확인합니다.
  • 기밀성 강화: 프록시는 실제 신원을 가려 추적을 어렵게 함으로써 프라이버시 계층을 추가합니다.
  • IP 차단 회피: 프록시는 속도 제한을 우회하는 데 도움이 되며, 이는 C#을 사용한 웹 스크래핑의 기본입니다.
  • 지역 제한 우회: 특정 지역에 위치한 프록시 서버를 사용하여 집에서 지역 제한 콘텐츠에 접근할 수 있습니다.

따라서 HttpClient에서 프록시를 사용하면 온라인 보안을 강화할 뿐만 아니라 스크래핑 작업의 안정성도 높일 수 있습니다.

C#에서 HttpClient로 프록시 설정하기: 단계별 가이드

C#을 사용하여 .NET의 HttpClient에 프록시를 통합하는 방법을 알아보려면 아래 단계를 따르십시오.

필수 구성 요소

시작하기 전에 다음 전제 조건을 충족하는지 확인하십시오.

필요한 도구가 없는 경우 위 링크를 통해 다운로드하고 설치 마법사를 따르십시오.

1단계: 프로젝트 설정

.NET 프로젝트용 새 폴더를 생성하고 터미널에서 다음 명령어로 해당 폴더로 이동하세요:

mkdir httpclient-proxy
cd httpclient-proxy

다음으로 해당 폴더 내에서 새 .NET 콘솔 애플리케이션을 초기화합니다:

dotnet run console

출력 결과는 다음과 같아야 합니다:

"Console App" 템플릿이 성공적으로 생성되었습니다.

이제 IDE에서 프로젝트 폴더를 엽니다:

Program.cs in your C# Project

템플릿이 생성한 파일들이 표시되며, 그중 Program.cs가 가장 중요합니다. 현재는 간단한 “Hello, World!” 스크립트가 포함되어 있습니다. 이 섹션이 끝날 때쯤에는 C# HttpClient 프록시 통합 스크립트로 바뀔 것입니다.

모든 것이 예상대로 작동하는지 확인하려면 다음 명령으로 C# 애플리케이션을 실행해 보세요:

dotnet run

결과는 다음과 같아야 합니다:

Hello, World!

훌륭합니다! 이제 Visual Studio Code에서 작동하는 C# 프로젝트를 갖게 되었습니다.

2단계: HttpClient 설정

HttpClient를 사용하여 요청을 보내려면 Program.cs 에 다음 코드 줄을 추가하세요:

using System.Net;

class Program
{
  static async Task Main()
  {
    // HttpClient 인스턴스 초기화
    using HttpClient client = new HttpClient();

    // 대상 URL
    string url = "https://httpbin.org/ip";

    // 해당 엔드포인트로 비동기 GET 요청 전송
    HttpResponseMessage response = await client.GetAsync(url);

    // 응답 내용을 문자열로 읽기
    string responseBody = await response.Content.ReadAsStringAsync();

    // 콘솔에 응답 출력
    Console.WriteLine(responseBody);
  }
}

이 코드 조각은 HttpClient 인스턴스를 초기화하고 GetAsync() 메서드를 사용하여 HTTPBin.io 프로젝트의 /ip GET 엔드포인트에 연결합니다. 해당 API는 호출자의 IP 주소를 반환하므로 프록시 통합이 예상대로 작동하는지 확인하기에 완벽한 대상입니다. 이유는 무엇일까요? HttpClient에 프록시를 통합하면 /ip 엔드포인트가 반환하는 IP는 원래 IP와 달라야 하기 때문입니다.

스크립트를 실행하면 다음과 같은 출력이 표시됩니다:

{
  "origin": "55.17.80.196"
}

'origin'에 포함된 IP 주소가 바로 여러분의 출구 IP입니다.

대단하네요! 이제 유효한 프록시 URL을 구할 차례입니다.

3단계: 프록시 가져오기

HttpClient에 프록시를 통합하려면 먼저 프록시 서버에 접근할 수 있어야 합니다.

많은 온라인 포털에서 무료 프록시 URL을 제공하지만 주의하세요—프록시 인프라 운영은 비용이 많이 듭니다. 무료 프록시를 제공하는 서비스의 비즈니스 모델이 무엇인지 고려해 보세요. 종종 데이터 도용이나 기타 의심스러운 관행을 할 수 있습니다.

이러한 이유로 무료 프록시는 학습 목적으로만 사용하고 실제 운영 환경에서는 피하는 것이 가장 좋습니다!

신뢰할 수 있는 프록시가 필요하다면 무료 체험판이나 제한된 무료 플랜을 제공하는 평판 좋은 공급자를 고려하세요. 예를 들어, 저희 무료 프록시를 사용해 볼 수 있습니다.

일반적인 프록시 URL 형식은 다음과 같습니다:

<프로토콜>://<호스트>:<포트>

여기서:

  • protocol은 프록시 유형을 지정합니다(예: http, https, socks5 등)
  • host: 프록시 서버의 도메인 또는 IP 주소
  • port: 트래픽이 전달되는 포트 번호

이 예시에서는 프록시 URL이 다음과 같다고 가정합니다:

http://66.29.154.103:3128

이를 Program.cs의 변수에 저장합니다:

string proxyUrl = "http://66.29.154.103:3128";

이제 HttpClient에서 프록시를 사용하는 방법을 살펴보겠습니다!

단계 #4: 프록시 통합

HttpClient는 HttpClientHandler 클래스를 통해 프록시를 지정할 수 있게 합니다. 이는 HttpClient 인스턴스가 보내는 HTTP 요청에 대한 저수준 제어를 제공합니다.

특히 HttpClientHandler에는 프록시 서버 설정을 포함하는 WebProxy 객체를 받아들이는 Proxy 속성이 있습니다:

WebProxy proxy = new WebProxy
{
  Address = new Uri(proxyUrl),
};

그런 다음 프록시를 HttpClientHandler 인스턴스에 전달합니다:

HttpClientHandler handler = new HttpClientHandler
{
    Proxy = proxy,
};

마지막으로 HttpClientHandler를 HttpClient 생성자에 전달합니다:

using HttpClient client = new HttpClient(handler);

훌륭합니다! HttpClient C# 프록시 통합 완료.

단계 #5: 모든 것을 통합하기

최종 HttpClient 프록시 통합 스크립트에는 다음이 포함되어야 합니다:

using System.Net;

class Program
{
  static async Task Main()
  {
    // 새 프록시 객체 초기화
    string proxyUrl = "http://66.29.154.103:3128"; // 유효한 프록시 URL로 대체
    WebProxy proxy = new WebProxy
    {
      Address = new Uri(proxyUrl),
    };

    // 지정된 프록시를 사용하는 HTTP 클라이언트 핸들러 정의
    HttpClientHandler handler = new HttpClientHandler
    {
      Proxy = proxy,
    };

    // 프록시 통합된 HttpClient 인스턴스 초기화
    using HttpClient client = new HttpClient(handler);

    // 대상 URL
    string url = "https://httpbin.org/ip";

    // 엔드포인트에 비동기 GET 요청 전송
    HttpResponseMessage response = await client.GetAsync(url);

    // 응답 내용을 문자열로 읽기
    string responseBody = await response.Content.ReadAsStringAsync();

    // 콘솔에 응답 출력
    Console.WriteLine(responseBody);
  }
}

스크립트 실행:

dotnet run

결과는 다음과 같아야 합니다:

{
  "origin": "66.29.154.103"
}

/ip 엔드포인트 응답의 origin 속성은 프록시 서버의 IP 주소를 표시합니다. 이는 실제 IP가 프록시 뒤에 성공적으로 숨겨졌음을 확인시켜 줍니다.

경고: 무료 프록시 서버는 일반적으로 수명이 짧고 신뢰할 수 없습니다. 이 가이드를 읽는 시점에는 선택한 프록시가 더 이상 작동하지 않을 수 있습니다. 코드를 테스트하려면 스크립트 실행 전에 proxyUrl을 유효하고 작동하는 프록시 URL로 교체하십시오.

HttpClient 프록시 통합 고급 사용 사례

지금까지 C#에서 HttpClient를 사용한 프록시 통합의 기본 사항을 배웠지만, 고려해야 할 다른 고급 시나리오도 있습니다.

프록시 인증

프리미엄 프록시는 인증을 통해 보호되어 권한 있는 사용자만 접근할 수 있습니다. 특히 인증된 프록시의 URL은 다음과 같은 형식을 따릅니다:

<프로토콜>://<사용자명>:<비밀번호>@<호스트>:<포트>

여기서 username과 password는 인증에 사용되는 자격 증명입니다.

HttpClient에서는 WebProxy의 Credentials 속성을 사용하여 프록시 인증을 처리합니다. 이 속성은 다음과 같이 NetworkCredential 객체를 받아들입니다:

WebProxy proxy = new WebProxy
{
  Address = new Uri(proxyUrl),
  // 프록시 인증 지정
  Credentials = new NetworkCredential("<username>", "<password>"),
};

인증된 프록시 URL에서 <username><password> 를 추출하여 위 코드에서 해당 부분을 대체하십시오.

따라서 인증된 프록시 통합 코드는 다음과 같습니다:

using System.Net;

class Program
{
  static async Task Main()
  {
    // 새 프록시 객체 초기화
    string proxyUrl = "<프로토콜>://<호스트>:<포트>";
    WebProxy proxy = new WebProxy
    {
      Address = new Uri(proxyUrl),
      // 프록시 인증 지정
      Credentials = new NetworkCredential("<username>", "<password>"),
    };

    // 지정된 프록시를 사용하는 HTTP 클라이언트 핸들러 정의
    HttpClientHandler handler = new HttpClientHandler
    {
      Proxy = proxy,
    };

    // 인증된 프록시 통합으로 HttpClient 인스턴스 초기화
    using HttpClient client = new HttpClient(handler);

    // 대상 URL
    string url = "https://httpbin.org/ip";

    // 엔드포인트로 비동기 GET 요청 전송
    HttpResponseMessage response = await client.GetAsync(url);

    // 응답 내용을 문자열로 읽기
    string responseBody = await response.Content.ReadAsStringAsync();

    // 콘솔에 응답 출력
    Console.WriteLine(responseBody);
  }
}

SSL 인증서 문제 방지

HttpClient에서 프록시를 설정할 때, 아래와 같은 SSL 인증서 검증 오류로 인해 요청이 실패할 수 있습니다:

처리되지 않은 예외. System.Net.Http.HttpRequestException: SSL 연결을 설정할 수 없습니다. 내부 예외를 참조하십시오.
 ---> System.Security.Authentication.AuthenticationException: 인증서 체인에 오류가 있어 원격 인증서가 유효하지 않습니다: UntrustedRoot

이는 일반적으로 프록시가 자체 서명 SSL 인증서를 사용할 때 발생합니다.

프록시 서버를 신뢰하는 경우(해당 시나리오에서만) 다음 접근 방식으로 SSL 검증을 비활성화하여 이 문제를 우회할 수 있습니다:

HttpClientHandler handler = new HttpClientHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.ServerCertificateCustomValidationCallback = (httpRequestMessage, cert, cetChain, policyErrors) =>
{
  return true;
};

using HttpClient client = new HttpClient(handler);

위 코드 조각은 항상 true를 반환하는 사용자 정의 콜백으로 기본 인증서 검증 동작을 재정의합니다.

참고: SSL 검증을 비활성화하면 연결이 중간자(MITM) 공격에 취약해집니다. 프록시를 완전히 신뢰하고 보안 위험을 인지한 경우에만 이 방법을 사용하십시오.

프록시 로테이션 구현

동일한 프록시 서버를 반복적으로 사용하면 대상 사이트에서 해당 IP 주소를 차단할 수 있습니다. 이를 방지하려면 요청마다 프록시 서버를 로테이션하여 매번 다른 프록시 서버를 사용하도록 설정하세요.

프록시 로테이션을 구현하려면 다음 절차를 따르십시오.

  1. 여러 프록시 URL로 목록 채우기
  2. 각 요청 전에 프록시 URL을 무작위로 선택
  3. 선택된 프록시 URL을 HttpClient에 설정

위 알고리즘은 다음 코드 조각으로 구현됩니다:

using System.Net;

class Program
{  
  static async Task Main()
  {
    // 무작위 프록시 URL 획득
    string selectedProxyUrl = GetRandomProxyUrl();

    // 무작위 프록시 설정
    HttpClientHandler handler = new HttpClientHandler
    {
      Proxy = new WebProxy
      {
        Address = new Uri(selectedProxyUrl),
      },
    };

    // 무작위 프록시를 통해 GET 요청 수행
    using HttpClient client = new HttpClient(handler);
    string url = "https://httpbin.org/ip";
    HttpResponseMessage response = await client.GetAsync(url);

    // 응답 내용을 문자열로 읽고 출력
    string responseBody = await response.Content.ReadAsStringAsync();
    Console.WriteLine(responseBody);
  }

  static string GetRandomProxyUrl()
  {
    // 순환할 프록시 URL 목록
    List<string> proxyUrls = new List<string>
        {
            "<protocol_1>://<proxy_host_1>:<port_1>",
            // ...
            "<protocol_n>://<proxy_host_n>:<port_n>",
        };

    // 목록에서 무작위 프록시 URL 반환
    Random random = new Random();
    int index = random.Next(proxyUrls.Count);
    return proxyUrls[index];
  }
}

이 접근법의 주요 단점은 다음과 같습니다:

  • 반복적인 코드 작성 필요
  • 신뢰할 수 있는 프록시 서버 풀에 대한 접근이 필요하며, 이는 일반적으로 비용이 발생합니다

다행히 C#에서 IP 주소를 회전시키는 더 효율적인 솔루션이 있습니다!

Bright Data는 출구 IP 주소를 자동으로 회전시켜 수동 프록시 회전이 필요 없는 회전 프록시를 제공합니다. 약 1억 개의 IP를 보유하고 있으며, 195개국에서 이용 가능하고, 탁월한 네트워크 가동 시간을 자랑하며, 99.9%의 성공률을 보장합니다.

다음 장에서는 HttpClient에서 Bright Data의 회전 프록시를 시작하는 방법을 배울 것입니다.

HttpClient에서 Bright Data 프록시 사용하기

Bright Data는 포춘 500대 기업 및 20,000명 이상의 고객에게 서비스를 제공하는 세계 최대 규모의 프록시 서버 중 하나를 운영합니다. 이 글로벌 프록시 네트워크에는 다음이 포함됩니다:

C#의 HttpClient에서 Bright Data의 주거용 프록시를 사용하는 방법을 알아보려면 아래 단계를 따르세요.

이미 계정이 있다면 Bright Data에 로그인하세요. 계정이 없다면 무료로 계정을 생성하세요. 로그인 후 사용자 대시보드로 이동합니다:

Bright Data's dashboard after login

“프록시 제품 보기” 버튼을 클릭하여 진행하세요:

Clicking on view proxy products

“프록시 및 스크래핑 인프라” 페이지로 이동합니다:

Proxies & Scraping Infrastructure main page

아래로 스크롤하여 “주거용 프록시” 카드를 찾으세요. “시작하기” 버튼을 클릭하세요:

Getting started with residential proxies

주거용 프록시 설정 페이지에서 마법사를 따라 필요에 맞게 서비스를 맞춤 설정하세요. 궁금한 점이 있으면 24시간 연중무휴 지원팀에 문의하세요:

Customizing the service based on your needs

“액세스 매개변수” 탭으로 이동하여 프록시의 호스트, 포트, 사용자 이름, 비밀번호를 확인하세요:

The access parameters for your new zone

“호스트” 필드에는 포트가 포함되어 있음을 유의하세요.

필요한 세부 정보를 확보했으므로 프록시 URL을 생성하고 C#의 WebProxy 객체와 함께 사용하세요:

WebProxy proxy = new WebProxy
{
  Address = new Uri("http://<brightdata_proxy_host>:<brightdata_proxy_port>"),
  Credentials = new NetworkCredential("<brightdata_proxy_username>", "<brightdata_proxy_password>"),
};

<...> 자리 표시자를 Bright Data의 프록시 정보로 대체하세요.

“Active proxy” 설정을 켜고, 나머지 지침을 따라 설정하면 완료됩니다!

다음 C# 코드 스니펫을 사용하여 Bright Data 프록시를 HttpClient에 통합하세요:

using System.Net;

class Program
{
  static async Task Main()
  {
    // 새 프록시 객체 초기화
    WebProxy proxy = new WebProxy
    {
      // TODO: 자리 표시자를 Bright Data 프록시 정보로 교체
      Address = new Uri("http://<brightdata_proxy_host>:<brightdata_proxy_port>"),
      Credentials = new NetworkCredential("<brightdata_proxy_username>", "<brightdata_proxy_password>"),
    };

    // 지정된 프록시를 사용하는 HTTP 클라이언트 핸들러 정의
    HttpClientHandler handler = new HttpClientHandler
    {
      Proxy = proxy,
    };

    // SSL 검증 비활성화
    handler.ClientCertificateOptions = ClientCertificateOption.Manual;
    handler.ServerCertificateCustomValidationCallback = (httpRequestMessage, cert, cetChain, policyErrors) =>
    {
      return true;
    };

    // 프록시 통합된 HttpClient 인스턴스 초기화
    using HttpClient client = new HttpClient(handler);

    // 대상 URL
    string url = "https://httpbin.org/ip";

    // 엔드포인트로 비동기 GET 요청 전송
    HttpResponseMessage response = await client.GetAsync(url);

    // 응답 내용을 문자열로 읽기
    string responseBody = await response.Content.ReadAsStringAsync();

    // 콘솔에 응답 출력
    Console.WriteLine(responseBody);
  }
}

위 스크립트를 실행할 때마다 다른 출구 IP를 확인할 수 있습니다.

Bright Data의 자동 회전 프록시를 사용하면 HttpClient 프록시 회전이 그 어느 때보다 쉬워집니다!

결론

이 프록시 통합 튜토리얼에서는 프록시 사용의 중요성과 C#의 HttpClient에 프록시를 통합하는 방법을 배웠습니다. .NET의 기본 HTTP 클라이언트 라이브러리인 HttpClient에서 프록시를 설정하는 것이 얼마나 쉬운지 알게 되었습니다.

이 가이드를 통해 무료 프록시 서비스에 의존하는 것이 위험한 이유도 이해하셨을 것입니다. 대신 신뢰할 수 있는 프록시 제공업체의 안정적인 프록시를 사용해야 합니다. 시장에서 최고의 회전 프록시 제공업체를 찾고 계시다면, 바로 Bright Data를 선택하세요.

지금 바로 계정을 생성하고 저희 프록시를 무료로 테스트해 보세요!