ども、@kimihom です。
明日、2020/02/04 に Chrome 80 のリリースが予定されている。そこで巷で話題になっている SameSite の部分で対応が必要になるケースがでてくる。 ウェブ上で調べても全然その対応方法が出てなかったので、記録として残しておこう。
問題となり得るケース
Rails アプリでログイン機能を実装していて、iframe で そのログインセッションを使い続けている場合、Chrome80 から問題が起こる可能性がある。その他のケースもあるので、自分の作っている Web アプリが SameSite による影響が出るのかを確認しておこう。詳しくは既にたくさんのページで紹介されているので読んでおいて欲しい。
- Google Developers Japan: 新しい Cookie 設定 SameSite=None; Secure の準備を始めましょう
- Chrome 80が密かに呼び寄せる地獄 ~ SameSite属性のデフォルト変更を調べてみた - Qiita
現状の設定の確認
EditThisCookie という Chrome 拡張で確認できる。
サイトにアクセスして、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 アップデートでどうなるか、様子を見てみることにしよう。
このブログを読んだ方は、まだ時間が残されているので対応してみて欲しい。