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
- Chrome Extensions Get started: https://developer.chrome.com/docs/extensions/get-started/
- Chrome Extensions Declare permissions: https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions
- Chrome Extensions Storage API: https://developer.chrome.com/docs/extensions/reference/api/storage
- Chrome Web Store Program Policies: https://developer.chrome.com/docs/webstore/program-policies/policies
- Chrome Web Store User Data FAQ: https://developer.chrome.com/docs/webstore/program-policies/user-data-faq
- Polar Documentation: https://docs.polar.sh/
- Polar Webhook Endpoints: https://polar.sh/docs/integrate/webhooks/endpoints
- Polar Automated Benefits: https://docs.polar.sh/features/benefits/introduction