Rails 5.1.6.1から5.2.2にアップグレードして検証していたところ、何もしていないのにJavaScriptの処理が壊れた。
その処理はCORSで有料のライブラリをダウンロードしてから実行しており、特にJS側も変更していなかったのだけれど、急にダウンロードできなくなった。 DevToolのコンソールからエラーメッセージを見たら、そのライブラリからは「リファラが間違っている」と怒られていた。
その有料のライブラリは使用するURL単位でリファラを提出する必要があったので、そのようにしてあったのだけれど、どうも何らかの理由でリファラが送られていないなと思った。
Rails 5.1.6.1に戻してみたところ、問題なく動いたので、これはバージョンの差異によるものだろうと判断し、それぞれのリクエストのヘッダを見てみた。
Railsのバージョンによる違い
5.1.6.1の場合
Referrer Policyがno-referrer-when-downgrade
だった。
5.2.2の場合
Referrer Policyがstrict-origin-when-cross-origin
だった。
Rails 5.2.2のリリースノートを見る
Ruby on Rails 5.2 リリースノート | Rails ガイド
こちらによると、Referrer-Policyヘッダーをデフォルトのヘッダーセットに追加。
というのがあった。
commitログを確認したところ、strict-origin-when-cross-origin
がデフォルトでセットされるようになっていた。
しかし、これがどういう設定なのかがイマイチわからない。
Referrer Policyの種類を確認する
Referrer-Policyとkindsで検索したら設定の意味が出てきた。
詳しくは上記のサイトの説明を読んだらわかるが、strict-origin-when-cross-origin
だと、要はURLのパス情報は落としたものがリファラとして送られているようだ。つまり、本来のリファラはhttps://www.example.com/path/to
であるが、https://www.example.com/
がリファラとして送られるということ。
no-referrer-when-downgrade
は、プロトコルのレベルが落ちる場合(HTTPS->HTTP)は、リファラを送らないという意味で、それ以外はリファラを全部送るという設定で、特に指定されていない場合はこれがデフォルトの動作となる。
状況に合った値を設定したかったが、鑑みるにno-referrer-when-downgrade
がよさそうだったのでこれを設定することにした。
RailsでReferrer Policyを設定する
設定するには、config.action_dispatch.default_headers
を修正する。今回はconfig/application.rb
に設定した。
config.action_dispatch.default_headers = { 'Referrer-Policy' => 'no-referrer-when-downgrade' }
設定後にRails 5.2.2のアプリを再起動させたところ、処理が正常に行われるようになった。
反省点
Railsのアップグレードなので影響範囲はRuby側だけでJS側には影響ないと思っていたのだけれど、そんなことはなかった。とりあえず一通りは動かしてみるっていうのはやはり大事である。