[Rails] X-XSS-Protectionヘッダーをデフォルトから削除

rails/rails

Context

Rails 8.2では、長年デフォルトで設定されてきたX-XSS-Protectionヘッダーが完全に削除されます。このヘッダーは、かつてブラウザに搭載されていたXSS Auditorを制御するためのものでしたが、すべての主要ブラウザが数年前にこの機能のサポートを終了しており、現在では実質的に意味を持たなくなっています。

Rails 7.0以降、このヘッダーの値は1; mode=blockから0(無効化)に変更されていましたが、今回のアップデートでヘッダー自体が削除されることになりました。

Technical Detail

デフォルトヘッダーの変更

Rails 8.2では、config.action_dispatch.default_headersの構成が以下のように変更されます。

変更前(Rails 7.1まで):

config.action_dispatch.default_headers = {
  "X-Frame-Options" => "SAMEORIGIN",
  "X-XSS-Protection" => "0",
  "X-Content-Type-Options" => "nosniff",
  "X-Permitted-Cross-Domain-Policies" => "none",
  "Referrer-Policy" => "strict-origin-when-cross-origin"
}

変更後(Rails 8.2以降):

config.action_dispatch.default_headers = {
  "X-Frame-Options" => "SAMEORIGIN",
  "X-Content-Type-Options" => "nosniff",
  "X-Permitted-Cross-Domain-Policies" => "none",
  "Referrer-Policy" => "strict-origin-when-cross-origin"
}

X-XSS-Protectionヘッダーが完全に削除され、セキュリティヘッダーの構成がよりシンプルになりました。

実装の詳細

この変更はrailties/lib/rails/application/configuration.rbで、Rails 8.2のデフォルト設定として実装されています。

if respond_to?(:action_dispatch)
  action_dispatch.default_headers = {
    "X-Frame-Options" => "SAMEORIGIN",
    "X-Content-Type-Options" => "nosniff",
    "X-Permitted-Cross-Domain-Policies" => "none",
    "Referrer-Policy" => "strict-origin-when-cross-origin"
  }
end

新規アプリケーションでは、config/initializers/new_framework_defaults_8_2.rbに以下のようなコメント付きの設定例が生成されます。

###
# Remove the default X-XSS-Protection headers since all browsers have removed support for it years ago.
#++
# config.action_dispatch.default_headers = {
#   "X-Frame-Options" => "SAMEORIGIN",
#   "X-Content-Type-Options" => "nosniff",
#   "X-Permitted-Cross-Domain-Policies" => "none",
#   "Referrer-Policy" => "strict-origin-when-cross-origin"
# }

X-XSS-Protectionの歴史

  • 初期: ブラウザのXSS Auditorを有効化する目的で1; mode=blockが設定されていた
  • Rails 7.0: セキュリティ上の問題により0(無効化)に変更
  • Rails 8.2: すべてのブラウザでサポートが終了したため、ヘッダー自体を削除

OWASP Secure Headersプロジェクトでも、このヘッダーは「deprecated legacy header」として分類されており、むしろ削除することが推奨されています。

既存アプリケーションへの影響

既存のRailsアプリケーションをRails 8.2にアップグレードする際、config.load_defaults 8.2を設定すると、この変更が自動的に適用されます。もし何らかの理由でこのヘッダーを維持したい場合は、config/application.rbまたは環境別の設定ファイルで明示的に設定することができます。

config.action_dispatch.default_headers["X-XSS-Protection"] = "0"

ただし、すべての主要ブラウザでサポートが終了しているため、このヘッダーを維持する技術的な理由はほとんどありません。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

ガイドライン準拠 ✓ PASS

記事構成とDiffDaily Styleへの準拠状況

記事構成の必須要素(Title, Context, Technical Detail)がすべて明確に記載されています。コードブロック前後の空行やファイル名付きシンタックスハイライトなど、カスタムMarkdown構文も正しく使用されており、可読性が高いです。対象読者であるエンジニアに適した内容となっています。

  • 記事構成(Title、Context、Technical Detail)
  • DiffDaily Styleガイド準拠
  • カスタムMarkdown活用
  • 対象読者への適合性
技術的整合性 ✓ PASS

技術的な正確性と表現の適切性

記事で引用されているコードは、PRのDiff内容と正確に一致しています。技術用語(X-XSS-Protection, XSS Auditorなど)の使い方も適切です。変更の技術的な説明は論理的で正確です。

  • 技術用語の正確性
  • コード例の正確性
  • 説明の技術的正確性
PR内容との整合性 ✓ PASS

元のPR情報との一致度

記事内のすべての主張(Rails 7.0での変更経緯、ブラウザのサポート終了など)は、PRのDescriptionやDiff内容によって裏付けられています。ハルシネーション(根拠のない情報)は見られず、PRの内容を忠実に伝えています。

  • タイトル・説明の一致
  • Diff内容の正確な反映
  • 推測の排除