まったり技術ブログ

Webエンジニアのセキュリティブログ

LaravelのセッションCookieにSameSite属性を付与

はじめに

 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属性を聞いたことないという人向け画像 f:id:motikan2010:20190130231232p:plain:w600
※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について追記