Chrome ブラウザーにおける SameSite Cookie の変更の処理

SameSite とは

SameSite は、Web アプリケーションでのクロスサイト リクエスト フォージェリ (CSRF) 攻撃を防ぐために、HTTP Cookie で設定できるプロパティです。

  • SameSiteLax に設定されている場合、Cookie は同じサイト内の要求と、他のサイトからの GET 要求で送信されます。 ドメインを越えた GET 要求では送信されません。
  • Strict の値を指定すると、同じサイト内の要求でのみ Cookie が送信されることが保証されます。

既定では、SameSite の値はブラウザーで設定されていません。そのため、要求で送信される Cookie に制限はありません。 アプリケーションは、要件に応じて Lax または Strict を設定して、CSRF 保護をオプトインする必要があります。

SameSite の変更と認証への影響

最近行われた SameSite の標準への更新では、Lax に設定されている値が 1 つもない場合、SameSite の既定の動作を行うことでアプリを保護することが提案されています。 この軽減策は、 Cookie が、他のサイトから行われた GET 以外の HTTP 要求に制限されることを意味します。 また、送信される Cookie に対する制限を除去するために、None の値が導入されました。 これらの更新は間もなく、Chrome ブラウザーの今後のバージョンでリリースされる予定です。

Web アプリが応答モード "form_post" を使用して Microsoft ID プラットフォームで認証すると、ログイン サーバーは、トークンまたは認証コードを送信するために、HTTP POST を使用してアプリケーションに応答します。 この要求はドメイン間要求 (login.microsoftonline.com から自分のドメイン、たとえば https://contoso.com/auth) のため、お使いのアプリによって設定された Cookie は、Chrome の新しいルールに該当するようになりました。 クロスサイトのシナリオで使用する必要がある Cookie は、 statenonce の値を保持する Cookie で、これはログイン要求でも送信されす。 セッションを保持するために Microsoft Entra ID によって削除された他の Cookie があります。

Web アプリを更新しないと、この新しい動作によって認証エラーが発生します。

軽減策とサンプル

認証エラーが発生しないようにするために、Microsoft ID プラットフォームで認証を行う Web アプリで、Chrome ブラウザーでの実行時にクロスドメイン シナリオで使用される Cookie の SameSite プロパティを None に設定できます。 その他のブラウザー (完全な一覧についてはこちらを参照) は、SameSite の以前の動作に従い、SameSite=None が設定されている場合は Cookie が含まれません。 そのため、複数のブラウザーでの認証をサポートするには、Web アプリで、Chrome に対してのみ SameSite 値を None に設定し、他のブラウザーに対してはこの値を空のままにする必要があります。

このアプローチを次のサンプル コードで示します。

次の表は、ASP.NET と ASP.NET Core サンプルでの SameSite の変更を回避するプル要求を示しています。

サンプル Pull request
ASP.NET Core Web アプリの増分チュートリアル SameSite Cookie の修正 #261
ASP.NET MVC Web アプリのサンプル SameSite Cookie の修正 #35
active-directory-dotnet-admin-restricted-scopes-v2 SameSite Cookie の修正 #28

ASP.NET と ASP.NET Core で SameSite Cookie を処理する方法の詳細については、以下も参照してください:

次のステップ

SameSite と Web アプリのシナリオの詳細について学習します。