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 サイトの場合)は、 重大なユーザープライバシー上のトレードオフを伴うべきではありません。これを確保するために取られている考慮事項の一部:
-
セッション/鍵素材の有効期間: これは追加のクライアントデータストレージ(すなわち擬似 Cookie)を 提供すべきではありません。そのため、ブラウザーは他のサイトデータ(Cookie など)を消去する際に、 セッションと鍵を消去しなければならない(MUST)と要求します。
-
この API を実装しても、ヒューリスティックなデバイスフィンガープリンティング信号の エントロピーを有意に増加させるべきではありません。特に、DBSC は 安定したデバイス識別子を漏えいすべきではありません。
-
この API はパフォーマンスのためにバックグラウンドの「ping」を許可する可能性があるため、 ユーザーが接続先サイトから離れた後に、ユーザーの長期追跡を可能にしてはなりません。
-
各セッションには別個の新しい鍵が作成され、異なるセッションが同じデバイスからのものであることを 検出できるべきではありません。
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.com と example.co.uk が適切な .well-known
エントリを持っていると仮定すると、これにより example.co.uk は
example.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 なしで行われることにつながり得ます。このエンドポイントに期待される挙動は:
-
識別子により、セッションの公開鍵および最近のチャレンジを検索する。
-
`
Secure-Session-Response` ヘッダーが、正しい鍵で最近のチャレンジに署名していることを検証する。 ネットワーク遅延および競合状態により、新しいチャレンジを発行した後に 古いチャレンジに対する署名を受け取る可能性があることに注意してください。 -
新しい束縛 Cookie を発行する。
-
必要に応じて現在のセッション設定を更新する。
ブラウザーは、DBSC を採用するサイトのレイテンシコストを最小限に抑えようとして、 セッションを事前に更新することを選択できます。サイトは、更新が束縛 Cookie の期限切れ時にのみ 発生すると想定すべきではありません。
クロスサイト fetch が許可されている場合、更新エンドポイントはタイミングサイドチャネルを通じて
ログイン状態を直接漏えいする可能性があります。サーバーは、有効な
`Sec-Secure-Session-Id`
ヘッダーを確認することで、受信リクエストが
ユーザーエージェントによって開始されたものであり、クロスサイトリクエストではないことを確保できます。
このエンドポイントには狭い CORS ポリシーを設定し、クロスサイトオリジンが資格情報付きリクエストを
行うことを許可しないことも推奨されます。DBSC の CORS 統合は、遅延された
リクエストが資格情報を含む場合に暗黙的に資格情報を含めることで、これを可能にするように設計されています。
同様の理由から、更新エンドポイントが X-Frame-Options または
Cross-Origin-Resource-Policy ヘッダーによる埋め込みを拒否することも推奨されます。
example.com に 2 つのエンドポイントがあるとします:
-
/authenticatedは、任意の要求元オリジンに対してAccess-Control-Allow-Credentialsを返します。 -
/refreshは DBSC 更新エンドポイントです。
このサイトは、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 更新をスケジュールすることを推奨します:
-
セッションにすでに保留中の DBSC 更新がある場合、別の更新を開始しない。 これにより TPM 負荷が減り、サーバー実装をより単純にできます
-
セッション資格情報がまもなく期限切れになり、スコープ内の文書が アクティブな場合、ユーザーエージェントは今後のリクエストのレイテンシをなくすために 事前に更新できます。
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
- キャッシュされたチャレンジ
-
このセッションの次のチャレンジとして使用される 文字列または null
- セッションスコープ
- セッション資格情報
-
セッションで使用される、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.uk と
de の両方がパブリックサフィックスである場合、example.co.uk と
www.example.de の両方の登録可能オリジンラベルは
example です。
8. アルゴリズム
8.1. セッションを識別する
URL(url)とセッション識別子 (session identifier)が与えられた場合、このアルゴリズムはデバイス束縛セッションを返し、 そのようなセッションが存在しない場合は null を返します。
8.2. URL がセッションのスコープ内にあるかを識別する
-
scope を session のセッションスコープとします。
-
scope のサイトを含めるが true の場合、 URL の オリジンが scope のオリジンと same siteでないなら "exclude" を返します。
-
scope のサイトを含めるが false の場合、 URL の オリジンが scope のオリジンと same originでないなら "exclude" を返します。
-
URL が session の更新 URLに一致する場合、"exclude" を返します。
-
"include" を返します。
8.3. リクエストが更新を許可するかを識別する
-
session のセッションスコープのサイトを含める が true であり、かつ request のオリジンが session のセッションスコープ のオリジンと same siteである場合、"allowed" を返します。
-
session のセッションスコープのサイトを含める が false であり、かつ request のオリジンが session のセッションスコープ のオリジンと same originである場合、"allowed" を返します。
-
session の 許可された更新開始元内の各 initiator pattern について反復します:
-
request の オリジンのhostと initiator pattern に対して § 8.4 ホストがパターンに一致するかを識別する を実行した結果が true の場合、"allowed" を返します。
-
-
"disallowed" を返します。
8.4. ホストがパターンに一致するかを識別する
-
pattern が '*' と等しい場合、true を返します。
-
host string を、直列化された host とします。
-
pattern が '*' で始まり、かつ host が ドメインである場合:
-
pattern が '*.' で始まらない場合、false を返します。
-
host string が pattern の最初の文字を除いたすべてで 終わる場合、true を返します。
-
-
host string が pattern と等しい場合、true を返します。
8.5. 更新を必要とするセッションを識別する
-
domain sessions を、ユーザーエージェントのセッションストア[domain] を ID 別 セッションマップとして表したものとします。
-
domain sessions 内の各 session について 反復します:
-
session の有効期限タイムスタンプが 現在より前である場合、 session を domain sessions から削除し、継続します。
-
id を session のセッション識別子とします。
-
タプル(domain, id)が request の 遅延されたデバイス束縛セッション ID内にある場合、継続します。
-
request のURL と session に対して § 8.2 URL がセッションのスコープ内にあるかを識別する の手順を実行します。結果が "include" でない場合、継続します。
-
request と session に対して § 8.3 リクエストが更新を許可するかを識別する の手順を実行します。結果が "allowed" でない場合、継続します。
-
request と session のセッション資格情報に対して § 8.6 セッション資格情報が欠落しているかを識別する の手順を実行します。 結果が false の場合、継続します。
-
(domain, id)を request の遅延されたデバイス束縛 セッション IDに追加します。
-
session の有効期限タイムスタンプを 将来のタイムスタンプに設定します。 有効期限タイムスタンプの正確な選択はユーザーエージェントに委ねられます。 最大 Cookie 有効期間に合わせることが推奨されます。
-
session を返します。
-
-
null を返します。
8.6. セッション資格情報が欠落しているかを識別する
-
credentials 内の各 credential について 反復します:
-
credential のattributesを持つ Cookie が request に添付されない場合(第 5.4 節 of [COOKIES] を参照)、継続します。
-
request のヘッダーリストが、 次のすべての条件を満たす cookie を含む場合、継続します:
-
cookie の名前が credential のnameと一致する。
-
cookie の次のすべての属性が、 credential のattributes内のものと一致する: Domain, Path, Secure, HttpOnly, SameSite。
-
-
true を返します。
-
-
false を返します。
8.7. チャレンジをキャッシュする
応答(response)が与えられた場合、このアルゴリズムは デバイス束縛 セッションのキャッシュされたチャレンジを更新します。
-
header name を "
Secure-Session-Challenge" とします。 -
challenge list を、response の ヘッダーリストから、header name と "list" を与えて構造化 フィールド値を取得するを実行した結果とします。
-
challenge list が null の場合、return します。
-
challenge list 内の各(challenge, params)について 反復します:
-
session id を null とします。
-
params["id"] が存在し、かつ sf-stringである場合、session id を params["id"] に設定します。
-
session id が null の場合、継続します。
-
session を、response のURLと session id を与えて § 8.1 セッションを識別するを実行した結果とします。
-
session が null の場合、継続します。
-
session のセッション資格情報内の 各 credential について反復します:
-
credential のattributesを持つ Cookie が response によって設定できない場合( 第 5.3 節 of [COOKIES] を参照)、継続します。
-
challenge を、このデバイス束縛 セッションから次回 DBSC proofが送信される際に使用される session のキャッシュされたチャレンジとして 保存します。
-
Breakします。
-
8.8. リクエストを送信する
ユーザーエージェントは、束縛資格情報が欠落している場合には常にこれらの手順を実行しますが、 任意の時点でこれを行ってもよい(MAY)です。束縛資格情報の期限切れ前に事前にリクエストを送信すると、 DBSC のレイテンシコストを最小限にできます。
-
ユーザーエージェントは、ユーザーまたはサイトに対するサービス拒否を防ぐため、 このリクエストをスキップしてもよい(MAY)です。たとえば、このセッションが過剰な TPM 操作を要求している場合(ユーザーに害を与える)、または更新 エンドポイントに最近到達できなかった場合(サイトに対するサービス拒否リスク)に起こり得ます。 ユーザーエージェントがこれを選択した場合、originating request、適切なトークン( § 9.5 `Secure-Session-Skipped` HTTP ヘッダー フィールドの選択肢を参照)、および session id を用いて § 8.12 デバッグヘッダーを追加する の手順を実行し、これをサイトに示すべきです。
-
terminate the session を、次の手順を持つアルゴリズムとします:
-
originating request のURLのオリジンが destination のオリジンと same siteでない場合、return します。
-
signed challenge を null とします。challenge または authorization が non-null の場合、DBSC proofを作成し、key pair で署名し、その 結果を signed challenge に保存します。
-
HTTP fetchで使用するための request を作成します。
-
request のmethodを "POST" に設定します。
-
request のURLを destination に設定します。
-
request のredirect modeを "follow" に設定します。
-
signed challenge が non-null の場合、 ("Secure-Session-Response", signed challenge) ヘッダーを request の ヘッダーリストに appendします。
-
session id が non-null の場合、 ("Sec-Secure-Session-Id", session id) ヘッダーを request の ヘッダーリストに appendします。
-
authorization が non-null の場合、 ("Authorization", authorization) ヘッダーを request のヘッダーリストにappendします。
-
response を、request に対して HTTP fetchを実行した結果とします。
-
response がネットワークエラーである、または response の statusが 407 または 429 の場合、return します。
-
response のstatusが 300 以上 400 未満である場合、 return します。
-
response のstatusが 403 の場合:
-
session id が null の場合、return します。
-
session を、destination と session id に対して § 8.1 セッションを識別するの手順を実行した結果とします。
-
session が null の場合、return します。
-
それ以外の場合、元の入力を用いてこのアルゴリズムを再開しますが、 challenge を session のキャッシュされたチャレンジで置き換えます。
-
-
response のstatusが 400 以上 500 未満である場合、 terminate the session を行い、return します。
-
response のstatusが 500 以上である場合、 return します。ユーザーエージェントは、更新エンドポイントの 一時的な停止による害を制限するために、このセッションに対する 以後の更新リクエストでバックオフ機構をトリガーすることを選択できます。
-
session id が non-null であり、かつ response のbodyが 空である場合、return します。
-
response、 destination、 session id、および key pair に対して § 8.9 セッションを作成するを呼び出します。
8.9. セッションを作成する
-
terminate the session を、次の手順を持つアルゴリズムとします:
-
JSON session を、response のbody をJSON セッション指示として解析した結果とします。 解析に失敗した場合、terminate the session を行い、return します。これには、すべての必須キーが 存在することの検証が含まれます。
-
JSON session のcontinueが false の場合、 terminate the session を行い、return します。
-
session identifier を JSON session のsession_identifierとします。
-
JSON scope を JSON session のscopeとします。
-
origin を、JSON scope のoriginが存在する場合はそこから構築される オリジン、存在しない場合は destination のオリジンとします。
-
JSON session のrefresh_urlが 値を持たない場合、refresh URL を destination とします。
-
それ以外の場合、refresh URL を、JSON session のrefresh_urlの値を用いて destination を解決した結果とします。
-
次の検証を実行します。いずれかが失敗した場合、 terminate the session を行い、return します。
-
session id が non-null の場合、それは session identifier と一致しなければなりません。
-
origin は有効な non-opaque オリジンでなければなりません。
-
refresh URL は HTTPS スキームを持つか、localhost でなければなりません。
-
すべてのJSON セッション資格情報は 属性 "Partitioned" を持ってはなりません。
-
-
JSON scope のinclude_siteが true の場合、 次の検証を実行します。いずれかが失敗した場合、terminate the session を行い、return します。
-
origin のhostは destination domain と等しくなければなりません。
-
destination domain が destination のhostと等しい場合、 この手順内の残りのすべての検証をスキップします。
-
session id が non-null の場合、この手順内の残りのすべての検証を スキップします。
-
それ以外の場合、well known URL を destination のコピーとし、 hostを destination domain に置き換え、 pathを "/.well-known/device-bound-sessions" に置き換えたものとします。
-
well known response を well known URL を fetch した結果とします。
-
well known response のstatusは 200 でなければなりません。
-
well known response のbodyは JSON エンコードされた 辞書でなければなりません。
-
well known response のbodyはキー "registering_origins" を含まなければなりません。
-
キー "registering_origins" の値は destination のオリジンを含まなければなりません。
-
-
session を新しいセッションとします。
-
session のセッション識別子を session identifier に設定します。
-
session の更新 URLを refresh URL に設定します。
-
session のセッションスコープを、 オリジン origin と、 サイトを含めるとして JSON scope のinclude_siteの値を持つ新しいスコープに設定します。
-
JSON scope のscope_specification内の各 JSON scope rule について反復します:
-
JSON session のcredentials内の各 JSON session credential について反復します:
-
session credential を新しいセッション資格情報とします。
-
JSON session credential のtypeが "cookie" でない場合、terminate the session を行い、return します。
-
session credential のnameを JSON session credential のnameに設定します。
-
session credential のattributesを JSON session credential のattributesに設定します。
-
session credential を session のセッション資格情報に追加します。
-
-
session のセッション鍵ペアを key pair に設定します。
-
session の許可された更新開始元 を JSON session のallowed_refresh_initiators に設定します。
-
session の有効期限タイムスタンプを将来の タイムスタンプに設定します。 有効期限タイムスタンプの正確な選択はユーザーエージェントに委ねられます。 最大 Cookie 有効期間に合わせることが推奨されます。
8.10. セッション登録を処理する
-
header name を "
Secure-Session-Registration" とします。 -
registration list を、response の ヘッダーリストから、header name と "list" を与えて構造化 フィールド値を取得するを実行した結果とします。
-
registration list が null の場合、return します。
-
registration list 内の各(registration entry, params) について反復します:
-
registration entry が sf-inner-listでない場合、 継続します。
-
path を params["path"] とします。
-
challenge を null とし、authorization を null とします。
-
params["challenge"] または params["authorization"] のいずれかが存在するが 型が sf-stringでない場合、継続します。
-
params["challenge"] が存在する場合、challenge を params["challenge"] に設定します。
-
params["authorization"] が存在する場合、authorization を params["authorization"] に設定します。
-
endpoint を、response の URL に相対的に path を解決した結果とします。
-
key pair を、 registration entry、 params、および endpoint に対して § 8.11 セッション鍵ペアを作成するを実行した結果とします。
-
key pair が null の場合、return します。
-
request、 key pair、endpoint、 session identifier として null、challenge、および authorization を用いて § 8.8 リクエストを送信するを呼び出します。
-
8.11. セッション鍵ペアを作成する
Secure-Session-Registration`
ヘッダーの registration entry と params、および
登録エンドポイントのURL(registration URL)を受け取ります。
セッションで使用する鍵ペア、または鍵が不可能な場合は null を返します。
-
algorithm list を空のリストとします。
-
registration entry 内の各 algorithm について反復します:
-
algorithm が `
Secure-Session-Registration` でサポートされる暗号アルゴリズムを表し、かつこのクライアントでサポートされる場合、 algorithm を algorithm list に追加します。
-
algorithm list が空の場合、null を返します。
-
params["provider_key"]、params["provider_id"]、または params["provider_url"] のいずれかが存在する場合:
-
3 つのキーのいずれかが欠落している場合、null を返します。
-
permission を、 "device-bound-session-key-sharing" について 使用許可を要求するを実行した結果とします。
-
permission が
"denied"の場合、null を返します。 -
provider URL を、 params["provider_url"] から構築される URL とします。
-
provider origin を provider URL のオリジンとします。
-
provider origin が opaque の場合、null を返します。
-
provider identifier を params["provider_id"] とします。
-
provider session を、ユーザーエージェントの セッション ストア[provider domain][provider identifier] 内のセッションとします。
-
provider session が null の場合、null を返します。
-
provider session のセッションスコープ のオリジンが provider origin とsame originでない場合、null を返します。
-
provider session のセッション鍵ペアの JWK thumbprint( [RFC7638] を参照)が、 base64 でエンコードした際([RFC4648] を参照)に params["provider_key"] と一致しない場合、null を返します。
-
provider well known URL を provider URL のコピーとし、 pathを "/.well-known/device-bound-sessions" に置き換えたものとします。
-
provider well known response を provider well known URL を fetch した結果とします。次のいずれかが成り立つ場合、null を返します:
-
ユーザーエージェントは、悪用を防ぐため、 "relying_origins" 内の 登録可能オリジンラベル数に上限を設けるべきです。
-
relying well known URL を registration URL のコピーとし、 pathを "/.well-known/device-bound-sessions" に置き換えたものとします。
-
relying well known response を relying well known URL を fetch した結果とします。次のいずれかが成り立つ場合、null を返します:
-
provider session のセッション鍵ペアを返します。
-
-
algorithm list のために作成された新しい鍵ペアを返します。
8.12. デバッグヘッダーを追加する
-
value を、値 token を持つ sf-token とします。
-
value 上の sf-parameter "session_identifier" を session id に設定します。
-
skipped header value を、request の ヘッダーリストと、 ヘッダー名 "Secure-Session-Skipped"、型 "list" を用いて構造化フィールド値を取得する 手順を実行した結果とします。
-
skipped header value が null の場合、空の sf-list に設定します。
-
value を skipped header value に追加します。
-
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が定義されています:
-
キーが "path" で、値が sf-stringである sf-parameter。登録エンドポイントへのパスを伝えます。これは 現在のURLに相対的であっても、完全な URLであってもよいです。 このパラメーターを持たないエントリは、 § 8.10 セッション登録を処理するで無視されます。
-
キーが "challenge" で、値が sf-stringである sf-parameter。セッション登録で使用されるチャレンジを伝えます。
-
キーが "authorization" で、値が sf-stringである sf-parameter。この sf-parameterは登録 JWT にコピーされます。
-
キーが "provider_key" で、値が sf-stringである sf-parameter。このセッションが、指定された公開鍵を持つセッションと 鍵を共有すべきであることを伝えます。
-
キーが "provider_id" で、値が sf-stringである sf-parameter。このセッションが、指定されたセッション識別子を持つ セッションと鍵を共有すべきであることを伝えます。
-
キーが "provider_url" で、値が sf-stringである sf-parameter。このセッションが、対応するサイト上の セッションと鍵を共有すべきであることを伝えます。
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)。
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)。
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" のみです。これらの トークンは次の状況で使用されるべきです:
-
"server_error" は、サーバーからの応答(例: 500 ステータスコード)により セッション更新が失敗したことを示します。
-
"unreachable" は、サーバーに到達できないために セッション更新が失敗したことを示します。
-
"quota_exceeded" は、ユーザーエージェントが更新しないことを選択するすべての場合 (例: 最近の過剰な TPM 操作)をカバーします。
1 つのsf-parameterが定義されています:
-
キーが "session_identifier" で、値が sf-stringである 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):
// 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 である場合:
-
httpRequest、返された session のセッション鍵ペア、更新 URL、セッション識別子、キャッシュされたチャレンジ、および空の authorization を用いて § 8.8 リクエストを送信するを実行します。
-
元の入力を用いて HTTP-network-or-cache fetch を再開します。
この仕様は、新しいヘッダーを処理するための 2 つの新しい呼び出しも要求します。 現在の HTTP-network fetch のステップ 14 の後、次のステップを実行します:
-
§ 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 つのキーが定義されます:
-
"registering_origins" は文字列のリストです。サイト全体のセッションを登録することを 許可されたオリジンを含みます。
-
"relying_origins" は文字列のリストです。このサイトのセッションと鍵を共有する際に Relying Party(RP)となることを許可されたオリジンを含みます。
-
"provider_origin" は任意の文字列です。このオリジンが Relying Party として使用される場合に、 Session Provider のオリジンを含みます。
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 である場合にのみ サイトスコープのセッションを定義できます:
-
登録エンドポイントの host が
example.comである -
登録エンドポイントの origin が
https://subdomain.example.comである -
登録エンドポイントの origin が
https://subdomain.example.com:8000である
さらに、https://example.co.uk と https://example-partner.com
は https://example.com 上のセッションと鍵を共有することを許可され、
それらのサイトがフェデレーションログインと DBSC
保護の両方を達成できるようになります。これを行うには、両方のサイトがそれぞれの
.well-known ファイルで次のエントリを提供しなければなりません:
{ "provider_origin" : "https://example.com/" }