Chrome拡張機能において外部APIと通信する際、CORS(Cross-Origin Resource Sharing)への対応は重要な技術的要件です。以下に、CORSの概要と、Chrome拡張機能での対応方法および注意点を詳しく説明します。
CORS(Cross-Origin Resource Sharing)とは
CORSは、あるオリジン(ドメイン・ポート・プロトコルの組み合わせ)から、別のオリジンのリソースへアクセスすることを制御するセキュリティ機構です。通常、ブラウザは同一オリジンポリシーによりクロスオリジン通信を制限しますが、CORSによって制限を緩和する仕組みが提供されます。
Chrome拡張機能におけるCORSの基本動作
Chrome拡張機能は通常のWebページと異なり、一部のクロスオリジン通信が**拡張機能の権限設定(permissions)**によって許可される特権的な環境で動作します。
特徴
-
content_scriptからのfetchは通常のWebページと同様にCORS制限を受ける。 -
background script(またはservice_worker)では、host_permissionsで対象ドメインを許可すれば、CORS制限を回避して外部APIにアクセス可能。
実装手順と対応方法
1. manifest.json で権限を設定
manifest.json で権限を設定
-
host_permissionsに対象APIのドメインを明示することが重要です。
2. background.js でfetchを実行(CORS回避が可能)
background.js でfetchを実行(CORS回避が可能)
-
この方法では、対象の外部APIサーバがCORSヘッダを返さなくても通信が成功するケースがあります(Chrome拡張機能特有の挙動)。
注意点と制約
APIサーバ側がCORS非対応の場合
-
content_scriptやpopupなどのDOMから直接fetchを行うと、CORSエラーになります。 -
対策:
background scriptを中継してAPIリクエストを行い、結果をcontent_scriptなどに渡す。
credentials(CookieやAuthorizationヘッダ)の送信
-
CORSでは、
credentials: 'include'でクッキーを送信できますが、サーバ側もAccess-Control-Allow-Credentials: trueを返す必要があります。 -
拡張機能の場合も同様で、これらのヘッダが揃わないと通信に失敗します。
セキュリティ
-
host_permissionsに広範なドメイン(例:<all_urls>)を設定すると、セキュリティリスクが増します。 -
必要最小限のドメインを明示的に指定することが推奨されます(最小権限の原則)。
まとめ
| 項目 | 内容 |
|---|---|
| content_script からの fetch | CORS 制限あり。外部APIが CORS に対応している必要あり |
| background script からの fetch | manifest の host_permissions に記載すれば CORS 制限を受けない |
| credentials の送信 | CORS ヘッダとの整合性が必要 |
| セキュリティ対策 | 過剰な host_permissions は避けること |
必要に応じて、拡張機能と外部API間の通信は background script 経由で行い、CORSエラーを回避しつつ安全性を確保する実装が望まれます。
生成日:2025/05/18