CORSへの対応と注意点

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 で権限を設定

json
{ "name": "MyExtension", "version": "1.0", "manifest_version": 3, "permissions": [], "host_permissions": [ "https://api.example.com/*" ], "background": { "service_worker": "background.js" } }
  • host_permissionsに対象APIのドメインを明示することが重要です。

2. background.js でfetchを実行(CORS回避が可能)

js
fetch("https://api.example.com/data") .then(response => response.json()) .then(data => console.log(data));
  • この方法では、対象の外部APIサーバがCORSヘッダを返さなくても通信が成功するケースがあります(Chrome拡張機能特有の挙動)。


注意点と制約

APIサーバ側がCORS非対応の場合

  • content_scriptpopup などの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