デバイスに束縛されたセッション資格情報

W3C 初回公開作業草案,

この文書についての詳細
この版:
https://www.w3.org/TR/2025/WD-dbsc-1-20250821/
最新公開版:
https://www.w3.org/TR/dbsc/
編集者草案:
https://w3c.github.io/webappsec-dbsc/
履歴:
https://www.w3.org/standards/history/dbsc-1/
フィードバック:
public-webappsec@w3.org 件名行 “[dbsc] … メッセージのトピック …” で送信(アーカイブ
GitHub
編集者:
(Google)
(Google)
(Google)

概要

デバイスに束縛されたセッション資格情報(DBSC)は、ユーザーエージェントが安全に保存された秘密鍵の所持を表明できるようにするプロトコル およびインフラストラクチャを構築することで、Cookie 窃取による乗っ取りを防ぐことを目指します。DBSC は、この束縛を実現するための、 ユーザーエージェントとサーバー間の Web API およびプロトコルです。

この文書のステータス

この節は、この文書が公開された時点でのステータスを説明します。 現在の W3C 公開物およびこの技術報告書の最新改訂版の一覧は、 W3C 標準および草案 インデックスで確認できます。

この文書は、Web Application Security Working Group により、Recommendation track を用いた 初回公開作業草案として公開されました。この 文書は W3C 勧告となることを意図しています。

この仕様についての議論には、(アーカイブ済みの)公開メーリングリスト public-webappsec@w3.org手順を参照) の利用が推奨されます。 メールを送信する際は、 件名に “dbsc” という文字列を入れてください。 できれば次のようにしてください: “[dbsc] …コメントの概要…

この文書は 初回公開作業草案 です。

初回公開作業草案としての公開は、 W3C およびそのメンバーによる支持を意味するものではありません。これは草案文書であり、 いつでも他の文書によって更新、置換、 または廃止される可能性があります。この 文書を作業中のもの以外として引用することは不適切です。

この文書は Web Application Security Working Group により作成されました。

この文書は、 W3C 特許ポリシーの下で運営されるグループによって作成されました。 W3C は、このグループの成果物に関連して行われた あらゆる特許開示の公開一覧 を管理しています。 そのページには、特許を開示するための手順も含まれています。 個人が、Essential Claim(s) を含むとその個人が信じる特許について実際の知識を有する場合は、 W3C 特許ポリシー第6節に従って情報を開示しなければなりません。

この文書は、2025年8月18日 W3C プロセス文書により管理されます。

1. 導入

この節は規範的ではありません。
これは執筆協力のみを目的とした、ごく初期の草案であることに注意してください

Web はステートレスなプロトコルの上に構築されています。特定の 機能について状態を維持するために、Web アプリケーションはユーザーのデバイス上にデータをローカルに保存します。この ストレージは長期間保持されることがあり、ログイン済みユーザーセッションの資格情報など、 セキュリティ上機密性の高いデータに用いられます。

一般に、ユーザーエージェントには、一般的な オペレーティングシステム上で、この種のデータをユーザーエージェント自体と同等の権限を持つソフトウェアに対して 安全に保存する方法がありません。同時に、このデータによって認証される操作は、 銀行口座から送金するなど、重大な結果をもたらす可能性があります。この モデルに対する一般的でスケーラブルな脅威は、そのような 資格情報を外部に持ち出し、別の場所で悪用を実行するマルウェアであり、それによって検出を回避します。

この文書は、セッション資格情報がデバイスからエクスポートされていないことを サーバーが検証できるようにする新しい API、Device Bound Sessions Credentials(DBSC)を定義します。 これらの資格情報は秘密鍵であるため、ユーザーエージェントは TPM や類似の API などの機能を使用して、 同等の権限を持つマルウェアからでも、それらを持ち出しから保護できます。

目標は、ユーザーに安全でセキュアな体験を提供しつつ、 ユーザーがすでに慣れ親しんでいるユースケースを提供することです。同時に、 このプロトコルによって新しいプライバシー識別子が漏えいしないようにし、 ユーザーのプライバシーが尊重されることを確保したいと考えています。この API は、既存の サーバー側認証スタックと容易に統合できるように特に配慮しており、Web ソフトウェアスタックの大部分を 書き換える必要のない、そのような保護への段階的な導入経路を提供します。

2. セキュリティ上の考慮事項

DBSC の目標は、長寿命の Cookie ベアラートークンに代わるものを提供することで セッション窃取を減らし、セッション認証を、持ち出しに対して より適切に保護できる秘密鍵に基づかせることです。 これにより、マルウェアはローカルで動作せざるを得なくなり、 検出および緩和が容易になるため、ユーザーの ID が悪用される可能性が低くなり、 インターネットはユーザーにとってより安全になります。

ユーザーエージェント実装は、そのような秘密鍵を持ち出しから保護する最善の方法を選択する責任があります。 その際には、異なるプラットフォームに存在するマルウェア脅威の種類、および存在する保護機構を考慮します。 これには、TPM やセキュアエレメントなどのセキュアハードウェア、セキュアな鍵生成および管理のための OS 提供 API、またはローカルで実行されるマルウェアに対して合理的な保護を提供する プロセス分離機構が含まれますが、これらに限定されません。

セッションが有効であり、侵害されていないデバイスに登録されている限り、 ホストは、セッション鍵が別のデバイスへの悪意ある持ち出しから保護されていることを 暗号学的確実性をもって知ることができます。

2.1. 非目標

DBSC は、攻撃者がユーザーのデバイス上に常駐している間のブラウザーセッションへの一時的なアクセスを 防ぎません。秘密鍵は、現代のオペレーティングシステムが許す限り安全に保存されるべきであり、 セッション秘密鍵の持ち出しを防ぎますが、署名機能はおそらく、 ユーザーのデバイス上でそのユーザーとして実行される任意のプログラムから引き続き利用可能です。

DBSC はまた、セッション登録時に攻撃者がユーザーエージェントを置き換えている、または それに注入している場合の攻撃も防ぎません。攻撃者は、そのセッションを TPM に束縛されていない鍵、 または攻撃者が永続的に制御する TPM に束縛できるためです。

DBSC は、セッションが登録された特定のデバイスやそのデバイスの状態について、 ホストに何らかの保証を与えるようには設計されていません。

3. プライバシー上の考慮事項

DBSC プロトコルのプライバシー上の目標は、ユーザー追跡のための追加の表面を導入しないことです。 この API を実装すること(ブラウザーの場合)または有効にすること(Web サイトの場合)は、 重大なユーザープライバシー上のトレードオフを伴うべきではありません。

これを確保するために取られている考慮事項の一部:

3.1. Cookie に関する考慮事項

サイトがこの API を使用して、同一オリジンポリシー、3P Cookie ポリシーなどを 回避することは不可能であるべきです。現在および変化しつつある Cookie の挙動の複雑さと、DBSC と Cookie の密接な統合により、現在の 解決策は、各ユーザーエージェントが Cookie に使用するのと同じポリシーを DBSC にも使用することです。 ユーザー設定、適用されたポリシー、またはユーザーエージェント実装の詳細に基づき、 DBSC Cookie 資格情報がネットワークリクエストに適用されない場合、 追加の DBSC の挙動も同様に適用されません。これにより、DBSC の実装による 新しいプライバシー挙動がないことが確保されます。

3.2. タイミングサイドチャネル漏えい

サードパーティ Cookie が有効な場合、攻撃者はリクエストにかかる時間を測定することで、 ユーザーが認証済みかどうかを判定できる可能性があります。 これは、更新がかなり遅い場合があるためであり、特に鍵保護のための低速な 基盤機能(例: TPM)に依存している場合に当てはまります。

これは、セッション設定内の allowed_refresh_initiators キーによって緩和されます。 このキーは、DBSC 更新をトリガーできるサイトを厳格に制限するために使用できます。 これは既存の解決策(例: X-Frame-Options)では置き換えられません。既存の解決策は リクエストが完了した後にのみ適用されるのに対し、DBSC はリクエストが開始される前に 更新するかどうかを選択しなければならないためです。

3.3. フェデレーションセッション

多くのサイトは、ブラウザーの関与しないフェデレーションログイン機構を使用しており、 多くの場合リンクデコレーション(例: OIDC)に依存しています。DBSC の 容易な導入という目標を達成するため、これらのサイトが認証フローを全面的に書き換えることなく、 Cookie 窃取から自らを保護できるようにしたいと考えています。理想的には、 Relying Party(RP)は Identity Provider(IdP)とは独立して DBSC セッションを確立できるはずです。 残念ながら、ほとんどの IdP は、ユーザーがすでにログインしている場合にはパスワードを要求しません。 ユーザー操作が要求されない場合、マルウェアはユーザーのマシンへの一時的なアクセスを利用して ログインフローを模倣し、マルウェアが作成して持ち出し可能な新しい秘密鍵で DBSC セッションを 確立できます。これは DBSC のセキュリティ目標に反します。

DBSC はログインや ID に本質的に結び付いているわけではないため、Identity Provider という用語は 最も正確ではありません。代わりに Session Provider(SP)という用語を使用しますが、 対象ユースケースでは SP と IdP が同じ主体であることを想定しています。

RP のセッションを保護するためには、RP と SP のセッションを何らかの方法で関連付ける必要があります。 これを行う最も単純な方法は、SP と RP が同じセッション鍵ペアを使用することです。 SP のセッションはマルウェアがデバイスを侵害する前に確立されたと仮定するため、 秘密鍵が安全に保存されていると信頼します。しかし、サイト間で鍵を共有することには 複雑なプライバシー特性があります。高エントロピー識別子を共有するプライバシーリスクを緩和するため、 RP が SP のセッションの公開鍵とセッション識別子をすでに知っていることを要求します。 RP は、SP URL、セッション識別子、および base64 エンコードされた JWK thumbprint([RFC4648] および [RFC7638] を参照)を `Secure-Session-Registration` ヘッダーに含めます。鍵が正しい場合、ユーザーエージェントは SP 上のセッションと同じ鍵を用いて RP 上にセッションを作成します。

悪意ある RP と SP が協力し、本来 RP と SP が情報を共有できない場合 (例: フィンガープリンティングやリンクデコレーションに対する保護がある場合)にユーザーを 識別しようとする潜在的なリスクもあります。RP は一致が見つかるまで多くの公開鍵を推測するだけで、 ユーザーに対する一意の識別子を得られます。これにより、協力する RP と SP は、 サイト間 ID 連携の意図された仕組みの外で、サイト間でユーザーの ID を共有できるようになります。 これを防ぐため、ユーザーエージェントは登録試行に対して大きなバックオフまたはクォータを含めるべきです (これは TPM に対するサービス拒否を避けるためにも推奨されます)。なお、DBSC のセキュリティ特性は、 2 人のユーザーが同じ鍵ペアを持つことは困難であるという暗号学的仮定に依存しているため、 ユーザーが SP 上で特定の DBSC 公開鍵を持っているかどうかを問い合わせることは、 1 ビット未満のエントロピーです。

ユーザーのマスク解除に成功した場合の価値をさらに制限するため、 .well-known を通じた SP からのオプトインも要求します。ブラウザーは、そのリスト内の RP オリジン数を制限すべきです。また、RP が複数の SP を使用してその方法で ID を集約することも 防ぐ必要があります。そのために、RP にも .well-known 内で SP を宣言することを要求します。 これらを組み合わせることで、大規模なサイト群が協力して、高価値ユーザーが Web を閲覧する際に そのユーザーをマスク解除することを防ぎます。

example.com の所有者が example.co.uk も運営しているとします。ログインは常に example.com で行われ、リンクデコレーションを通じて example.co.uk に伝播します。 DBSC セッションで両方のサイトを保護するため、example.com は既存の `Secure-Session-Registration` ヘッダーを引き続き使用すべきです:
Secure-Session-Registration: (ES256);path="/register";challenge="challenge"

DBSC セッションを example.com.uk に拡張する際、サイトは `Secure-Session-Registration` ヘッダーに新しいパラメーターを追加すべきです:

Secure-Session-Registration: (ES256);path="/register";challenge="challenge";provider_key="abc";provider_id="example.com id";provider_url="https://example.com"

example.comexample.co.uk が適切な .well-known エントリを持っていると仮定すると、これにより example.co.ukexample.com 上のセッションと同じ鍵を使用して新しい DBSC セッションを登録します。 これにより、ログイン時にユーザーが example.com で再認証することを要求せずに、 DBSC が example.co.uk を保護できます。

4. 検討された代替案

4.1. WebAuthn とサイレント・メディエーション

WebAuthn はサイトに一定の鍵管理機能を提供するため、DBSC と同じ目標を満たすように 拡張できる可能性があります。このアプローチを採用しないのは、WebAuthn が対話的なユーザーサインインに 焦点を当てているため、その API のいくつかの特性が DBSC のような機能の目標と相反するからです。 たとえば、WebAuthn 資格情報は特定のセッションに結び付いていません。それらは 長寿命であることを意図しており、サイトデータと一緒には消去されません。これは、セッション 鍵に必要なプライバシー特性とうまく整合しません。同様に、WebAuthn 資格情報は明示的なユーザーの 意図を伴って使用するよう設計されています。DBSC が提供する機能を WebAuthn に包含させるよう拡張するには、 WebAuthn がサイレントに使用できる別種の鍵を確立する必要があります。これは WebAuthn と DBSC の双方に 追加の複雑さをもたらします。代わりに、WebAuthn は安全なサインインを提供することを目的とし、 DBSC はサインイン後にユーザーを保護する補完的なものだという立場を取ります。

5. サーバーに関する考慮事項

DBSC を使用するには、サイト所有者は 2 つの新しいエンドポイント、 登録エンドポイントと更新エンドポイントを確立する必要があります。

登録エンドポイントは、ブラウザーが `Secure-Session-Registration` ヘッダーを受け取った後、非同期に接続されます。このエンドポイントは次を行うべきです:

更新エンドポイントははるかに機密性が高いものです。このエンドポイントは、 期限切れの束縛 Cookie を伴うリクエストが行われるたびに接続され、その応答は 元のリクエストをブロックします。応答に失敗する、または束縛 Cookie を復元できない場合、 ブラウザーエージェントはサービス拒否防止機構を開始したり、セッションを終了したりする可能性があります。 どちらも、将来のリクエストが束縛 Cookie なしで行われることにつながり得ます。このエンドポイントに期待される挙動は:

ブラウザーは、DBSC を採用するサイトのレイテンシコストを最小限に抑えようとして、 セッションを事前に更新することを選択できます。サイトは、更新が束縛 Cookie の期限切れ時にのみ 発生すると想定すべきではありません。

クロスサイト fetch が許可されている場合、更新エンドポイントはタイミングサイドチャネルを通じて ログイン状態を直接漏えいする可能性があります。サーバーは、有効な `Sec-Secure-Session-Id` ヘッダーを確認することで、受信リクエストが ユーザーエージェントによって開始されたものであり、クロスサイトリクエストではないことを確保できます。 このエンドポイントには狭い CORS ポリシーを設定し、クロスサイトオリジンが資格情報付きリクエストを 行うことを許可しないことも推奨されます。DBSC の CORS 統合は、遅延された リクエストが資格情報を含む場合に暗黙的に資格情報を含めることで、これを可能にするように設計されています。 同様の理由から、更新エンドポイントが X-Frame-Options または Cross-Origin-Resource-Policy ヘッダーによる埋め込みを拒否することも推奨されます。

example.com に 2 つのエンドポイントがあるとします:

このサイトは、DBSC によって /authenticated へのクロスサイトリクエストを保護したいと考えており、 この 1 つのエンドポイントにおけるタイミングサイドチャネルのリスクは最小限であると考えています。 ユーザーエージェントによってトリガーされる更新リクエストについて資格情報を暗黙的に許可しなかった場合、 /refresh は任意の要求元オリジンに対して Access-Control-Allow-Credentials を返す必要があります。そうすると、攻撃者は /refresh を直接 fetch することでログイン状態を漏えいさせることができます。

DBSC の /refresh への呼び出しは資格情報を暗黙的に許可するため、/refresh エンドポイントは Access-Control-Allow-Credentials を決して返さないように拒否できます。 それでも、DBSC 更新のコンテキストでは資格情報付きリクエストを受け取ります。他の サイトは、資格情報付きでそのエンドポイントを直接 fetch できなくなり、 ログイン状態の容易なクロスサイト漏えいを防ぎます。

DBSC でフェデレーションログインを使用するサイト(§ 3.3 フェデレーションセッション を参照)は、 フェデレーション鍵を持つセッションのみが受け入れられるようにすべきです。フェデレーション セッションのセキュリティは、Session Provider(SP)ログイン時にマシンが侵害されていないことに依存します。 なぜなら、マルウェアはマシンへの一時的なアクセスを利用して、Relying Party(RP)上に新しい鍵で セッションを登録できるためです。したがって RP は、SP から受け取った適切な公開鍵で登録された セッションのみを受け入れるべきです。

6. ユーザーエージェントに関する考慮事項

DBSC は、Cookie 更新をスケジュールするための多くの柔軟性をブラウザーに提供します。 これにより DBSC のレイテンシを緩和し、TPM とサーバーへの負荷を下げることができます。 ユーザーエージェントには、次の方法で Cookie 更新をスケジュールすることを推奨します:

7. フレームワーク

この文書では、[RFC5234] で定義され、[RFC7405] で更新された ABNF 文法を用いて構文を指定します。 これに加えて、 第 7 節で定義された #rule 拡張、 [RFC9112]、 および同じ文書の 第 3.2.6 節 で定義された quoted-string 規則も用います。

この文書は、そのアルゴリズムおよび本文で使用される多数の基礎概念について Infra Standard に依存します [INFRA]

7.1. セッションストア

ユーザーエージェントは セッション ストアを維持します。これは、登録可能ドメインからID 別セッションマップへの 順序付きマップです。セッションはユーザーエージェントの再起動を越えて 永続化すべきです。

7.2. ID 別セッション

ID 別セッションマップは、 与えられた登録可能ドメインについて、 セッション識別子からデバイス束縛セッションへの 順序付き マップです。

7.3. デバイス束縛セッション

デバイス束縛 セッションは、次の 項目を持つ 構造体です:
セッション識別子

登録可能ドメイン上のセッションの一意識別子である 文字列

更新 URL

セッションを更新するために使用される URL を表す 文字列

キャッシュされたチャレンジ

このセッションの次のチャレンジとして使用される 文字列または null

セッションスコープ

このセッションのスコープ内にあるURLを定義する セッションスコープ

セッション資格情報

セッションで使用される、JSON セッション資格情報から派生した セッション 資格情報リスト

有効期限タイムスタンプ

このセッションが削除されるべき 瞬間

セッション鍵ペア

セッションで使用される鍵ペア。秘密鍵は 安全な方法で保存されるべきです(§ 2 セキュリティ上の 考慮事項を参照)。

許可された更新開始元

DBSC 更新を開始することを許可されるホストを記述する 文字列リスト。 詳細は § 8.3 リクエストが更新を許可するかを識別する を参照してください。

7.4. セッションスコープ

セッションスコープは、次の 項目を持つ 構造体です:
オリジン

このセッションが登録された オリジン

サイトを含める

セッションがサイト全体に適用されるか、オリジンのみに適用されるかを示す ブール値

スコープ指定

セッションで使用される スコープ 指定リスト

7.5. スコープ指定

スコープ指定は、次の 項目を持つ 構造体です:
type

この構造体で定義される項目をスコープに追加するか削除するかを定義する、 "include" または "exclude" のいずれかである 文字列

host

このスコープ指定が適用されるために一致しなければならないドメインまたはドメインパターンを定義する 文字列

path

このスコープ指定のパス部分を定義する 文字列

7.6. セッション資格情報

セッション資格情報は、次の 項目を持つ 構造体です:
name

資格情報 Cookie の名前を定義する 文字列

attributes

資格情報 Cookie のその他の属性を定義する 文字列。 ユーザーエージェントはここで、Cookie に対して提供するのと同じデフォルトを提供すべきです。

7.7. 登録可能オリジンラベル

ドメイン登録可能オリジン ラベルは、そのドメイン登録可能ドメインにおける最初の ドメイン ラベル、または 登録可能ドメインが null の場合は null です。たとえば、 co.ukde の両方がパブリックサフィックスである場合、example.co.ukwww.example.de の両方の登録可能オリジンラベルexample です。

8. アルゴリズム

8.1. セッションを識別する

このアルゴリズムは、ユーザーエージェント上に存在するすべての セッションの中からセッションを識別する方法を記述します。 セッション識別子は、 登録可能ドメイン内で一意です。

URLurl)とセッション識別子session identifier)が与えられた場合、このアルゴリズムはデバイス束縛セッションを返し、 そのようなセッションが存在しない場合は null を返します。

  1. domain を、urlhost登録可能ドメインとします。

  2. ユーザーエージェントのセッションストアdomain含まない場合、 null を返します。

  3. domain sessions を、ユーザーエージェントのセッションストア[domain] を ID 別 セッションマップとして表したものとします。

  4. domain sessions[session identifier] を、null を デフォルトとして返します。

8.2. URL がセッションのスコープ内にあるかを識別する

このアルゴリズムは、URLURL)と デバイス束縛 セッションsession)が与えられた場合に、 URL がスコープ内にあるかを 判定する方法を記述します。URL がスコープ内にある場合は "include" を返し、 それ以外の場合は "exclude" を返します。
  1. scopesessionセッションスコープとします。

  2. scopeサイトを含めるが true の場合、 URLオリジンscopeオリジンsame siteでないなら "exclude" を返します。

  3. scopeサイトを含めるが false の場合、 URLオリジンscopeオリジンsame originでないなら "exclude" を返します。

  4. URLsession更新 URLに一致する場合、"exclude" を返します。

  5. scopeスコープ指定内の各 scope specification について反復します:

    1. host patternscope specificationhostpath patternscope specificationpathとします。

    2. URLhosthost pattern に対して § 8.4 ホストがパターンに一致するかを識別する を実行した結果が false の場合、 継続します。

    3. 次のいずれかが成り立つ場合、scope specificationtypeを返します:

      1. URLpathpath pattern と完全に一致する。

      2. path pattern が '/' で終わり、URLpathpath pattern で始まる。

      3. URLpathpath pattern の後に '/' が続く形で始まる。

  6. "include" を返します。

8.3. リクエストが更新を許可するかを識別する

このアルゴリズムは、リクエストrequest)とデバイス束縛セッションsession)が与えられた場合に、その リクエストがデバイス束縛セッションの更新をトリガーすることを許可されているかを 判定する方法を記述します。 request が更新をトリガーできる場合は "allowed" を返し、 それ以外の場合は "disallowed" を返します。
  1. sessionセッションスコープサイトを含める が true であり、かつ requestオリジンsessionセッションスコープオリジンsame siteである場合、"allowed" を返します。

  2. sessionセッションスコープサイトを含める が false であり、かつ requestオリジンsessionセッションスコープオリジンsame originである場合、"allowed" を返します。

  3. session許可された更新開始元内の各 initiator pattern について反復します:

    1. requestオリジンhostinitiator pattern に対して § 8.4 ホストがパターンに一致するかを識別する を実行した結果が true の場合、"allowed" を返します。

  4. "disallowed" を返します。

8.4. ホストがパターンに一致するかを識別する

このアルゴリズムは、hosthost)と 文字列pattern)を入力として受け取り、 ホストがパターンに一致するかを判定する 方法を記述します。patternhost をカバーする場合、true を返します。
  1. pattern が '*' と等しい場合、true を返します。

  2. host string を、直列化された host とします。

  3. pattern が '*' で始まり、かつ hostドメインである場合:

    1. pattern が '*.' で始まらない場合、false を返します。

    2. host stringpattern の最初の文字を除いたすべてで 終わる場合、true を返します。

  4. host stringpattern と等しい場合、true を返します。

パターン一致の例:
  • example.com* に一致します

  • example.comexample.com に一致します

  • example.com*.example.com に一致しません

  • subdomain.example.com*.example.com に一致します

8.5. 更新を必要とするセッションを識別する

リクエストrequest)が与えられた場合、 このアルゴリズムは更新を必要とするセッションを識別する方法を記述します。 そのようなセッションが存在する場合、それは request の進行をブロックすべきです。
  1. domain を、requesturlhost登録可能ドメインとします。

  2. ユーザーエージェントのセッションストアdomain含まない場合、 null を返します。

  3. domain sessions を、ユーザーエージェントのセッションストア[domain] を ID 別 セッションマップとして表したものとします。

  4. domain sessions 内の各 session について 反復します:

    1. session有効期限タイムスタンプが 現在より前である場合、 sessiondomain sessions から削除し、継続します。

    2. idsessionセッション識別子とします。

    3. タプルdomain, id)が request遅延されたデバイス束縛セッション ID内にある場合、継続します。

    4. requestURLsession に対して § 8.2 URL がセッションのスコープ内にあるかを識別する の手順を実行します。結果が "include" でない場合、継続します。

    5. requestsession に対して § 8.3 リクエストが更新を許可するかを識別する の手順を実行します。結果が "allowed" でない場合、継続します。

    6. requestsessionセッション資格情報に対して § 8.6 セッション資格情報が欠落しているかを識別する の手順を実行します。 結果が false の場合、継続します。

    7. domain, id)を request遅延されたデバイス束縛 セッション IDに追加します。

    8. session有効期限タイムスタンプを 将来のタイムスタンプに設定します。 有効期限タイムスタンプの正確な選択はユーザーエージェントに委ねられます。 最大 Cookie 有効期間に合わせることが推奨されます。

    9. session を返します。

  5. null を返します。

8.6. セッション資格情報が欠落しているかを識別する

このアルゴリズムは、リクエストrequest)と セッション資格情報リストcredentials)が与えられた場合に、 リクエストがセッション資格情報を欠落しているかを識別する 方法を記述します。credentials 内のいずれかの credentialrequest 上で欠落しているかどうかを示す ブール値 を返します。
  1. credentials 内の各 credential について 反復します:

    1. credentialattributesを持つ Cookie が request に添付されない場合(第 5.4 節 of [COOKIES] を参照)、継続します。

    2. requestヘッダーリストが、 次のすべての条件を満たす cookie を含む場合、継続します:

      1. cookie の名前が credentialnameと一致する。

      2. cookie の次のすべての属性が、 credentialattributes内のものと一致する: Domain, Path, Secure, HttpOnly, SameSite。

    3. true を返します。

  2. false を返します。

8.7. チャレンジをキャッシュする

このアルゴリズムは、HTTP ヘッダーで受信したチャレンジを 処理する方法を記述します。

応答response)が与えられた場合、このアルゴリズムは デバイス束縛 セッションキャッシュされたチャレンジを更新します。

  1. header name を "Secure-Session-Challenge" とします。

  2. challenge list を、responseヘッダーリストから、header name と "list" を与えて構造化 フィールド値を取得するを実行した結果とします。

  3. challenge list が null の場合、return します。

  4. challenge list 内の各(challenge, params)について 反復します:

    1. challenge の型が sf-stringでない場合、 継続します。

    2. session id を null とします。

    3. params["id"] が存在し、かつ sf-stringである場合、session idparams["id"] に設定します。

    4. session id が null の場合、継続します。

    5. session を、responseURLsession id を与えて § 8.1 セッションを識別するを実行した結果とします。

    6. session が null の場合、継続します。

    7. sessionセッション資格情報内の 各 credential について反復します:

      1. credentialattributesを持つ Cookie が response によって設定できない場合( 第 5.3 節 of [COOKIES] を参照)、継続します。

      2. challenge を、このデバイス束縛 セッションから次回 DBSC proofが送信される際に使用される sessionキャッシュされたチャレンジとして 保存します。

      3. Breakします。

8.8. リクエストを送信する

このアルゴリズムは、デバイス束縛セッションの登録または更新のために リクエストを送信する 方法を記述します。入力として、リクエストoriginating request)、key pairURLdestination)、 および任意の文字列 session id, challenge, および authorizationを受け取ります。

ユーザーエージェントは、束縛資格情報が欠落している場合には常にこれらの手順を実行しますが、 任意の時点でこれを行ってもよい(MAY)です。束縛資格情報の期限切れ前に事前にリクエストを送信すると、 DBSC のレイテンシコストを最小限にできます。

  1. ユーザーエージェントは、ユーザーまたはサイトに対するサービス拒否を防ぐため、 このリクエストをスキップしてもよい(MAY)です。たとえば、このセッションが過剰な TPM 操作を要求している場合(ユーザーに害を与える)、または更新 エンドポイントに最近到達できなかった場合(サイトに対するサービス拒否リスク)に起こり得ます。 ユーザーエージェントがこれを選択した場合、originating request、適切なトークン( § 9.5 `Secure-Session-Skipped` HTTP ヘッダー フィールドの選択肢を参照)、および session id を用いて § 8.12 デバッグヘッダーを追加する の手順を実行し、これをサイトに示すべきです。

  2. terminate the session を、次の手順を持つアルゴリズムとします:

    1. session id が null の場合、return します。

    2. そのようなセッションが見つかった場合、destinationhost登録可能ドメインと識別子 session id を持つセッションを、 ユーザーエージェントのセッションストアから削除します。

  3. originating requestURLオリジンdestinationオリジンsame siteでない場合、return します。

  4. signed challenge を null とします。challenge または authorization が non-null の場合、DBSC proofを作成し、key pair で署名し、その 結果を signed challenge に保存します。

  5. HTTP fetchで使用するための request を作成します。

  6. requestmethodを "POST" に設定します。

  7. requestURLdestination に設定します。

  8. requestredirect modeを "follow" に設定します。

  9. signed challenge が non-null の場合、 ("Secure-Session-Response", signed challenge) ヘッダーを requestヘッダーリストappendします。

  10. session id が non-null の場合、 ("Sec-Secure-Session-Id", session id) ヘッダーを requestヘッダーリストappendします。

  11. authorization が non-null の場合、 ("Authorization", authorization) ヘッダーを requestヘッダーリストappendします。

  12. requestinitiatororiginating requestinitiatorに設定します。

  13. requestoriginoriginating requestoriginに設定します。

  14. response を、request に対して HTTP fetchを実行した結果とします。

  15. responseネットワークエラーである、または responsestatusが 407 または 429 の場合、return します。

  16. responsestatusが 300 以上 400 未満である場合、 return します。

  17. responsestatusが 403 の場合:

    1. session id が null の場合、return します。

    2. session を、destinationsession id に対して § 8.1 セッションを識別するの手順を実行した結果とします。

    3. session が null の場合、return します。

    4. それ以外の場合、元の入力を用いてこのアルゴリズムを再開しますが、 challengesessionキャッシュされたチャレンジで置き換えます。

  18. responsestatusが 400 以上 500 未満である場合、 terminate the session を行い、return します。

  19. responsestatusが 500 以上である場合、 return します。ユーザーエージェントは、更新エンドポイントの 一時的な停止による害を制限するために、このセッションに対する 以後の更新リクエストでバックオフ機構をトリガーすることを選択できます。

  20. session id が non-null であり、かつ responsebodyが 空である場合、return します。

  21. responsedestinationsession id、および key pair に対して § 8.9 セッションを作成するを呼び出します。

8.9. セッションを作成する

destinationURL)への 登録リクエストに対するresponse応答)により、 session id文字列または null)について key pair を用いて セッションを作成するには、 次の手順を実行します:
  1. terminate the session を、次の手順を持つアルゴリズムとします:

    1. session id が null の場合、return します。

    2. そのようなセッションが見つかった場合、destinationhost登録可能ドメインと識別子 session id を持つセッションを、 ユーザーエージェントのセッションストアから削除します。

  2. JSON session を、responsebodyJSON セッション指示として解析した結果とします。 解析に失敗した場合、terminate the session を行い、return します。これには、すべての必須キーが 存在することの検証が含まれます。

  3. JSON sessioncontinueが false の場合、 terminate the session を行い、return します。

  4. session identifierJSON sessionsession_identifierとします。

  5. JSON scopeJSON sessionscopeとします。

  6. origin を、JSON scopeoriginが存在する場合はそこから構築される オリジン、存在しない場合は destination のオリジンとします。

  7. JSON sessionrefresh_urlが 値を持たない場合、refresh URLdestination とします。

  8. それ以外の場合、refresh URL を、JSON sessionrefresh_urlの値を用いて destination を解決した結果とします。

  9. 次の検証を実行します。いずれかが失敗した場合、 terminate the session を行い、return します。

    1. session id が non-null の場合、それは session identifier と一致しなければなりません。

    2. origin は有効な non-opaque オリジンでなければなりません。

    3. origindestinationオリジンsame siteでなければなりません。

    4. refresh URL は HTTPS スキームを持つか、localhost でなければなりません。

    5. refresh URLオリジンdestinationオリジンsame siteでなければなりません。

    6. すべてのJSON セッション資格情報は 属性 "Partitioned" を持ってはなりません。

  10. destination domain を、destinationhost登録可能ドメインとします。

  11. JSON scopeinclude_siteが true の場合、 次の検証を実行します。いずれかが失敗した場合、terminate the session を行い、return します。

    1. originhostdestination domain と等しくなければなりません。

    2. destination domaindestinationhostと等しい場合、 この手順内の残りのすべての検証をスキップします。

    3. session id が non-null の場合、この手順内の残りのすべての検証を スキップします。

    4. それ以外の場合、well known URLdestination のコピーとし、 hostdestination domain に置き換え、 pathを "/.well-known/device-bound-sessions" に置き換えたものとします。

    5. well known responsewell known URL を fetch した結果とします。

    6. well known responsestatusは 200 でなければなりません。

    7. well known responsebodyは JSON エンコードされた 辞書でなければなりません。

    8. well known responsebodyはキー "registering_origins" を含まなければなりません。

    9. キー "registering_origins" の値は destination のオリジンを含まなければなりません。

  12. session を新しいセッションとします。

  13. sessionセッション識別子session identifier に設定します。

  14. session更新 URLrefresh URL に設定します。

  15. sessionセッションスコープを、 オリジン origin と、 サイトを含めるとして JSON scopeinclude_siteの値を持つ新しいスコープに設定します。

  16. JSON scopescope_specification内の各 JSON scope rule について反復します:

    1. scope rule を新しいスコープ指定とします。

    2. scope ruletypeJSON scope ruletypeに設定します。

    3. scope rulehostJSON scope ruledomainに設定します。

    4. scope rulepathJSON scope rulepathに設定します。

    5. scope rulesessionセッションスコープスコープ指定に追加します。

  17. JSON sessioncredentials内の各 JSON session credential について反復します:

    1. session credential を新しいセッション資格情報とします。

    2. JSON session credentialtypeが "cookie" でない場合、terminate the session を行い、return します。

    3. session credentialnameJSON session credentialnameに設定します。

    4. session credentialattributesJSON session credentialattributesに設定します。

    5. session credentialsessionセッション資格情報に追加します。

  18. sessionセッション鍵ペアkey pair に設定します。

  19. session許可された更新開始元JSON sessionallowed_refresh_initiators に設定します。

  20. session有効期限タイムスタンプを将来の タイムスタンプに設定します。 有効期限タイムスタンプの正確な選択はユーザーエージェントに委ねられます。 最大 Cookie 有効期間に合わせることが推奨されます。

  21. sessionセッション資格情報内の各 credential について反復します:

    1. credentialattributesを持つ Cookie が response によって設定できない場合(第 5.3 節 of [COOKIES] を参照)、継続します。

    2. 既存のセッションを削除するため、terminate the session を呼び出します。

    3. ユーザーエージェントのセッションストア[destination domain][session identifier] を session に設定します。

    4. Breakします。

8.10. セッション登録を処理する

リクエストrequest)に対する応答response)により セッション登録を処理するには、次の手順を実行します:
  1. header name を "Secure-Session-Registration" とします。

  2. registration list を、responseヘッダーリストから、header name と "list" を与えて構造化 フィールド値を取得するを実行した結果とします。

  3. registration list が null の場合、return します。

  4. registration list 内の各(registration entry, params) について反復します:

    1. registration entrysf-inner-listでない場合、 継続します。

    2. params["path"] が存在しない、または型が sf-stringでない場合、 継続します。

    3. pathparams["path"] とします。

    4. challenge を null とし、authorization を null とします。

    5. params["challenge"] または params["authorization"] のいずれかが存在するが 型が sf-stringでない場合、継続します。

    6. params["challenge"] が存在する場合、challengeparams["challenge"] に設定します。

    7. params["authorization"] が存在する場合、authorizationparams["authorization"] に設定します。

    8. endpoint を、response の URL に相対的に path を解決した結果とします。

    9. key pair を、 registration entryparams、および endpoint に対して § 8.11 セッション鍵ペアを作成するを実行した結果とします。

    10. key pair が null の場合、return します。

    11. requestkey pairendpoint、 session identifier として null、challenge、および authorization を用いて § 8.8 リクエストを送信するを呼び出します。

8.11. セッション鍵ペアを作成する

このアルゴリズムは、Relying Party と Session Provider 間の鍵共有を含め、 セッション鍵ペアを 作成する方法を記述します。入力として、 `Secure-Session-Registration` ヘッダーの registration entryparams、および 登録エンドポイントのURLregistration URL)を受け取ります。 セッションで使用する鍵ペア、または鍵が不可能な場合は null を返します。
  1. algorithm list を空のリストとします。

  2. registration entry 内の各 algorithm について反復します:

    1. algorithmsf-tokenでない場合、継続します。

    2. algorithm が `Secure-Session-Registration` でサポートされる暗号アルゴリズムを表し、かつこのクライアントでサポートされる場合、 algorithmalgorithm list に追加します。

  3. algorithm list が空の場合、null を返します。

  4. params["provider_key"]、params["provider_id"]、または params["provider_url"] のいずれかが存在する場合:

    1. 3 つのキーのいずれかが欠落している場合、null を返します。

    2. permission を、 "device-bound-session-key-sharing" について 使用許可を要求するを実行した結果とします。

    3. permission"denied" の場合、null を返します。

    4. provider URL を、 params["provider_url"] から構築される URL とします。

    5. provider originprovider URLオリジンとします。

    6. provider origin が opaque の場合、null を返します。

    7. provider domain を、 provider URLhost登録可能ドメインとします。

    8. provider identifierparams["provider_id"] とします。

    9. provider session を、ユーザーエージェントの セッション ストア[provider domain][provider identifier] 内のセッションとします。

    10. provider session が null の場合、null を返します。

    11. provider sessionセッションスコープオリジンprovider originsame originでない場合、null を返します。

    12. provider sessionセッション鍵ペアの JWK thumbprint( [RFC7638] を参照)が、 base64 でエンコードした際([RFC4648] を参照)に params["provider_key"] と一致しない場合、null を返します。

    13. provider well known URLprovider URL のコピーとし、 pathを "/.well-known/device-bound-sessions" に置き換えたものとします。

    14. provider well known responseprovider well known URL を fetch した結果とします。次のいずれかが成り立つ場合、null を返します:

      1. provider well known responsestatusが 200 でない。

      2. provider well known responsebodyが JSON エンコードされた 辞書でない。

      3. provider well known responsebodyがキー "provider_origin" を含む。

      4. provider well known responsebodyが キー "relying_origins" を含まない。

      5. キー "relying_origins" の値が registration URLオリジンを含まない。

    15. ユーザーエージェントは、悪用を防ぐため、 "relying_origins" 内の 登録可能オリジンラベル数に上限を設けるべきです。

    16. relying well known URLregistration URL のコピーとし、 pathを "/.well-known/device-bound-sessions" に置き換えたものとします。

    17. relying well known responserelying well known URL を fetch した結果とします。次のいずれかが成り立つ場合、null を返します:

      1. relying well known responsestatusが 200 でない。

      2. relying well known responsebodyが JSON エンコードされた 辞書でない。

      3. relying well known responsebodyがキー "relying_origins" を含む。

      4. relying well known responsebodyが キー "provider_origin" を含まない。

      5. キー "provider_origin" の値が provider URLオリジンでない。

    18. provider sessionセッション鍵ペアを返します。

  5. algorithm list のために作成された新しい鍵ペアを返します。

8.12. デバッグヘッダーを追加する

ユーザーエージェントがセッションを適用しないことを選択した場合にサイトが理解できるようにするため、 ユーザーエージェントは、リクエストrequest)に、 sf-tokentoken)および文字列session id)を用いて デバッグヘッダーを追加するべきです。
  1. value を、値 token を持つ sf-token とします。

  2. value 上の sf-parameter "session_identifier" を session id に設定します。

  3. skipped header value を、requestヘッダーリストと、 ヘッダー名 "Secure-Session-Skipped"、型 "list" を用いて構造化フィールド値を取得する 手順を実行した結果とします。

  4. skipped header value が null の場合、空の sf-list に設定します。

  5. valueskipped header value に追加します。

  6. requestヘッダーリスト上で、 ("Secure-Session-Skipped", skipped header value) を与えて 構造化フィールド値を設定する 手順を実行します。

9. DBSC 形式

9.1. `Secure-Session-Registration` HTTP ヘッダーフィールド

Secure-Session-Registration ヘッダーフィールドは、サーバーがクライアント上で新しい デバイス束縛セッションを開始するために、 応答内で使用できます。

`Secure-Session-Registration` は List Structured Header [RFC9651] です。その ABNF は次のとおりです:

SecureSessionRegistration = sf-list

リスト内の各項目は inner list でなければならず、inner list 内の各項目は サポートされるアルゴリズム(ES256、RS256)を表す sf-tokenでなければなりません(MUST)。 現在サポートされるのはこの 2 つの値のみです。

次の sf-parameterが定義されています:

https://example.com/login.html からの `Secure-Session-Registration` の例:
HTTP/1.1 200 OK
Secure-Session-Registration: (ES256);path="reg";challenge="cv";authorization="ac"
HTTP/1.1 200 OK
Secure-Session-Registration: (ES256 RS256);path="reg";challenge="cv"
HTTP/1.1 200 OK
Secure-Session-Registration: (ES256);path="reg1";challenge="cv1";authorization="a"
Secure-Session-Registration: (RS256);path="reg2";challenge="cv2";authorization="b"
HTTP/1.1 200 OK
Secure-Session-Registration: (ES256);path="reg1";challenge="cv1";authorization="a", (RS256);path="reg2";challenge="cv2";authorization="b"
HTTP/1.1 200 OK
Secure-Session-Registration: (ES256);path="reg1";challenge="cv1";provider_key="abc";provider_id="idp_id";provider_url="https://id_origin.example.com"

9.2. `Secure-Session-Challenge` HTTP ヘッダーフィールド

Secure-Session-Challenge ヘッダーフィールドは、サーバーがクライアントに チャレンジを送信するために 応答内で使用できます。サーバーは、そのチャレンジが将来の `Secure-Session-Response` ヘッダー内のDBSC proofで 使用されることを期待するか、または status が 403 の場合に Cookie 更新中ただちに 新しく署名されたDBSC proof を要求します。

`Secure-Session-Challenge` は structured header です。その値は文字列でなければなりません。 その ABNF は次のとおりです:

SecureSessionChallenge = sf-string
項目の意味論は § 9.2.1 `Secure-Session-Challenge` 構造化ヘッダーの 直列化で定義されます。

処理手順は § 8.7 チャレンジをキャッシュするで定義されます。

9.2.1. `Secure-Session-Challenge` 構造化ヘッダーの直列化

`Secure-Session-Challenge` は Structured Field として表されます。[RFC9651]

この表現では、チャレンジは文字列で表されます。

チャレンジは "id" という名前の sf-parameterを持たなければならず(MUST)、その値は セッション識別子を表す文字列でなければなりません(MUST)。 その他の sf-parameterは無視されるべきです(SHOULD)。

https://example.com/login.html からの `Secure-Session-Challenge` の例:
HTTP/1.1 403 Forbidden
Secure-Session-Challenge: "new challenge";id="my session"
HTTP/1.1 200 OK
Secure-Session-Challenge: "new challenge";id="my session"
HTTP/1.1 200 OK
Secure-Session-Challenge: "new challenge";id="my session 1"
Secure-Session-Challenge: "another challenge";id="my session 2"
HTTP/1.1 200 OK
Secure-Session-Challenge: "c1";id="session 1", "c2";id="session 2"

9.3. `Secure-Session-Response` HTTP ヘッダーフィールド

Secure-Session-Response ヘッダーフィールドは、クライアントが セッション鍵ペアの秘密鍵をまだ所持していることをサーバーに証明するために、 ユーザーエージェントがリクエスト内で DBSC proofを送信するために使用できます。

Secure-Session-Response は structured header です。その値は文字列でなければなりません。その ABNF は次のとおりです:

SecureSessionResponse = sf-string

この文字列は DBSC proof JWT のみを含まなければなりません(MUST)。任意の sf-parameterは 無視されるべきです(SHOULD)。

POST example.com/refresh
Secure-Session-Response: "eyJhbGciOiJFUzI1NiIsInR5cCI6ImRic2Mrand0In0.eyJhdWQiOiJodHRwczovL2V4YW1wbGUuY29tL3JlZyIsImp0aSI6ImN2IiwiaWF0IjoiMTcyNTU3OTA1NSIsImp3ayI6eyJrdHkiOiJFQyIsImNydiI6IlAtMjU2IiwieCI6IjZfR0Iydm9RMHFyb01oNk9sREZDRlNfU0pyaVFpMVBUdnZCT2hHWjNiSEkiLCJ5IjoiSWVnT0pVTHlFN1N4SF9DZDFLQ0VSN2xXQnZHRkhRLWgweHlqelVqRUlXRSJ9LCJhdXRob3JpemF0aW9uIjoiYWMifQ.6Fb_vVBDmfNghQiBmIGe8o7tBfYPbPCywhQruP0vIhxgmcJmuNTaMHeVn_M8ZnOm1_bzIitbZqCWEn-1Qzmtyw"

9.4. `Sec-Secure-Session-Id` HTTP ヘッダーフィールド

Sec-Secure-Session-Id ヘッダーフィールドは、現在のセッション識別子を文字列引数として、 現在のセッションの更新を要求するために、ユーザーエージェントが リクエスト内で使用できます。

`Sec-Secure-Session-Id` は structured header です。 その値は文字列でなければなりません。その ABNF は次のとおりです:

SecSecureSessionId = sf-string

この文字列はセッション識別子のみを含まなければなりません(MUST)。任意のパラメーターは 無視されるべきです(SHOULD)。

POST example.com/refresh
Sec-Secure-Session-Id: "session-id"

9.5. `Secure-Session-Skipped` HTTP ヘッダーフィールド

Secure-Session-Skipped ヘッダーフィールドは、ユーザーエージェントポリシーにより リクエストが意図的に束縛資格情報を欠落していることを示すために、 リクエスト内で使用できます。

`Secure-Session-Skipped` は List Structured Header [RFC9651] です。その ABNF は次のとおりです:

SecureSessionSkipped = sf-list

リスト内の各項目は、Cookie 更新をスキップした粗い粒度の理由を表す sf-tokenで なければなりません(MUST)。サポートされる値は "unreachable"、"server_error"、および "quota_exceeded" のみです。これらの トークンは次の状況で使用されるべきです:

1 つのsf-parameterが定義されています:

GET example.com/requires_bound_cookie
Secure-Session-Skipped: unreachable;session_identifier=123, quota_exceeded;session_identifier=456

9.6. JSON セッション指示形式

サーバーは、セッション登録中および必要に応じてセッション更新中に JSON セッション指示を送信します。応答が セッション指示を含む場合、それは JSON 形式でなければなりません(MUST)。

JSON オブジェクトのルートでは、次のキーが存在できます:

session_identifier

セッション識別子を表す 文字列。 登録中、これは新しく作成されたセッションの識別子です。 continue キーの値が false である場合を除き、このキーは存在しなければなりません(MUST)。 更新中、これは現在のセッションの識別子でなければなりません(MUST)。 § 8.9 セッションを作成するを参照してください。

refresh_url

将来の更新リクエストに使用される URLを表す 文字列。 これは完全なURLであっても、これらの指示を提供する リクエストに 相対的であってもよいです。このキーは OPTIONAL です。存在しない場合、その リクエストurlが将来の更新リクエストに使用されます。

continue

セッションが引き続き適用されるべきかを示す ブール値。 登録および更新エンドポイントは、セッションを終了するためにこれを false に設定できます。 このキーは OPTIONAL です。存在しない場合、デフォルト値は true になります。

scope

セッションが対象とするリソースを記述する JSON セッション スコープcontinue キーの値が false である場合を除き、このキーは存在しなければなりません(MUST)。

credentials

このセッションによって保護される Cookie を記述する JSON セッション資格情報リストcontinueキーの値が false である場合を除き、 このキーは存在しなければなりません(MUST)。

allowed_refresh_initiators

DBSC 更新を開始することを許可されるホストを記述する 文字列リスト。 詳細は § 8.3 リクエストが更新を許可するかを識別する を参照してください。このキーは OPTIONAL です。存在しない場合、デフォルト値は空のリストになります。

{
  "session_identifier": "session_id",
  "refresh_url": "/RefreshEndpoint",

  "continue": false,

  "scope": {
    // デフォルトではオリジンスコープ(すなわち https://example.com)
    "origin": "https://example.com",
    // 除外されたサブドメインを除き、https://*.example.com を含めることを指定する。
    // これは origin の host がルート eTLD+1 である場合にのみ true にできます。
    "include_site": true,

    "scope_specification" : [
      { "type": "include", "domain": "trusted.example.com", "path": "/only_trusted_path" },
      { "type": "exclude", "domain": "untrusted.example.com", "path": "/" },
      { "type": "exclude", "domain": "*.example.com", "path": "/static" }
    ]
  },

  "credentials": [{
    "type": "cookie",
    // これは、この設定が適用される正確な Cookie を指定します。属性は
    // RFC 6265bis の Cookie 属性と一致し、通常の Set-Cookie 行と
    // 同様に、同じデフォルト値を使用して解析されます。
    // これらは、この応答に伴う Set-Cookie 行と同等であるべきです。
    "name": "auth_cookie",
    "attributes": "Domain=example.com; Path=/; Secure; HttpOnly; SameSite=None"
    // 属性 Max-Age および Expires は無視されます
  }],
    
  "allowed_refresh_initiators": [
    "example.com", 
    "*.example.com",
    "site-embedding-example.com"
  ]
}

9.7. JSON セッションスコープ指示形式

サーバーは、登録中および必要に応じてセッション更新中に、 JSON セッション指示内で JSON セッションスコープを送信します。

JSON オブジェクトのルートでは、次のキーが存在できます:

origin

セッションが適用されるオリジンまたはサイトを示す 文字列。 このキーは OPTIONAL です。存在しない場合、指示を提供する URL のオリジンが使用されます。 登録中は登録 URL、更新中は更新 URL です。

include_site

セッションがオリジンスコープ(false)か サイトスコープ(true)かを示す ブール値。このキーは存在しなければなりません(MUST)。 これは "scope_specification" 内の任意の JSON セッションスコープルールより優先されることに注意してください (§ 8.2 URL がセッションのスコープ内にあるかを識別するを参照)。

scope_specification

デフォルトスコープ(オリジン全体またはサイト全体)への変更を記述する JSON セッションスコープルールリスト。 このキーは OPTIONAL です。存在しない場合、空のリストが使用されます。

9.8. JSON セッションスコープルール形式

サーバーは、登録中および必要に応じてセッション 更新中に、JSON セッションスコープ 内で JSON セッションスコープルールオブジェクトのリストを送信します。

JSON セッションスコープルールのルートでは、 次のキーが存在できます:

type

そのルールが宛先を含めるか除外するかを示す 文字列。 このキーは存在しなければならず(MUST)、値は "include" または "exclude" でなければなりません(MUST)。

domain

ルールに一致すべきドメインを示す 文字列。これはワイルドカードを含むことができます (§ 8.2 URL がセッションのスコープ内にあるかを識別するを参照)。 このキーは OPTIONAL です。存在しない場合は '*' となり、すべてのドメインに一致します。

path

ルールに一致すべきパス接頭辞を示す 文字列。 このキーは OPTIONAL です。存在しない場合は '/' となり、すべてのパスに一致します。 詳細な意味論については § 8.2 URL がセッションのスコープ内にあるかを識別するを参照してください。

9.9. JSON セッション資格情報形式

サーバーは、登録中および必要に応じてセッション 更新中に、JSON セッション 指示内で JSON セッション資格情報オブジェクトのリストを送信します。

JSON オブジェクトのルートでは、次のキーが存在できます:

type

このセッションで保護される資格情報の種類を示す 文字列。 このキーは存在しなければならず(MUST)、値は "cookie" でなければなりません(MUST)。

name

束縛 Cookie の名前を示す 文字列

attributes

保護される Cookie の期待される属性を含む 文字列。 これがどのように使用されるかの詳細は § 8.6 セッション資格情報が欠落しているかを識別する を参照してください。

9.10. DBSC Proof JWT 構文

DBSC proof は、 クライアントによって選択された秘密鍵で(JSON Web Signature (JWS) を使用して)署名された JWT です。

DBSC proof のヘッダーは、 少なくとも次の sf-parameterを含まなければなりません(MUST):

typ

文字列。これは "dbsc+jwt" でなければなりません(MUST)。

alg

この JWT に署名するために使用されるアルゴリズムを定義する 文字列。これは [IANA.JOSE.ALGS] の "RS256" または "ES256" のいずれかでなければなりません(MUST)。

DBSC proof のペイロードは、 少なくとも次のクレームを含まなければなりません(MUST):

aud

文字列。これは、この JWT が最初に送信された URLでなければなりません(MUST)。 例: "https://example.com/refresh.html"。

jti

文字列。これは登録 ヘッダーで送信されたチャレンジ値のコピーです。

iat

JWT が発行された時刻を示す double。これは JWT の経過時間を判定するために使用できます。その値は、 [RFC7519] で説明される NumericDate 値を含む 数値でなければなりません(MUST)。

key

[RFC7517] で指定される JWK を定義する辞書。

さらに、次のクレームは、 `Secure-Session-Registration` ヘッダーフィールドに存在する場合、存在しなければなりません(MUST):

authorization

文字列。これは、そこに設定されている場合、 `Secure-Session-Registration` ヘッダーフィールドからの文字列の直接コピーです。 この文字列はヘッダーに含めることが OPTIONAL ですが、存在する場合、 クライアントはそれをDBSC proof内のクレームに追加しなければならない(MUST) ことに注意してください。

DBSC proof が更新リクエスト用である場合、次のクレームは 存在しなければなりません(MUST):

sub

文字列セッション識別子を指定します。

https://example.com/reg に送信される DBSC proof の例:
// Header
{
  "alg": "ES256",
  "typ": "dbsc+jwt"
}
// Payload
{
  "aud": "https://example.com/reg",
  "jti": "cv",
  "iat": 1725579055.0,
  "key": {
    "kty": "EC",
    "crv": "P-256",
    "x": "6_GB2voQ0qroMh6OlDFCFS_SJriQi1PTvvBOhGZ3bHI",
    "y": "IegOJULyE7SxH_Cd1KCER7lWBvGFHQ-h0xyjzUjEIWE"
  },
  "authorization": "ac"
}

サーバーから次の応答ヘッダーを持つ http://example.com/page.html への応答に基づきます:

HTTP/1.1 200 OK
Secure-Session-Registration: (ES256);path="reg";challenge="cv";authorization="ac"

10. 他の仕様への変更

10.1. Fetch 仕様への変更

この仕様は、HTTP-network-or-cache fetch アルゴリズムへの更新を要求します。リクエストは、 次から成るタプルリストである 遅延されたデバイス束縛セッション IDを持ちます:

このリストは初期状態では空です。

ステップ 8.21 で Cookie を計算した後、 § 8.5 更新を必要とするセッションを識別するを実行します。 結果の session が non-null である場合:

  1. httpRequest、返された sessionセッション鍵ペア更新 URLセッション識別子キャッシュされたチャレンジ、および空の authorization を用いて § 8.8 リクエストを送信するを実行します。

  2. 元の入力を用いて HTTP-network-or-cache fetch を再開します。

この仕様は、新しいヘッダーを処理するための 2 つの新しい呼び出しも要求します。 現在の HTTP-network fetch のステップ 14 の後、次のステップを実行します:

  1. § 8.10 セッション登録を処理するおよび § 8.7 チャレンジをキャッシュするを実行します。

10.2. Clear Site Data 仕様への変更

この仕様は、Clear Site Data 仕様の第 4.2.5 節 オリジンの DOM アクセス可能 ストレージを消去するが、スコープが origin に一致するすべてのデバイス束縛セッションを消去することを要求します。また、 第 4.2.4 節を更新し、登録済みドメインに一致するサイトの デバイス束縛セッションを消去することも要求します。

11. IANA に関する考慮事項

Permanent Message Header Field Registry は、次の 登録で更新されるべきです: [RFC3864]

11.1. Secure-Session-Challenge

ヘッダーフィールド名
Secure-Session-Challenge
適用可能なプロトコル
http
ステータス
draft
著者/変更管理者
W3C
仕様文書
この仕様(§ 9.2 `Secure-Session-Challenge` HTTP ヘッダーフィールドを参照)

11.2. Sec-Secure-Session-Id

ヘッダーフィールド名
Sec-Secure-Session-Id
適用可能なプロトコル
http
ステータス
draft
著者/変更管理者
W3C
仕様文書
この仕様(§ 9.4 `Sec-Secure-Session-Id` HTTP ヘッダーフィールドを参照)

11.3. Secure-Session-Registration

ヘッダーフィールド名
Secure-Session-Registration
適用可能なプロトコル
http
ステータス
draft
著者/変更管理者
W3C
仕様文書
この仕様(§ 9.1 `Secure-Session-Registration` HTTP ヘッダーフィールドを参照)

11.4. Secure-Session-Response

ヘッダーフィールド名
Secure-Session-Response
適用可能なプロトコル
http
ステータス
draft
著者/変更管理者
W3C
仕様文書
この仕様(§ 9.3 `Secure-Session-Response` HTTP ヘッダーフィールドを参照)

11.5. Secure-Session-Skipped

ヘッダーフィールド名
Secure-Session-Skipped
適用可能なプロトコル
http
ステータス
draft
著者/変更管理者
W3C
仕様文書
この仕様(§ 9.5 `Secure-Session-Skipped` HTTP ヘッダーフィールドを参照)

11.6. device-bound-sessions Well Known

Well-Known URI registry は、 /.well-known/device-bound-sessions を含むように更新されるべきです。

このエンドポイントは JSON エンコードされた辞書を提供しなければなりません。3 つのキーが定義されます:

https://example.com/.well-known/device-bound-sessions が次を提供する場合
{
  "registering_origins": [
    "https://subdomain.example.com",
    "https://subdomain.example.com:8000",
  ],
  "relying_origins": [
    "https://example.co.uk",
    "https://example-partner.com",
  ],
}

その場合、登録リクエストは、次のいずれかが true である場合にのみ サイトスコープのセッションを定義できます:

さらに、https://example.co.ukhttps://example-partner.comhttps://example.com 上のセッションと鍵を共有することを許可され、 それらのサイトがフェデレーションログインと DBSC 保護の両方を達成できるようになります。これを行うには、両方のサイトがそれぞれの .well-known ファイルで次のエントリを提供しなければなりません:

{
  "provider_origin": "https://example.com/"
}

12. 変更履歴

これは仕様の初期草案です。

13. 謝辞

適合性

文書の 慣例

適合性要件は、 記述的な表明と RFC 2119 の用語の組み合わせで表現されます。 この文書の規範的な部分におけるキーワード “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, および “OPTIONAL” は、RFC 2119 で説明されるとおりに解釈されます。 ただし、読みやすさのため、 この仕様ではこれらの語がすべて大文字で現れるとは限りません。

この仕様のすべてのテキストは、 非規範的であると明示された節、例、および注を除き、規範的です。 [RFC2119]

この仕様の例は、“for example” という語で導入されるか、 次のように class="example" によって 規範的テキストから分離されます:

これは参考例の例です。

参考注記は “Note” という語で始まり、 次のように class="note" によって 規範的テキストから分離されます:

Note, これは参考注記です。

適合する アルゴリズム

アルゴリズムの一部として命令形で表現された要件 (たとえば "strip any leading space characters" または "return false and abort these steps" など)は、 そのアルゴリズムを導入する際に使用されたキーワード ("must", "should", "may" など)の意味で解釈されます。

アルゴリズムまたは特定の手順として表現された適合性要件は、 最終結果が同等である限り、 任意の方法で実装できます。 特に、この仕様で定義されるアルゴリズムは、 理解しやすいことを意図しており、 高性能であることを意図していません。 実装者は最適化することが推奨されます。

索引

この仕様で定義される用語

参照により定義される用語

参照文献

規範参照文献

[COOKIES]
A. Barth. HTTP State Management Mechanism. 2011年4月. Proposed Standard. URL: https://httpwg.org/specs/rfc6265.html
[FETCH]
Anne van Kesteren. Fetch Standard. Living Standard. URL: https://fetch.spec.whatwg.org/
[HR-TIME-3]
Yoav Weiss. High Resolution Time. 2024年11月7日. WD. URL: https://www.w3.org/TR/hr-time-3/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[PERMISSIONS]
Marcos Caceres; Mike Taylor. Permissions. 2025年6月24日. WD. URL: https://www.w3.org/TR/permissions/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[RFC3864]
G. Klyne; M. Nottingham; J. Mogul. Registration Procedures for Message Header Fields. 2004年9月. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc3864
[RFC4648]
S. Josefsson. The Base16, Base32, and Base64 Data Encodings. 2006年10月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc4648
[RFC5234]
D. Crocker, Ed.; P. Overell. Augmented BNF for Syntax Specifications: ABNF. 2008年1月. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc5234
[RFC7405]
P. Kyzivat. Case-Sensitive String Support in ABNF. 2014年12月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7405
[RFC7517]
M. Jones. JSON Web Key (JWK). 2015年5月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7517
[RFC7519]
M. Jones; J. Bradley; N. Sakimura. JSON Web Token (JWT). 2015年5月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7519
[RFC7638]
M. Jones; N. Sakimura. JSON Web Key (JWK) Thumbprint. 2015年9月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7638
[RFC9112]
R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed.. HTTP/1.1. 2022年6月. Internet Standard. URL: https://httpwg.org/specs/rfc9112.html
[RFC9651]
M. Nottingham; P-H. Kamp. Structured Field Values for HTTP. 2024年9月. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc9651
[URL]
Anne van Kesteren. URL Standard. Living Standard. URL: https://url.spec.whatwg.org/