SameSite Cookieの登場によるCSRF Tokenの必要性について

前職で古いWebシステムのマイグレーションしてた時に思ったのだが、SameSite CookieがあればCSRF Tokenは最早いらないのではないか?というのに気が付いたので調べてみた話。

結論として言うとEdgeではPOSTリクエストでCookieが飛ぶ事はないので、CSRF Tokenを考慮する必要はなさそうに思える。

理由としてはCookieでSameSite=strictを指定している場合、クロスドメインでのCookie送信がブロックされるという話が事実であればCSRF Tokenは不要であるはずだからだ。

これによって悪意のあるサイトからAjaxやリダイレクト、フォームなどを使った攻撃をした場合にサーバーにCookieが送信されなくなる筈なので、理論上は問題なくなる。

以下では実際にCookieが送信されるかどうかの動きを見てみた。確認環境はMicrosoft Edge 121.0.2277.83。方式のリンクはシーケンス図になっている。

シーケンス図に書いてあるSameSite={var}varにはstrictlaxが入る。確認内容としてはシーケンスの一番最後のHTTPリクエストでCookieが送信されているかどうかを見ている。noneは面倒なので見ていない。

方式 SameSite=strict SameSite=lax
HTTP 302 REDIRECT 送信される 送信される
アンカーリンクのクリック 送信されない 送信される
アンカーリンクのクリック→HTTP 302 REDIRECT 送信されない 送信される
location.hrefでの移動 送信されない 送信される
location.hrefでの移動 →HTTP 302 REDIRECT 送信されない 送信される
FORMタグのsubmit(GET) 送信されない 送信される
FORMタグのsubmit(POST) 送信されない 送信されない

SameSite=strictだと外部サイトから開いたときにCookieが送信されないため、Google検索などから流入された時のログイン状態に不都合が出ると思われるので、その様なケースではSameSite=laxが無難だろう。

SameSite=laxの場合、GETリクエストではCookieが送信されるため、CSRF攻撃を受ける可能性があるが、GETで更新系処理をしない限り基本は問題にならないと思われる。

参考