まったり技術ブログ

主にITエンジニア向けの記事を書いていきます

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

 Cookieの属性に「Domain」「path」「Max-Age」「Expires」「Secure」「HttpOnly」があるが、 『SameSite』というのも存在していることを知っていたか!? 私は知らんかった...。
 2016年から存在しており現在では主要なブラウザではサポートされているらしい。

そんな認知度が低そうな属性を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)によって異なります。

もっと詳しい説明は下記の記事を参照して下さい。
CookieのSameSite属性 | "><s>はい</s>

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"が設定されており、属性を付与しないようになっている。

(省略)

    /*
    |--------------------------------------------------------------------------
    | 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属性が付与されるようになりました。

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>