概要
SameSite属性とは、Cookie自体のブラウザでの扱いを指定することでcsrf攻撃を防ぐやり方。
(csrf攻撃とは、被害側がログイン中の状態であることを悪用して、攻撃側が被害側のブラウザを勝手に操作する攻撃方法。)
それぞれStrict, Lax, Noneの3つの値を指定できる。
各属性
SameSite = Strict
- 一番厳格。同じサイト内からのみCookieを送信する。
- 外部サイトからの遷移はどんな形であれCookieを送信しない。そのためログインをまた1からする必要が出てくるなど利便性が損なわれる。
SameSite = Lax
- バランスが取れている。同じサイト以外にも外部サイトからのリンクのクリック、GETフォーム送信はCookieを送信する。
- 外部サイトから開始されたPOSTフォーム送信はCookieを送信しない。
- Chromeなどの主要なブラウザではデフォルトとして使用されている。
SameSite = None
- 何も制限はない。
-
Secure属性も同時に指定する必要がある。
ブラウザの確認方法
開発者ツール → Applicationタブ → Cookies から、各CookieにどのSameSite属性が設定されているかを確認できる。
フレームワークでの確認・設定方法
ほとんどのフレームワークで設定することができる。
以下はLaravelの例↓
config/session.php
'same_site' => 'lax',
フレームワークと合わせて多層防御する
各フレームワークにもcsrf攻撃を対策するための機能が盛り込まれている。
そのためどちらか一方を設定するだけでいいのでは?となるが、、
- 利用者が古いブラウザを使用していた場合、SameSite属性がサポートされていない可能性があるため攻撃を受ける可能性がある。
- 開発者がCSRFトークンをコードに書き忘れると無防備になる。
などのデメリットが生まれてしまう。
そのため、やはり両方書くようにしたい。
まとめ
ブラウザの機能+少しのトークンをコードに記述するだけで正しい情報なのか、信頼できるところからのリクエストなのかどうかを二重にチェックして多層防御を実現し、セキュリティの向上に貢献できる。
普段意識することが少ないために、今回知ることができて良かった。