patorashのブログ

方向性はまだない

Rails 5.2からReferrer-Policyの値が設定されているので気をつけよう

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だった。

f:id:patorash:20190115163112p:plain
Rails 5.1.6.1の場合

5.2.2の場合

Referrer Policyがstrict-origin-when-cross-originだった。

f:id:patorash:20190115163152p:plain
Rails 5.2.2の場合

Rails 5.2.2のリリースノートを見る

Ruby on Rails 5.2 リリースノート | Rails ガイド

こちらによると、Referrer-Policyヘッダーをデフォルトのヘッダーセットに追加。というのがあった。 commitログを確認したところ、strict-origin-when-cross-originがデフォルトでセットされるようになっていた。

しかし、これがどういう設定なのかがイマイチわからない。

Referrer Policyの種類を確認する

Referrer-Policyとkindsで検索したら設定の意味が出てきた。

developer.mozilla.org

詳しくは上記のサイトの説明を読んだらわかるが、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側には影響ないと思っていたのだけれど、そんなことはなかった。とりあえず一通りは動かしてみるっていうのはやはり大事である。