Nwht0xn1

Railsでデフォルトで設定されるX-Frame-Optionsの値を変更するCreated on 2016-06-17 by r7kamura

WikiHubのX-Frame-Optionsを変更したので、経緯を記録しておく。元々WikiHubからWikiHubのコンテンツをiframe経由で呼び出すことは想定していなかったものの、iframeを使って開くとwikihubからログアウトする記事が作れそうな気がしたがログアウトがそもそも404なので効かなかった - 砂場 という記事を見て、そういえば読み込める意味は無いなと思ってDENYにすることにした。X-Frame-Optionsについて知りたい人は X-Frame-Options レスポンスヘッダ - HTTP | MDN などを読んでみてください。

変更

何も設定しないと、Railsはデフォルトで X-Frame-Options: SAMEORIGIN のようなレスポンスヘッダを付けるようになっている。これを変更するには、以下のように Rails.configuration.action_dispatch.default_headers["X-Frame-Options"] の値を変更すれば良い。

# config/application.rb
module Wikihub
  class Application < Rails::Application
    config.action_dispatch.default_headers["X-Frame-Options"] = "DENY"
  end
end

確認

これが設定されたことにより、例えば以下のようなコードが記事の本文中に記述されると、

<iframe src="https://wikihub.io/"></iframe>

Webブラウザのコンソールで以下のようにエラーが出るのが確認できる。

Refused to display 'https://wikihub.io/' in a frame because it set 'X-Frame-Options' to 'DENY'.

その他

GET /logout というエンドポイントがそもそも存在しないというのは確かにそうで、実際は「セッションを削除する」という意味と「GETにするとimg要素とかでアクセスされるとまずいことになる」という意味で、DELETE /logout というエンドポイントにしている。DELETE /session というのも考えたけど、こちら側の何らかの理由でログアウト処理に失敗したときにリダイレクトするのではなくミスった旨のHTMLをそのまま返すだろうということを考えると、ロケーションバーに /session とか書かれてても気持ち悪いだろうなと考えて DELETE /logout にした。同様の理由で POST /login になっている。

最近はもうあまり見なくなったけど、GETでログアウトさせるようなサービスもまだごく稀に見る気がする。