はじめに
Cookieの属性に「Domain」「path」「Max-Age」「Expires」「Secure」「HttpOnly」があるが、 『SameSite』というのも存在していることを知っていたか!? 私は最近まで知らなかった(恥ずかしい)。
2016年から存在しており現在、主要なブラウザではサポートされているらしい。
--- 追記 2020/2/4 ---
2020年2月リリース予定の Chrome 80 からはSameSite属性の値がないCookieはSameSite=Lax
が付与されたものとして扱われるとのこと。
SameSite属性を無効にしたい場合は明示的にSameSite=None
を設定する必要があります。
Google Developers Japan: 新しい Cookie 設定 SameSite=None; Secure の準備を始めましょう
LaravelのデフォルトではSameSite属性を付与しないようになっているため、SameSite属性を無効にする場合は「none
」を明示的に指定する必要があります。
----- ここまで -----
そんな認知度が低そうな属性をLaravelで設定できるのかを確認してみる。
TL;DR
- Laravel 5.5.0 からサポート
- config/session.php を編集することでSameSite属性の値(Strict / Lax)の設定可能
検証環境
- PHP 7.1.3
- Laravel 5.7.23
SameSite属性とは
簡単に説明すると遷移元が外部ドメインのリクエストの場合はCookieが送信されないように制御できるというもの。
これによりほとんどのCSRF攻撃を防ぐことが可能になる。
そもそもSameSite属性を聞いたことないという人向け画像
※Cookieが送信される条件は、SameSite属性の値(Strict/Lax)によって異なります。
SameSite属性が付与されるように設定
設定変更
設定前に発行されるCookie情報
設定前に発行されるCookie情報は下記のようになっており、SameSite属性はありません。
デフォルトでは無効となっているようです。
Set-Cookie: laravel_session=eyJpdiI6Ik...; expires=Wed, 30-Jan-2019 00:11:04 GMT; Max-Age=7200; path=/; httponly
対応Laravelバージョンについて
Laravelのリリースノートを確認してみますと、バージョン 5.5.0 からSameSite属性をサポートしているそうです。
- Added SameSite support to CookieJar
Release v5.5.0 · laravel/framework · GitHub
設定ファイルの編集
SameSite属性の付与の設定は「 config/session.php 」ファイルから行うことができる。
デフォルトでは"null"が設定されており、SameSite属性を付与しないようになっていることが確認できます。
値に「none
」を指定することも可能です。
(省略) /* |-------------------------------------------------------------------------- | Same-Site Cookies |-------------------------------------------------------------------------- | | This option determines how your cookies behave when cross-site requests | take place, and can be used to mitigate CSRF attacks. By default, we | do not enable this as other CSRF protection services are in place. | | Supported: "lax", "strict" | */ 'same_site' => null,
確認
設定後に発行されるCookie情報
発行されるCookieにSameSite属性が付与されるようになりました。
「samesite=lax」の属性が付与されています。
Set-Cookie: laravel_session=eyJpdiI6Im...; expires=Wed, 30-Jan-2019 01:35:33 GMT; Max-Age=7200; path=/; httponly; samesite=lax
まとめ
Spring Boot 2.xからCookieが発行される際に、Lax値が設定されたSameSite属性が付与されるのがデフォルトになり、1.5.xから移行した際にファーストパーティCookieが送信されないという事象に遭遇しました。そこでSameSite属性の存在を知らなかった為、解決に時間が掛かったという経緯があり、本記事を書きました。
今後、LaravelでもデフォルトでSameSite属性が設定されることも考えられますね。主要なブラウザでは既にサポートされるようになっているらしいので。
Can I use... Support tables for HTML5, CSS3, etc
参考
draft-west-first-party-cookies-07 - Same-site Cookies
CookieのSameSite属性 | "><s>はい</s>
更新履歴
- 2019年1月30日 新規作成
- 2020年2月4日 Chrome 80について追記