일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- minikube
- Pinpoint
- kotlin coroutine
- 공부
- AI
- Elasticsearch
- Spring
- aws
- Java
- 티스토리챌린지
- mysql 튜닝
- IntelliJ
- Linux
- 정보처리기사실기 기출문제
- APM
- AWS EKS
- kotlin
- 정보처리기사 실기
- MySQL
- Kubernetes
- 코틀린 코루틴의 정석
- CKA 기출문제
- 오블완
- 정보처리기사 실기 기출문제
- PETERICA
- kotlin querydsl
- 기록으로 실력을 쌓자
- kotlin spring
- CloudWatch
- CKA
- Today
- Total
피터의 개발이야기
[GO] Golang에서 http.Client를 이용한 프록시 설정방법 본문
ㅁ 들어가며
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를 사용하여 프록시를 설정하는 방법은 환경 변수를 통한 간단한 설정부터 조건을 이용한 복잡한 프로그래밍 방식 알아 보았다. 프록시 설정은 네트워크 보안, 접근 제한 우회, 로드 밸런싱 등 다양한 목적으로 사용될 수 있다. 프록시 설정을 잘 활용한다면애플리케이션의 안정성, 보안성, 그리고 성능을 크게 향상시킬 수 있다.
ㅁ 함께 보면 좋은 사이트
'Programming > GO' 카테고리의 다른 글
[GO] Intel Xeon 프로세서 빌드 방법, GOOS, GOARCH 설정 (0) | 2024.12.06 |
---|---|
[GO] GO 언어란? 기본 문법 (2) | 2024.11.19 |
[GO] Goroutine과 Coroutine의 차이점 (0) | 2024.09.13 |
[GO] Go 언어의 장점 (0) | 2024.09.12 |