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)ではリトライを慎重に使用
  • [ ] Thundering Herd を防止するため 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"

次のステップ