ARTICLE

chrome.storageをライセンス状態のキャッシュとして使う

ローカルストレージキャッシュとライセンス検証を表す図。

Chrome拡張では、設定値や小さな状態を保存するために chrome.storage を使えます。 通常のWebページで使う localStorage と似た用途に見えますが、拡張機能のコンテキストに合わせて設計されたAPIです。 service worker、Popup、Options pageなど、複数の拡張コンテキストから扱いやすい点が重要です。

有料Chrome拡張では、ライセンス状態の保存に chrome.storage を使う場面があります。 たとえば、ユーザーがライセンスキーを入力したあと、最後に確認した結果、確認時刻、表示用のプラン名などを保存しておけば、Popupを開くたびに毎回サーバーへ問い合わせなくてもUIをすばやく表示できます。

ただし、保存した状態を「正」として扱ってはいけません。 ローカルに保存された値は、あくまでキャッシュです。 返金、解約、ライセンス無効化、端末上限の超過などはサーバー側で判断する必要があります。 ローカルの状態だけで有料機能を永久に開放する設計にすると、課金管理として弱くなります。

実装方針としては、次のような役割分担が扱いやすいです。

  • chrome.storage.local: ライセンスキー、最後の検証結果、最終検証時刻、UIの設定値を保存する。
  • Cloudflare Worker API: ライセンスキーや購入状態を検証する。
  • Polar.sh: 購入、Benefit、ライセンスキー、GitHubアクセスなどの元情報を管理する。
  • 拡張UI: キャッシュされた状態を表示しつつ、必要なタイミングで再検証する。

再検証のタイミングも設計が必要です。 毎回APIへ問い合わせるとユーザー体験が重くなりますが、長く問い合わせないと失効を反映できません。 たとえば、Popupを開いたとき、ブラウザ起動後の初回、最後の検証から一定時間が過ぎたとき、有料機能を使う直前などに再検証します。

ライセンスキーを保存する場合は、保存する値を最小限にしてください。 決済情報、不要な個人情報、閲覧ページの内容などを保存する必要は通常ありません。 また、ログにライセンスキー全文を出さない、サポート画面では一部だけを表示する、といった運用上の配慮も必要です。

chrome.storage は便利ですが、課金の権威ではありません。 有料Chrome拡張では「ローカルは速さのためのキャッシュ、サーバーは判定のための権威」と分けると、ユーザー体験と不正対策のバランスを取りやすくなります。

References