このカテゴリでこの手の記事を公開している人は、私が見た限りどこにもいません。というわけで書きました。Second Bookmark Bar が Chrome に要求するすべての権限、その理由、そして技術的には可能でもあえてしていないこと。ブックマーク拡張機能をインストールするかどうか検討しているなら——この拡張機能であれ他のものであれ——前半部分は最終的にどれを選ぶにしても役立つはずです。
この拡張機能に限らず、ブックマーク拡張機能を監査する方法
個別の話に入る前に、一般的な方法から。これから検討するどの拡張機能にも当てはまる内容です。
- インストール時のプロンプトだけでなく、Chrome ウェブストアの掲載ページで権限一覧を読む。 掲載ページでは通常、各権限の用途がより平易な言葉で説明されており、インストールを決める前に目を通せます。
- 「すべてのウェブサイトであなたのデータの読み取りと変更」(
<all_urls>への広範なhost_permissionsに対する警告)は、実際に注意を払うべき項目です。これは拡張機能のコードが、あなたが訪れるすべてのページ上で実行され得ることを意味します。特定の1ドメイン(拡張機能自身のバックエンドなど)に限定された狭いホスト権限は、閲覧するすべてのサイトへの無制限アクセスとはまったく異なる話です。 bookmarks権限は、ブックマークツリー全体への読み書きアクセスを許可します。これは本質的に広い権限です——Chrome に「一部のブックマークだけ」を要求する方法は存在しません——ですから正直に問うべきは、権限が広いかどうかではなく、拡張機能がその権限を得た後に何をするか、です。- **Manifest V3 以降、「リモートコードの実行禁止」**はほぼ標準になりました。拡張機能は実行時にサーバーから任意の JavaScript を取得して実行できなくなり、Manifest V2 時代には実際にリスクだった「インストール後に静かに権限範囲が広がる」というカテゴリの問題がふさがれています。その拡張機能が実際に Manifest V3 で作られているかは確認する価値があります。信頼できる拡張機能の多くはすでにそうなっており、Chrome はストア全体で V2 のサポートを段階的に廃止しています。
- 収集する情報を具体的に明記したプライバシーポリシーは、ただ存在するだけのポリシーより重要です。「サービス向上のために情報を収集することがあります」は定型文にすぎません。何がどんな条件でデバイスから外に出るのかを正確に書いているポリシーこそ、信頼に値します。
Second Bookmark Bar の実際のマニフェスト
以下は言い換えではなく、実際の manifest.json から抜き出した permissions ブロックです。
"permissions": [
"activeTab",
"bookmarks",
"storage",
"favicon",
"identity",
"alarms"
],
"optional_permissions": [
"tabGroups"
],
"host_permissions": [
"https://ughpzmmhthrcnwtpfkzr.supabase.co/*"
]
各項目とその用途は以下の通りです。
| 権限 | 許可される内容 | 実際の用途 |
|---|---|---|
bookmarks | Chrome のブックマークツリーの読み書き | この製品そのものです。フォルダ、スロット、並べ替え、重複排除、ロールバックのすべての操作が bookmarks API 呼び出しです。この権限なしで動くバージョンのこの拡張機能は存在しません。 |
storage | ローカルおよび同期される拡張機能ストレージ | 設定、フォルダ・スロットの構成、アダプティブルール、保存ページの記憶順位、復元ポイントのスナップショット。ここに含まれるのは閲覧履歴ではなく、拡張機能自体の設定とバックアップです。 |
activeTab | 現在のタブへの一時的なアクセス。拡張機能の UI を操作した後にのみ有効 | ピッカー優先の保存フローとクイック保存コマンドを支えています——実際に保存を実行したタイミングで現在のページの URL、タイトル、サムネイルを取得するもので、バックグラウンドで受動的に行われるものではありません。 |
favicon | Chrome 組み込みの favicon API | ブックマークやフォルダの横にサイトアイコンを表示し、バーがただのテキストではなく視覚的に読み取れるようにします。拡張機能自身がサードパーティのサーバーからアイコンを取得・キャッシュする必要はありません。 |
alarms | サービスワーカー内でバックグラウンドタイマーをスケジュールする | 用途は正直に3つです。一定間隔でのクラウド同期リトライのポーリング、Stripe の決済フロー中に支払い完了を検知して UI を更新するためのチェック、期限切れ認証トークンの定期クリーンアップ(6時間ごと)。いずれもクラウド同期に関連するもので、クラウド同期を一度も有効にしなければどれも実行されません。 |
identity | Chrome の OAuth ヘルパー(launchWebAuthFlow) | クラウド同期のための Google サインインフローに使われるだけで、それ以外の用途はありません。この権限があっても、拡張機能が Google アカウントのデータを全般的に読み取れるようにはなりません——サインインのハンドシェイク自体に範囲が限定されています。 |
tabGroups(オプション) | Chrome のタブグループの作成とラベル付け | インストール時には要求されません。「このフォルダをタブグループとして開く」という特定の操作を使ったときにのみ、Chrome がプロンプトを出します。ほとんどの人が毎日使うわけではない機能のために最初から要求するより、必要になった瞬間に一度だけ尋ねる方がいいと考えています。 |
ホスト権限: ughpzmmhthrcnwtpfkzr.supabase.co | ちょうど1つのドメインへのネットワークアクセス | クラウド同期とアカウント・課金状態を扱う、Supabase 上でホストされたバックエンドです。<all_urls> ではありません。「すべてのウェブサイト」でもありません。特定の1ドメインだけであり、クラウド同期にサインインした場合にのみ通信が発生します。 |
以上が permissions と host_permissions のすべてです。アナリティクス SDK もなければ、広告ネットワークもなく、任意のネットワークアクセスを許す広範な <all_urls> ホスト権限もありません。マニフェストにある唯一のホスト権限は、クラウド同期が依存しているのと同じ Supabase プロジェクト、つまり自社バックエンドのみに限定されています。
ここで明示しておくべきことが2つあります。どちらも実際に存在するものであり、この記事の趣旨は何も隠さないことだからです。
コンテンツスクリプト自体。 マニフェストには、すべての http:// および https:// ページ上で(document_start のタイミングで)実行されるコンテンツスクリプトも宣言されています。実は Chrome の「訪問するウェブサイト上のすべてのデータの読み取りと変更」というインストール警告を実際に発生させているのは、Supabase のホスト権限ではなくこちらです。この警告は正確です——このスクリプトこそが、訪れるすべてのページの中に直接バーと検索 UI を描画しているものだからです。そのアクセスで実際に行っていることは限定的で、UI を描画すること、そしてあなたが作成を指示したブックマークを組み立てるために必要な特定のページ要素を読み取ること(例えば、バーにドラッグしたときの動画のタイトル、チャンネル名、長さ、再生位置)だけです。しかしアクセス範囲自体は広く、「なぜすべてのウェブサイトへのアクセスが必要なのか」という問いへの正直な答えは、この警告そのものであり、抜け道ではありません。
YouTube 以外の動画フォルダのサムネイル。 YouTube のサムネイルは動画 ID だけから組み立てられるため、ネットワークリクエストとしてブラウザの外に出ることは一切ありません。一方、他サイトの動画フォルダアイテムについては、拡張機能は実際に外部へリクエストを送ります。保存元のページにすでに存在するサムネイル画像 URL の候補を短いリストとして取得し、それぞれを(画像バイトのみ、credentials: 'omit' で)フェッチして、どれが実際に画像として解決するかを確認してからカードのサムネイルとして使います。これらのリクエストは Second Bookmark Bar 自身のバックエンドではなく、ページをホストしていたドメイン宛てに送られるため、マニフェストのホスト権限一覧には現れません。しかしこれは Supabase 以外にもう1つ実在するネットワーク経路であり、「この拡張機能は1つのホストとしか通信しない」と説明するのは不正確です。
技術的には可能でもやっていないこと
これらの権限で下限(実際にしていること)を説明するより、上限(できてしまうこと)を正直に語る方が重要です。bookmarks と storage があれば、技術的にはインストール時にブックマークツリー全体をサーバーへこっそりアップロードするバージョンのこの拡張機能を作ることもできます。しかし私はそうしていません。Supabase のホスト権限は、有料のクラウド機能に明示的にサインインした後にしか有効化されず、それ以外では外部へのリクエストは前述のサムネイル検証フェッチだけで、ブックマークやアカウントのデータは一切含まれません——ある画像 URL が解決するかどうかを確認しているだけです。activeTab があれば、理論上はあなたが訪れるすべてのページを記録することもできます——ただしこの権限は、あなたが実際に拡張機能を呼び出したときにだけタブが見える範囲に限定されており、ページ遷移のたびに発火するようなものではありません。閲覧を受動的に記録するリスナーは組み込まれていません。そしてすべてのページで動くコンテンツスクリプトがあれば、理論上はそこにある何でも読み取ることができます——ただしそのコードは隠されておらず、Chrome ウェブストアのパッケージに同梱されている content.js そのものであり、バーを操作したり何かをドラッグしたりしたときにしか動作しません。
一度もサインインしていなくても、拡張機能が自動的に送信するレポートが1つだけあります。ライセンスやインストールの整合性データが改ざんされたことを検知した場合、有料ティアの不正利用を検出するために、同じ Supabase バックエンドへ匿名のアラート(イベント種別と重大度のみで、ブックマークや閲覧データは含みません)を1件送信します。通常利用時には動作しません。
クラウド同期:明示的な例外
ここまで説明したものはすべて、デフォルトではローカルで完結します——ブックマークデータと設定は、Chrome 自体のブックマークストレージと、あなたのデバイス上の Chrome の拡張機能ストレージに保存されます。クラウド同期は唯一の意図的な例外であり、オプトインです。Google でのサインインが必要で、有料サブスクリプションも必要です。有効にすると、ブックマークのルート、拡張機能の設定、共有スペースが Supabase バックエンドと同期されますが、これはストレージに置きっぱなしの長寿命な静的キーではなく、自動更新・レート制限・トークンバージョニングを備えた短命なセッショントークンを使って行われます。
同期の方向性も重要です。拡張機能はデフォルトでローカルファーストです。クラウドからの読み取りは、あなたが明示的にトリガーしたときにしか発生しません。書き込みは変更を自動的にクラウドへプッシュしてバックアップを取りますが、バックグラウンドで静かにクラウドからデータを引き下ろしてデバイス上のものを書き換えることはありません。サブスクリプションが失効しても、猶予期間中は読み取り専用アクセスが維持されますし、ローカルエクスポートはサブスクリプションの状態にかかわらず常に機能します——クラウド同期がなくなっても、ブックマークがなくなるわけではありません。
アンインストールテスト
bookmarks 権限を持つどんな拡張機能に対しても、私が当てはめるテストがあります。それを削除した後に何が残るか、です。この拡張機能の場合、答えは「すべて」です。そもそもこの拡張機能は、独自の並行データストアを作ったことが一度もないからです。標準の Chrome ブックマーク、つまり Chrome 自身が管理しているのと同じツリーを読み書きしているだけです。拡張機能をアンインストールしても、ブックマークはそこにあり続け、同じフォルダに整理されたままで、他のどのブックマークとも同じように chrome://bookmarks からエクスポートできます。拡張機能を削除しても元のデータには何の影響もありません。なぜなら元のデータは、最初から Chrome 自身のものでしかなかったからです。この点は——同期とアンインストールに関する短いバージョンの説明とあわせて——サイトの FAQにも載っているので、手早く確認したい場合はそちらもどうぞ。
その主張を裏付けるロールバックとエクスポートの仕組みについてもっと詳しく知りたい場合は、それ専用の記事があります。クラウド同期にお金を払う価値が具体的にあるかどうかを検討しているなら、Free と Pro の比較が別途その点を扱っています。プライバシーポリシーには、上記すべての法律用語版が書かれています——この記事はその平易な言葉版であり、まずこちらを読んでいただく方をおすすめします。