Skip to content

MS_SameSiteAttribute

nishi_74322014 edited this page Aug 3, 2026 · 2 revisions

SameSite属性の件

概要

SameSite 属性とは、

  • Cookie 関連の HTTP ヘッダで、

    • CSRF 対策(MS_CSRFCountermeasures.md)のために実装された。
    • 3rd Party Cookie のクロスサイトでの扱いを変更する属性。
    • Chrome では、SameSite=Lax に設定される。
  • 下記に影響が出るなど、

    • クロスサイトで POST 遷移した場合、Cookie が付与されない。
    • IFRAME を使用した場合、Cookie が付与されない。

認証界隈でも話題になっている。

詳細

これによる影響は、単純に、

  • SameSite 属性の値次第で、
  • クロスサイトの遷移の中で Cookie が送信されなくなる。

と言う事である。

影響の具体例

「クロスサイトの遷移の中で Cookie が送信されなくなる」ので、

一般的な問題

クロスサイトの遷移後、

  • 遷移先で未ログイン状態になる(Cookie 認証チケット。認証基盤を参照)。
  • 遷移先で情報が取得できず、機能が動作しなくなる(Session Cookie)。

※ 例えば、EC サイトのカート情報などが保持できなくなる。

などの問題が発生し得る。

IdPでの問題

以下の機能が動作しなくなる可能性がある。

いずれも「IdP が RP へ POST でリダイレクトして結果を返す」方式であり、
クロスサイトの POST 遷移そのものであるため、
SameSite=Lax の既定値では RP 側のセッション Cookie が送られなくなる。

トリガはブラウザの既定値の変更

以下のバージョンで、SameSite 属性が導入されている。

  • Chrome:version 51
  • Firefox:version 60
  • Edge:Windows 10 ビルド 17672 以降

Chrome 78-80以降

  • Chrome 78-79
    SameSite 属性値が Lax の場合、
    「2 分間は Cookie を送信する」と言う(よけい混乱する)独自動作を行う
    (Lax + POST の一時的な緩和措置)。

  • Chrome 80

    • SameSite 属性の既定値が None から Lax に変更された。

      特に、SameSite 属性が未指定の場合、
      SameSite 属性の既定値が None から Lax に変更される。

    • Secure 属性を付けず SameSite=None を指定した場合、
      Set-Cookie 自体が無効になったので、HTTP の場合は、
      HTTPS 化して、Secure 属性を付与する必要がある。

    • 新型コロナ対応

      • 2020/04/03(現地時間)、この仕様を一時的に撤回すると発表した。
      • 一方「Edge」などでは、この仕様変更が維持されている。

補足(最新化): 2020 年 4 月の撤回は一時的なもので、 同年 7 月に段階的な再展開が行われ、 現在は Chrome / Edge / Firefox のいずれも SameSite=Lax が既定である。 従って本ページの記述は「移行期の経緯」として読むべきで、 現行環境では既定 Lax を前提に設計する必要がある。

なお、Chrome 91 以降は「Lax + POST の 2 分間緩和」も廃止されている。

Firefox, Edge

  • Firefox … 既定 Lax 化
  • Edge 80(2020/02/10)より試験運用

影響への対応

  • クロスサイトの画面遷移の方法を変更するか、
  • 必要な部位に、SameSite=None を明示する
    (加えて、HTTPS 化して Secure 属性を付与する)。

補足: SameSite=None; Secure を付ける対象は、 「クロスサイトの遷移/埋め込みで送る必要がある Cookie だけ」に限る。 全 Cookie に一律付与すると、SameSite による CSRF 緩和効果を失う。

ASP.NET Core では以下のように設定する。

builder.Services.Configure<CookiePolicyOptions>(options =>
{
    options.MinimumSameSitePolicy = SameSiteMode.Unspecified;
});

builder.Services.AddAuthentication()
    .AddCookie(o => { o.Cookie.SameSite = SameSiteMode.None;
                      o.Cookie.SecurePolicy = CookieSecurePolicy.Always; });

なお、古いブラウザには SameSite=None未知の値として Strict 扱いする 実装(iOS 12 の Safari 等)があり、 User-Agent により属性を出し分けるワークアラウンドが必要だった時期もある。

参考


Tags: プログラミング, 通信技術, .NET開発, .NET Core, ASP.NET, ASP.NET Web API

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally