本番チェックリスト
必須確認項目
TLS 設定
- [ ]
InsecureSkipVerifyをfalseに設定(デフォルト値) - [ ]
MinTLSVersionを少なくともtls.VersionTLS12に設定 - [ ]
TestingConfig()を使用していないことを確認
SSRF 防護
- [ ]
AllowPrivateIPsをfalseに設定(デフォルト値) - [ ] 内部サービスへのアクセスが必要な場合は
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を使用
Cookie
- [ ] セキュリティ重視シナリオでは
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"