Web APIのセキュリティヘッダー実装
Go
Gin
セキュリティ
知識
Web APIサーバーにおいて、以下のHTTPセキュリティヘッダーを設定することで、様々な攻撃から防御できる。
必須のセキュリティヘッダー:
-
X-Content-Type-Options: nosniff
- MIMEタイプスニッフィングを防ぎ、宣言されたContent-Typeを厳格に適用
- スクリプトインジェクション攻撃を防ぐ
-
X-Frame-Options: DENY
- iframeへの埋め込みを拒否し、クリックジャッキング攻撃を防ぐ
- APIサーバーでは通常DENYが適切
-
Referrer-Policy: strict-origin-when-cross-origin
- リファラー情報の漏洩を制御
- クロスオリジンリクエストでは完全なURLを送信しない
-
Permissions-Policy
- ブラウザ機能の使用を制限
- 例:
geolocation=(), microphone=(), camera=()
-
Content-Security-Policy
- XSS攻撃の最も強力な防御策
- APIサーバーでは
default-src 'none'; frame-ancestors 'none';が適切
-
Strict-Transport-Security (HTTPS環境のみ)
- HTTPSを強制し、ダウングレード攻撃を防ぐ
max-age=31536000; includeSubDomains
Ginフレームワークでの実装例:
go
func SecurityHeaders() gin.HandlerFunc {
return func(c *gin.Context) {
c.Header("X-Content-Type-Options", "nosniff")
c.Header("X-Frame-Options", "DENY")
c.Header("Referrer-Policy", "strict-origin-when-cross-origin")
c.Header("Permissions-Policy", "geolocation=(), microphone=(), camera=()")
c.Header("Content-Security-Policy", "default-src 'none'; frame-ancestors 'none';")
// HTTPS接続の場合のみHSTSを設定
if c.Request.TLS != nil || c.GetHeader("X-Forwarded-Proto") == "https" {
c.Header("Strict-Transport-Security", "max-age=31536000; includeSubDomains")
}
c.Next()
}
}これらのヘッダーを設定することで、OWASPトップ10の多くの脆弱性に対する防御層を追加できる。