[Laravel6.x]SameSite属性の設定

##はじめに
この記事はプログラミング初学者による備忘録用の記事であり、また、少しでも他の初学者のお役に立てればと思い書いています。

今回は、Chromeの検証機能にて``Indicate whether to send a cookie in a cross-site request by specifying its SameSite attribute``というIssuesが発生しましたので、解決策及びIsuuesに関する情報を記録しておきたいと思います。

間違いなどがございましたら、ご指摘のほどよろしくお願い致します。


##Issuesの内容

```
Indicate whether to send a cookie in a cross-site request
by specifying its SameSite attribute
```
どうやら、クッキーのSameSite属性が設定されていないか無効であるため、設定してくれと警告されているようです。

SameSite属性を設定することで、クロスサイトのコンテキストでクッキーが設定されることを防ぎ、ユーザーデータが誤って第三者に漏れたり、クロスサイトリクエストフォージェリが発生したりするのを防ぐことができるとのこと。

さらにメッセージを読むと、

・クッキーがクロスサイト・コンテキストに設定されることを意図している場合は、``SameSite=None or Secure``を指定(Secure属性を使用できるのはHTTPS経由で送信されるCookieのみ)

・クロスサイト・リクエストでクッキーを設定しない場合は、``SameSite=Strict``または``SameSite=Lax``を指定

上記のようなルールに従ってCookieの属性を更新することで、Issuesは解決できるようです。


##SameSite属性とは

>
SameSite 属性により、サーバーがオリジン間リクエスト (ここでサイトは登録可能なドメインによって定義されます) と一緒にクッキーを送るべきではないことを要求することができます。これは、クロスサイトリクエストフォージェリ攻撃 (CSRF) に対していくらかの防御となります。

SameSite属性には、ユーザーが意図しない形でのCookieの送信を発生させないようにする特徴があると言えます。
``引用:``[MDN HTTP Cookie の使用 (Cookie の送信先の定義)](https://developer.mozilla.org/ja/docs/Web/HTTP/Cookies#define_where_cookies_are_sent)

``使用例``
例えば、https://example.com というページに、https://www.google.com/ へのリンクがあり、以前 https://www.google.com/ にアクセス済みでクッキーを受け取っていた場合、再度リンク先に送信するリクエストデータの中に、以前に受け取った期限切れではないクッキーデータが存在する場合登録されます。この動作はCSRFなどの脆弱性を生む原因になるので、その対策としてSameSite属性が存在しています。

``重要なこと``
セキュリティやプライバシーの観点で重要なことは、cross-siteからのリクエストであり、そのリクエストに Cookie を含めるかどうかを決めるのがSameSite属性の役割であるといえます。

##SameSite属性に指定できる値
指定できる値は Strict, Lax, None の3つです。
指定する値によって、Cookieの扱い方が異なるので下記の表にまとめておきます。

|SameSite属性の値|意味|
|:---|:---:|
|None|全てのcross-siteなリクエストに対して Cookie が付与されます。つまり、Noneを使うことで、意図的に第三者のコンテキストでクッキーを送信してほしいことを明確に伝えることができます。<br>例えば、埋め込みコンテンツ、アフィリエイトプログラム、広告、複数のサイトへのサインインなど、他のサイトが利用するサービスを提供している場合は、Noneを使用して意図を明確にする必要があります。|
|Strict|他のドメインへのリクエストを送る際、クッキーはセットされず、same-siteに対するリクエストにのみCookieが付与されます。つまり、クッキーはファーストパーティのコンテキストでのみ送信されます。<br>例えば、Aサイトでログインしている状態で、Bサイト上にあるAサイトへのリンクをクリックした場合、リクエストにCookieが付与されないため未ログイン状態になり、再度ログイン処理や再読み込みが必要となります。|
|Lax|トップレベルのナビゲーションで、尚且つ**メソッドがsafe**であれば、他のドメインへのリクエストであってもクッキーをセットします。<br>POSTメソッドを使ったフォームのような、HTTPメソッドによるcross-siteなトップレベルのナビゲーションに対してはCookieが付与されません。従って、POSTメソッドなどを使ったフォームのサブミットに対するCSRF攻撃の対策として有効です。|

``注意:``
StrictもLaxも、サイトのセキュリティを完全に解決するものではありません。クッキーはユーザーのリクエストの一部として送信されるので、他のユーザー入力と同じように扱う必要があります。つまり、入力をサニタイズし、検証するということです。サーバー側のパスワード等の漏洩厳禁なデータを保存するためにクッキーを使用してはいけません。

##LaravelでSameSite属性の設定方法
``config/session.php``の``'same_site' => null,``を変更する。

```config/session.php
    /*
    |--------------------------------------------------------------------------
    | 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", "none"
    |
    */

    'same_site' => null,
```

##補足
``・safeなメソッドとは``
RFC7231 4.2.1 Safe Methodsによると、
・GET
・HEAD
・POTIONS
・TRACE
の4つをsafeなメソッドとしており、POSTやDELETEより比較的に安全といえる。


``・same-site と cross-siteの違いとは``

簡単にいうと、ドメインが同じであればsame-siteであり、ドメインが異なればcross-siteです。
詳しい違いは下記リンク先を参考にしてください。とてもわかりやすい記事でした。
[web.dev [Understanding "same-site" and "same-origin"]
](https://web.dev/same-site-same-origin/)

``・トップレベルナビゲーションとは``
アドレスバーに表示されているURLのオリジンドメインをトップレベルナビゲーションとして、オリジンドメインAからオリジンドメインBに移るような画面遷移の場合、CSRFの対象にならないので安全であると判断してクッキーの付加が許可されているのだと思われます。

``例:``
http://sample.com/ にあるリンクを踏んでhttp://another.com/ に遷移した場合、アドレスバーにはhttp://another.com/ が表示されるので、これはトップレベルナビゲーションであるといえます。

##おわりに
米Googleは2020年4月に新型コロナウイルスの影響を受け、Google Chrome 80からの　SameSite Cookieの仕様変更を一時的にロールバックすると発表がありました。
新型コロナウイルスが収まり次第、また発表がありそうですね。

##参考文献
[MDN HTTP Cookie の使用 (Cookie の送信先の定義)](https://developer.mozilla.org/ja/docs/Web/HTTP/Cookies#define_where_cookies_are_sent)
[web.dev [SameSite cookies explained]](https://web.dev/samesite-cookies-explained/)
[web.dev [Understanding "same-site" and "same-origin"]
](https://web.dev/same-site-same-origin/)[draft-ietf-httpbis-rfc6265bis-06#section-5.2](https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis-06#section-5.2)
[rfc7231 - IETF Tools](https://datatracker.ietf.org/doc/html/rfc7231#section-4.2.1)
[SameSite 属性を使った Cookie のセキュアな運用を考える](https://numb86-tech.hatenablog.com/entry/2020/01/26/112607)