◆ fetch や XHR のリクエストヘッダで Cookie は操作できない
◆ 自分でセッション管理できなかった

こういうことがやりたかったんです

import session_manager from "./session-manager.js"

const sess1 = session_manager.loadSession("foo")
const sess2 = session_manager.createSession()

await sess1.fetch("api/user").then(e => e.json()).then(user => console.log(user.name))
// user1

await sess2.fetch("api/user").then(e => e.json()).then(user => console.log(user.name))
// null

セッションに紐づく fetch を使えばそのセッションで管理される cookie のみ送られて セッションを複数管理できるというものです

ですが 不可能でした

というのもブラウザではリクエストヘッダに cookie を設定できません
しても無視されます
fetch の代わりに XHR でも試してみましたが こっちはエラーが出ていました

セキュリティとかの都合でだめだそうです
いつも必要以上に厳しくてほんとやめてほしいんですよね
許可リスト用意して そこに登録したオリジンだったら制限なしで自由にやらせてほしいものです

本来のブラウザ管理の cookie であれば自動で送信されるので そこを書き換えることもできますが リクエストの直前にセッションの Cookie に書き換えて レスポンスの結果を取得したら Cookie の更新をセッションデータに反映させて その後に Cookie をリクエスト前の状態に戻す というのは さすがに大変すぎです
それにリクエストからレスポンスの間で別のリクエストやレスポンスの取得が起きると Cookie に影響してしまいますし

それに Cookie には JavaScript から参照などの操作ができない種類のものもありますし JavaScript で Cookie 管理してのセッション管理は実質不可能です
それでもどうにかできないかなと考えてみた代替方法はこちら

方法 1

Cookie を使わない
Cookie が一般的なセッション管理方法ですが それ以外を使ってはいけないわけではありません
自分でサーバ側も管理するページならリクエストヘッダに自分で決めた名前のヘッダを送ってそれを cookie 代わりにすれば一応それらしいことはできそうです
標準の cookie 周りの機能は使えませんが あのわかりづらい独自のルールやフォーマットを捨てて JSON で扱えると考えるとそれもありかもしれません

問題点はその方法に対応してくれるサーバは自分で用意したものしか無いことです

方法 2

Proxy サーバ
今回の問題はブラウザの制限であって 例えば Node.js なら fetch-cookie のようなライブラリで Cookie を管理して fetch が行えるようです
なので実際のリクエストは⇩のような感じにします

fetch("http://localhost:9999/https/example.com/a/b", {
headers: {
sessid: "abcd",
clientid: "xxxa",
}
})

これで localhost:9999 のサーバが clientid と sessid を元にセッションを判断して そのセッションのcookie を使って https://example.com/a/b へリクエストします
sessid はセッションの名前で clientid はこの localhost のサーバへアクセスしてきたユーザを識別するためのものです

fetch が書きづらい問題はありますが それは session.fetch が window.fetch をラップして変換すれば普通の fetch のように書けます

class Session {
fetch(url, option) {
url = new URL(path, location)
const path = url.href.replace(/^(https?)\:\/\//, (_, x) => x + "/")
const req_url = `http://localhost:9999/${path}`
const { headers, ...other_options }
return fetch(req_url, { ...other_options, headers: { ...headers, sessid: this.sessid, clientid: this.clientid } })
}
}

localhost ように変換したり sessid を自動付与します

ただ 動きはしそうですが 準備が面倒すぎます
サーバが動いてないとですし 気楽に使えるものではなくなりつつあります

まとめ

自分で作るサービスにセッション切り替え機能をつけたいなら方法 1 で良さそうで Twitter みたいな一般的なサービスへのリクエストでセッション切り替えたいなら 手間はあるものの方法 2 をつかうしかないと思います

試してませんが たぶん拡張機能権限でも最初の方法は無理だと思いますし ブラウザでかんたんにセッション切り替え機能を使いたいなら Electron で Node.js 側の機能使ったりとかすればいいのかもです