セッションストアの「継承」について


問題の再現
最近バグを書く過程で面白いことを発見し、私はそれを「sessionStorage'継承」と呼んでいます.このプロセスは、次のように再現できます.
テスト1
aページと呼ばれるページを開き、コンソールで実行します.
sessionStorage.a = 'a';
window.open(window.location.href); //   b  

新しく開いたページをbページと呼び、bページコンソールで実行します.
sessionStorage //            ,     window   sessionStorage  
//    {a: "a", length: 1}

私の認識では、sessionStorageはページレベルであり、ページとページの間には互いに影響しないと考えられています.上記の例では、私が期待する出力は、このような「継承」のような表現ではなく、lengthの属性しかないはずです.これは私の認識と違います.調べなければなりません.ドキュメントを調べる前に、この問題を簡単に探求し、分析します.
初歩的な分析
私の認知テストに従ってみました.
テスト2
aページで実行
sessionStorage.a = 'a';

それからaページのurlをコピーして、新しいtabページを作ってこのurlを開いて、実行します
sessionStorage
//    {length: 0}

ええ、私の認識も正しいですが、全面的ではなく、特定のシーンでの補充が欠けています.そして私はこれについてさらに探求しました.テスト1に基づいて続けます.
テスト3
aページコンソールで実行
sessionStorage.a = 'aaaaaaaa';
sessionStorage.b = 'b';

bページで実行
sessionStorage
//    {a: "a", length: 1}

これにより、総合テスト1、2、3では、aページでwindow.open(window.location.href)を介して得られたbページのsessionStorageに、aページの現在のsessionStorageの独立したコピーがあり、その後、aページのsessionStorageを変更してもbページのsessionStorageに影響を与えないという情報が得られるだろう.
この時私はまた、aページで開いているのがwindow.location.hrefのようなアドレスではなく、別のアドレスであれば、localStoragecookieに対する私たちの理解によれば、ここにもドメインの制限があるはずだと思います.次にテストします
テスト4
aページ(非https://baidu.com)で個別のドメインのアドレスを開いてcページを得る
window.open('https://baidu.com'); //   c  

cページのsessionStorageを見ると、aページsessionStorageの値はありません.うん、この点は私たちの認識と同じで、この「継承」も同域の場合にしか起こらない.
したがって、以上をまとめると、aページでwindow.open()を介して同ドメインアドレスから得られたbページを開くと、bページにはaページの現在のsessionStorageの独立したコピーがあり、この2つのsessionStorageは互いに影響しないという情報を得ることができる.
大体このような結論です.では、ドキュメントを見て、ドキュメントがこの結論に言及しているかどうかを見てみましょう.
ドキュメントサポート
この質問how-to-prevent-sessionstorage-being-inherited-when-using-target-blank-windowの答えで見つけた対応するドキュメントの説明を検索しました.
When a new Document is created in a browsing context which has a top-level browsing context, the user agent must check to see if that top-level browsing context has a session storage area for that document's origin. If it does, then that is the Document's assigned session storage area. If it does not, a new storage area for that document's origin must be created, and then that is the Document's assigned session storage area. A Document's assigned storage area does not change during the lifetime of a Document.
これはhtmlの標準ドキュメントです(ブラウザメーカーに見せる実装規範だと理解しています).この中には2つの概念が説明されています.
  • browsing contextという概念文書はこう説明されています
    A
    browsing contextis the environment in which a browserdisplays a Document (normally a tab nowadays, but possibly also a window or a frame within a page).
    Each browsing context has a specificorigin, host (domain), and port of the URL used to access it. Two objects have the same origin only when the scheme, host, and port all match."), the origin of the active document, and a history that lists all the displayed documents in order.
    簡単に理解すると、1つのtabページ、1つのframeは1つのbrowsing contextである.
  • document's originこのドキュメントにも説明があります
    Web content's origin is defined by the scheme (protocol), host (domain), and port of the URL used to access it. Two objects have the same origin only when the scheme, host, and port all match.
    簡単に理解すると、これが私たちがよく言うドメインです.

  • この2つの概念を理解してから、このドキュメントを見てください.これは私たちがテストした結論と同じです.もっと簡単なまとめです.
    aページのwindow.open()を介して開かれた同ドメインページには、aページの現在のsessionStorageの独立したコピーがある.
    これがsessionStorage継承問題のように見える解釈です.もちろんここの継承も本当の継承ではありませんが、このように見えます.
    その他
    ドキュメントを調べる過程で、 を避けようとする兄もいることに気づきました.もちろん、この回避方法にも言及されています(個人的な感覚は優雅ではありません).新しく開いたbページloadが終わった後、sessionStorageをリセットして、前のページの影響を受けないようにします.
    リファレンスドキュメント
  • API/Using_the_Web_Storage_API
  • API/Window/sessionStorage
  • プロジェクトで踏んだ穴の-sessionStorage
  • how-to-prevent-sessionstorage-being-inherited-when-using-target-blank-window
  • the-sessionstorage-attribute
  • origin
  • Browsing_context