[Rails] X-XSS-Protectionヘッダーをデフォルトから削除
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"
ただし、すべての主要ブラウザでサポートが終了しているため、このヘッダーを維持する技術的な理由はほとんどありません。