FlawOpen

flawopen.com/CSRF/SameSite Cookie

SameSite=Strict は CSRF トークンの代わりになりますか?

リファレンスページ
要点

SameSite=Strict は、別サイトから送られる Cookie 認証リクエストに対する強力なブラウザー保護ですが、あらゆる CSRF を防ぐものではありません。異なる origin の兄弟サブドメインも同一サイトとして扱われ、この属性を適用しないクライアントには保護がありません。脅威モデルに応じて CSRF トークンや別のリクエスト元検証を併用してください。

SameSite の実際の動作

SameSite=Strict の Cookie は、別サイトからのリクエストには送信されません。別サイトがフォームを自動送信する典型的な CSRF もこれに含まれます。そのため、この状況ではブラウザーがセッション Cookie を自動付与しません。SameSite は origin ではなくサイト単位です。兄弟サブドメインからのリクエストは same-site と判定される場合があるため、侵害された、または信頼できない兄弟ホストへの対策にはなりません。外部リンクから戻った際、Strict によって Cookie が送られず、ユーザーが未認証になることもあります。

残る制限

Cookie 以外の認証方式は対象外

アプリケーションが bearer token を Authorization ヘッダーに明示的に設定する場合、SameSite はそのヘッダーを制御しません。ブラウザーによる Cookie の自動送信とは異なるためです。ただし、その設計が自動的に安全になるわけではありません。他の仕組みが資格情報を自動付与しないか確認し、トークンの窃取や悪用を防いでください。

明示的な Lax と属性の省略は異なる

明示的な SameSite=Lax は、same-site リクエストと GET などの安全なメソッドを使う cross-site のトップレベル遷移で Cookie の送信を許可します。cross-site のサブリクエストや安全でないメソッドによる遷移では Cookie を送信しません。属性を省略するとユーザーエージェントの既定値が適用されます。Chromium では、この既定の動作は明示的な Lax と異なります。現在の実装では、属性を明示していない一部の Cookie が作成後 2 分以内であれば、安全でないメソッドによる cross-site トップレベルリクエストにも送信されます(Lax-allowing-unsafe)。このブラウザー固有の互換動作を CSRF 防御として頼らないでください。意図した属性を明示し、サポート対象クライアントでテストし、安全なメソッドから状態変更を実行できないようにしてください。

古いクライアントや非準拠クライアントは適用しない

SameSite はブラウザーが適用します。属性をサポートしない、または尊重しないクライアントには保護がありません。サポート対象を確認し、適切な CSRF トークン、Origin 検証などの主要な防御と併用する多層防御として扱ってください。

よくある質問

GET リクエストにも CSRF トークンは必要ですか?

安全なメソッドの専用ガイドを参照してください。GET などの安全なメソッドから状態変更操作に到達できないようにします。安全なメソッドはサーバー状態を変更しないことが前提です。

参考資料

関連項目 クロスサイトリクエストフォージェリ(CSRF、CWE-352):仕組みと防ぎ方 — flawopen.com GET に CSRF トークンは必要? localStorage の JWT と HttpOnly クッキー:どちらが安全か — flawopen.com Next.js Server Actions CSRF:Origin と安全な設定