상세 컨텐츠

본문 제목

[Golang] "net/http: TLS handshake timeout" error

Golang

by stayhungri 2022. 7. 1. 13:40

본문

"net/http: TLS handshake timeout"

 

"net/http: TLS handshake timeout" 에러 메시지는 말 그대로 TLS handshake 중에 타임아웃이 났다는 뜻입니다.

외부 서비스 API 호출 시 나온 상황인데 해당 시간 대에 트래픽이 급증하여 나온 것으로 보여집니다.

 

문제를 해결하는 방법은 요청 성격에 따라 다르겠지만 몇번 다시 호출해 보고 그래도 안되면 다른 서비스(이럴 때를 대비해 미리 준비한 다른 외부 서비스)를 이용하는게 좋다고 생각합니다.

retry와 timeout 은 요청 성격에 상황에 따라 조절하면 될텐데 여기서는 timeout 을 조절하는 방법에 대해 다루겠습니다.

 

go 기본 패키지에서 기본 handshake timeout 이 10초입니다.

https://go.dev/src/net/http/transport.go

var DefaultTransport RoundTripper = &Transport{
	Proxy: ProxyFromEnvironment,
	DialContext: defaultTransportDialContext(&net.Dialer{
		Timeout:   30 * time.Second,
		KeepAlive: 30 * time.Second,
	}),
	ForceAttemptHTTP2:     true,
	MaxIdleConns:          100,
	IdleConnTimeout:       90 * time.Second,
	TLSHandshakeTimeout:   10 * time.Second,
	ExpectContinueTimeout: 1 * time.Second,
}

 

기본 handshake timeout 을 바꾸려면 http client 만들 때 TLSHandshakeTimeout 옵션을 주면 됩니다.

	tr := &http.Transport{
		TLSHandshakeTimeout: 60 * time.Second, // 60초로 변경
	}
	client := &http.Client{Transport: tr}

 

관련글 더보기