--- title: Storage Access API slug: Web/API/Storage_Access_API tags: - API - Reference - Storage - Storage Access API translation_of: Web/API/Storage_Access_API ---
Storage Access API(ストレージアクセス API)は、埋め込まれたクロスオリジンのコンテンツが、通常はファーストパーティのコンテキストでのみアクセスできるストレージ(これをオリジンのファーストパーティストレージと呼びます)に無制限にアクセスする方法を提供します。 API は、埋め込まれたリソースがファーストパーティストレージに現在アクセスできるかどうかを確認し、ユーザーエージェントからファーストパーティストレージへのアクセスを要求できるメソッドを提供します。
ほとんどのブラウザーは、埋め込まれたクロスオリジンリソースのクッキーおよびサイトデータへのアクセスを制限する多くのストレージアクセスポリシーを実装しています。 これらの制限は、各最上位オリジンの下に埋め込まれたリソースに一意のストレージスペースを与えることから、サードパーティのコンテキストでリソースが読み込まれたときのストレージアクセスの完全なブロックにまで及びます。
特にサードパーティのクッキーブロックポリシーに関する意味論はブラウザーごとに異なりますが、コア機能は似ています: サードパーティのコンテキストに埋め込まれたクロスオリジンリソースには、ファーストパーティのコンテキストで読み込まれたときにアクセスできるのと同じクッキーとサイトストレージへのアクセスが与えられません。
これらのクッキーブロックポリシーは、ファーストパーティストレージへのアクセスを必要とする埋め込まれたクロスオリジンコンテンツを中断することが知られています。 例として、フェデレーションログイン(federated login、複数組織にまたがったログイン)では、ファーストパーティストレージに保存されている認証クッキーへのアクセスが必要になることが多く、これらのクッキーが利用できない場合、ユーザーは各サイトに個別にサインインする(または完全に中断する)必要があります。 中断した場合、サイト所有者は、ユーザーにサイトを例外として追加するか、ポリシーを完全に無効にすることを推奨することがよくあります。 結果として、埋め込まれたコンテンツとのやり取りを継続することを希望するユーザーは、すべての埋め込まれたオリジンおよびおそらくすべてのウェブサイトから読み込まれたリソースのブロックポリシーを大幅に緩和する必要があります。
Storage Access API は、この問題を解決することを目的としています。 埋め込まれたクロスオリジンのコンテンツは、{{domxref("Document.requestStorageAccess()")}} メソッドを介してサイトごとにファーストパーティストレージへの無制限のアクセスを要求し、{{domxref("Document.hasStorageAccess()")}} メソッドを介して既にアクセス権があるかどうかを確認できます。
さらに、セキュリティ上の理由から、サンドボックス化した {{htmlelement("iframe")}} にはデフォルトでストレージアクセスを許可できません。 そのため、API は、allow-storage-access-by-user-activation
sandbox トークンも追加します。 次のように、埋め込まれたウェブサイトは、これを追加してストレージアクセス要求が成功することを許可するとともに、allow-scripts
と allow-same-origin
を使用して API の呼び出しを許可し、クッキーを持つことができるオリジンで実行します。
<iframe sandbox="allow-storage-access-by-user-activation allow-scripts allow-same-origin"> ... </iframe>
API は、潜在的なストレージの例外を、ユーザーがやり取りする意図を示したオリジンに制限するように設計されています。 これは、次の制約によって実施されます。
ブラウザーは、到来するストレージアクセス要求を許可するかどうかの決定にユーザーを関与させることを決定する場合があります。 ストレージ許可の存続期間とブラウザーがユーザーに通知することを決定する状況に関する詳細は現在作業中であり、準備ができ次第発表されます。
埋め込まれたクロスオリジンの文書によって requestStorageAccess()
が呼び出されると、ユーザーエージェントは、要求オリジンにストレージアクセスを許可するかどうかの決定にユーザーを関与させることを選択できます。 現在、プロンプトヒューリスティック(Prompting heuristics、プロンプトするべきかを決める発見的方法)は Storage Access API の2つの実装者によって異なります。 Safari は、以前にストレージアクセスを受け取っていないすべての埋め込まれた追跡コンテンツにプロンプトを表示します。 Firefox は、追跡オリジンがサイトのしきい値数を超えてストレージアクセスを要求した後にのみユーザーにプロンプトします。 詳細については、{{domxref("Document.requestStorageAccess()")}} を参照してください。
API の表面は同じですが、Storage Access API を使用するウェブサイトは、Firefox と Safari の間で受け取るストレージアクセスのレベルと範囲に違いがあることを予期する必要があります。 これは、2つのブラウザーに実装されているストレージアクセスポリシーの違いが原因です。 Firefox に固有の設計プロパティを以下に要約します。
tracker.example
が最上位オリジン foo.example
でファーストパーティストレージへのアクセスを既に取得しており、ユーザーが foo.example
からのページに埋め込まれた tracker.example
からのページに、30日以内に再度訪問した場合、埋め込まれたオリジンは、読み込まれるとすぐにストレージにアクセスできます。foo.example
のページに tracker.example
の複数の {{htmlelement("iframe")}} が埋め込まれ、それらの <iframe>
の1つが Storage Access API を使用してストレージアクセスを正常に取得した場合、foo.example
最上位オリジン上の tracker.example
からの他のすべての iframe は、requestStorageAccess() を個別に呼び出す必要なく、すぐにストレージアクセスを取得します。tracker.example
から埋め込まれたページが以前に最上位オリジン foo.example
でストレージアクセスを正常に取得していた場合、foo.example
上の tracker.example
からのすべての埋め込まれたサブリソース(スクリプト、画像、スタイルシートなど)がファーストパーティストレージにアクセスして読み込まれます。 つまり、Cookie ヘッダーを送って、到来する {{httpheader("Set-Cookie")}} ヘッダーを尊重する可能性があります。requestStorageAccess()
から返された Promise が解決されると、埋め込まれたページは、クッキーだけでなく、ファーストパーティストレージ全体にアクセスできます。 これには、Web Storage、IndexedDB、DOM Cache などの API へのアクセスが含まれます。追跡クッキーをブロックするための Firefox の新しいストレージアクセスポリシーの文書には、ストレージアクセス許可の範囲の詳細な説明が含まれています。
Storage Access API のメソッドは、{{domxref("Document")}} インターフェイスに実装されます。
注: ユーザーとのやり取りは、これらの両方のメソッドによって返される Promise に伝播し、呼び出し元は、ユーザーからの2回目のクリックを必要とせずに、ユーザーとのやり取りを必要とするアクションを実行できます。 例えば、呼び出し元は、Firefox のポップアップブロッカーをトリガーせずに、解決した Promise からポップアップウィンドウを開くことができます。
{{htmlelement("iframe")}} 要素の sandbox
属性には新しいトークン allow-storage-access-by-user-activation
があり、サンドボックス化した <iframe>
は Storage Access API を使用してストレージアクセスを要求できます。
API は現在、提案段階にあり、標準化プロセスはまだ開始されていません。 現在、Apple の Introducing Storage Access API ブログ投稿、および WHATWG HTML issue 3338 — Proposal: Storage Access API で API の仕様の詳細を見つけることができます。
{{Compat("api.Document.hasStorageAccess")}}
{{Compat("api.Document.requestStorageAccess")}}