ボクココ

個人開発に関するテックブログ

Rails における Chrome80 の SameSite 対応

ども、@kimihom です。

f:id:cevid_cpp:20200203182935j:plain

明日、2020/02/04 に Chrome 80 のリリースが予定されている。そこで巷で話題になっている SameSite の部分で対応が必要になるケースがでてくる。 ウェブ上で調べても全然その対応方法が出てなかったので、記録として残しておこう。

問題となり得るケース

Rails アプリでログイン機能を実装していて、iframe で そのログインセッションを使い続けている場合、Chrome80 から問題が起こる可能性がある。その他のケースもあるので、自分の作っている Web アプリが SameSite による影響が出るのかを確認しておこう。詳しくは既にたくさんのページで紹介されているので読んでおいて欲しい。

現状の設定の確認

EditThisCookie という Chrome 拡張で確認できる。

chrome.google.com

サイトにアクセスして、EditThisCookie アイコンをクリックすると、それぞれの Cookie の Key/Value を表示してくれる。そこにある SameSite の項目が今回一番大事になってくる項目となる。 何も対応していないと、おそらく何も指定された状態になっていないことだろう。この状態だと、Chrome 80 からは勝手に Lax が指定された状態となる。問題となり得るケースの Web アプリ の場合、これを Chrome 80 が出る前までに No Restriction に設定されていないと、その時点で残念なことが起こり得る。

Rails における対応

ではどうやって対応するか?まずは Devise の Cookie セッションが一番大事だろう。

まず rack のバージョンを上げる必要がある。2.1 以上にあげないと、そもそも SameSite の None 設定ができない。

-    rack (2.0.7)
+    rack (2.1.2)

そして、config/initializers/session_store.rb にて same_site の設定をする。"same_site: :none" をここで指定できる。すると、ログイン時の Cookie "_my_session" に same_site が none で設定されることが 先ほどの Chrome 拡張 EditThisCookie で確認できる。

Rails.application.config.session_store :cache_store, key: "_my_session", same_site: :none

さて、Devise を使っていると remember_me も Cookie で保存しているケースは多いことだろう。これは Devise 側で設定する必要がある。config/initializers/devise.rb だ。

config.rememberable_options = {:secure => true, :same_site => :none}

もちろん、これ以外でも Cookie を使っている場合には対応が必要だ。例えば、JavaScript 側で Cookie を管理している場合、js-cookie を使っている場合があることだろう。その場合は以下のようなコードを実装する必要がある。

Cookies.set("hoge", "value", { expires: 365 * 3, secure: true, samesite: 'none'});

EditThisCookie で必要な項目が一通り same_site 設定ができていることが確認できれば、安心して(?) Chrome80 を迎え入れることができるだろう。

終わりに

ググって調べても Rails 側の SameSite の設定方法が全然出てこなかったので、仕方なくソースコード読んで特定して設定した。 ほとんど情報が出回ってないということは、ほとんどの人は Rails の セッション管理で same_site をまともに設定してないということだろうから、明日からの Chrome 80 アップデートでどうなるか、様子を見てみることにしよう。

このブログを読んだ方は、まだ時間が残されているので対応してみて欲しい。