관리 메뉴

피터의 개발이야기

[GO] Golang에서 http.Client를 이용한 프록시 설정방법 본문

Programming/GO

[GO] Golang에서 http.Client를 이용한 프록시 설정방법

기록하는 백앤드개발자 2024. 12. 5. 23:31
반응형

ㅁ 들어가며

  Go 언어로 웹 요청을 보낼 때 http.Client를 사용한다. Client가 proxy설정에 영향을 받는 줄 모르고 트러블 슈팅을 하게 되었다. 이 트러블 슈팅을 하면서 알게 된 http.Client의 프록시 설정에 대해 정리해 보았다.

 

ㅁ  환경 변수를 통한 프록시 설정

// HTTP 요청에 대한 프록시 서버 주소
export HTTP_PROXY=http://proxy.example.com:8080

// HTTPS 요청에 대한 프록시 서버 주소
export HTTPS_PROXY=https://proxy.example.com:8080

// 프록시를 사용하지 않을 도메인 목록
export NO_PROXY=localhost,127.0.0.1,10.0.0.0/8

ㅇ Go의 http.Client는 기본적으로 시스템의 환경 변수를 설정하여 코드 수정 없이 프록시를 사용할 수 있다.

ㅇ 위 환경 변수를 설정하여  Go프로그램을 실행하면, http.Client는 자동으로 설정이 된다.

ㅇ 내가 겪은 트러블 슈팅은 이 자동 설정이 문제가 되었다.

 

ㅁ 프로그래밍 방식으로 프록시 설정

환경 변수를 사용하지 않고 프로그램 내에서 직접 프록시를 설정할 수도 있다.

조건에 따라 프록시를 선별적으로 사용할 때에 유용하다.

 

프록시 함수 사용하기

transport := &http.Transport{
    Proxy: func(req *http.Request) (*url.URL, error) {
        if req.URL.Hostname() == "example.com" {
            return url.Parse("http://proxy.example.com:8080")
        }
        return nil, nil // 프록시 사용하지 않음
    },
}

ㄴ 특정 조건에서만 프록시를 사용할 수 있다.

 

HTTPS 프록시 설정 

transport := &http.Transport{
    Proxy: http.ProxyURL(proxyURL),
    TLSClientConfig: &tls.Config{
        InsecureSkipVerify: true, // 주의: 프로덕션 환경에서는 사용하지 마세요!
    },
}

ㅇ HTTPS 요청에 대해 TLS 연결 설정을 우회할 수 있다.

ㅇ InsecureSkipVerify: true는 프록시 서버의 인증서 검증을 건너뛰게 한다.

ㅇ 이는 개발 환경에서는 편리할 수 있지만, 프로덕션 환경에서는 보안에 위배 되기 때문에 사용하지 않는 것이 좋다.

 

프록시 인증 처리

proxyURL, _ := url.Parse("http://proxy.example.com:8080")
proxyURL.User = url.UserPassword("username", "password")

transport := &http.Transport{
    Proxy: http.ProxyURL(proxyURL),
}

 

ㅇ 프록시 서버가 인증을 요구 시,  Basic 인증을 사용하는 프록시 서버에 적용할 수 있다.

 

http.Transport 사용한 client 객체 생성

package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "net/url"
)

func main() {
    proxyURL, err := url.Parse("http://proxy.example.com:8080")
    if err != nil {
        log.Fatal("프록시 URL 파싱 오류:", err)
    }

    transport := &http.Transport{
        Proxy: http.ProxyURL(proxyURL),
    }

    client := &http.Client{
        Transport: transport,
    }

    resp, err := client.Get("http://example.com")
    if err != nil {
        log.Fatal("HTTP GET 요청 오류:", err)
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatal("응답 본문 읽기 오류:", err)
    }

    fmt.Println(string(body))
}

ㅇ http.Transport의 Proxy 필드를 설정하여 client 객체를 생성하였다.

ㅇ 이 client를 사용하면 지정된 프록시를 통해 통신하게 된다.

 

ㅁ 마무리

 Golang의 http.Client를 사용하여 프록시를 설정하는 방법은 환경 변수를 통한 간단한 설정부터 조건을 이용한 복잡한 프로그래밍 방식 알아 보았다. 프록시 설정은 네트워크 보안, 접근 제한 우회, 로드 밸런싱 등 다양한 목적으로 사용될 수 있다. 프록시 설정을 잘 활용한다면애플리케이션의 안정성, 보안성, 그리고 성능을 크게 향상시킬 수 있다.

 

ㅁ 함께 보면 좋은 사이트

Ignoring HTTP_PROXY environment vars in Go

 Setting up proxy for HTTP client

반응형
Comments