Skip to content

프로덕션 체크리스트

필수 확인 항목

TLS 설정

  • [ ] InsecureSkipVerifyfalse로 설정 (기본값)
  • [ ] MinTLSVersion이 최소 tls.VersionTLS12
  • [ ] TestingConfig()를 사용하지 않음

SSRF 방어

  • [ ] AllowPrivateIPsfalse (기본값)
  • [ ] 내부 서비스 접근이 필요한 경우 SSRFExemptCIDRs로 정밀 지정
  • [ ] 사용자 제공 URL 을 처리할 때 SecureConfig() 사용

타임아웃 설정

  • [ ] 모든 타임아웃 값이 설정되어 있고 적절함
  • [ ] TimeoutConfig.Request가 0 이 아님 (무한 대기 방지)
  • [ ] 각 요청에 WithContext로 타임아웃 설정 고려

응답 제한

  • [ ] MaxResponseBodySize가 합리적인 상한으로 설정됨
  • [ ] MaxDecompressedBodySize가 합리적인 상한으로 설정됨
  • [ ] 대용량 응답 처리 시 스트리밍 다운로드 사용

재시도 설정

  • [ ] MaxRetries가 5 를 초과하지 않음
  • [ ] 비멱등성 요청 (POST/PUT/PATCH) 에 재시도를 신중하게 사용
  • [ ] 썬더링 허드 방지를 위해 EnableJitter 활성화

리소스 관리

  • [ ] 클라이언트 사용 후 Close() 호출
  • [ ] defer로 리소스 해제 보장

권장 항목

미들웨어

  • [ ] RecoveryMiddleware()로 panic 크래시 방지
  • [ ] LoggingMiddleware()로 요청 로그 기록
  • [ ] MetricsMiddleware()로 메트릭 수집
  • [ ] 보안 민감 시나리오에 AuditMiddleware() 사용

요청 헤더

  • [ ] 의미 있는 User-Agent 설정
  • [ ] 기본 요청 헤더에 민감 정보를 저장하지 않음
  • [ ] 수동 Authorization 설정 대신 WithBearerToken 사용
  • [ ] 보안 민감 시나리오에 CookieSecurity 검증 활성화
  • [ ] StrictCookieSecurityConfig()로 보안 속성 강제

리다이렉트

  • [ ] 사용자 입력 URL 시나리오에서 리다이렉트 비활성화
  • [ ] RedirectWhitelist로 리다이렉트 대상 제한

코드 예제

프로덕션급 클라이언트 생성

go
func createProductionClient() (httpc.Client, error) {
    cfg := httpc.DefaultConfig()

    // 타임아웃
    cfg.Timeouts.Request = 30 * time.Second
    cfg.Timeouts.Dial = 10 * time.Second
    cfg.Timeouts.TLSHandshake = 10 * time.Second
    cfg.Timeouts.ResponseHeader = 30 * time.Second // transport 수준 하드 캡: 해당 client 의 모든 요청에 적용, WithTimeout 으로 요청별 재정의 불가; AI API/장기 응답 시나리오는 0 으로 설정해 Request 타임아웃에 의존

    // 연결 풀
    cfg.Connection.MaxIdleConns = 50
    cfg.Connection.MaxConnsPerHost = 10

    // 보안
    cfg.Security.AllowPrivateIPs = false
    cfg.Security.MaxResponseBodySize = 10 * 1024 * 1024

    // 재시도
    cfg.Retry.MaxRetries = 3
    cfg.Retry.Delay = 1 * time.Second
    cfg.Retry.EnableJitter = true

    // 미들웨어
    cfg.Middleware.UserAgent = "my-service/1.0"
    cfg.Middleware.Middlewares = []httpc.MiddlewareFunc{
        httpc.RecoveryMiddleware(),
        httpc.LoggingMiddleware(log.Printf),
        httpc.RequestIDMiddleware("X-Request-ID", nil),
    }

    return httpc.New(cfg)
}

보안급 클라이언트

go
func createSecureClient() (httpc.Client, error) {
    cfg := httpc.SecureConfig()
    cfg.Security.CookieSecurity = httpc.StrictCookieSecurityConfig()
    cfg.Security.RedirectWhitelist = []string{"api.example.com"}
    return httpc.New(cfg)
}

확인 명령어

bash
# TestingConfig 오용 확인
grep -r "TestingConfig" --include="*.go" | grep -v "_test.go"

# InsecureSkipVerify 확인
grep -r "InsecureSkipVerify.*true" --include="*.go" | grep -v "_test.go"

# AllowPrivateIPs 확인
grep -r "AllowPrivateIPs.*true" --include="*.go" | grep -v "_test.go"

다음 단계