CORS(Cross-Origin Resource Sharing)は、異なるオリジン(ドメイン)間でのリソース共有を制御する仕組みです。これにより、あるWebサイトが他のサーバーのAPIやデータにアクセスできるようになりますが、セキュリティ上の理由からデフォルトではブロックされています。Apacheサーバーでは、CORS設定を適切に行うことで、必要なリソースだけを許可し、不要なアクセスを制限できます。
特に、動的コンテンツ(APIやデータベースとのやり取り)と静的コンテンツ(画像、CSS、JavaScriptなど)では、CORSの設定が異なる場合があります。本記事では、Apacheで動的・静的コンテンツに応じたCORSの設定方法を分かりやすく解説します。これにより、安全で柔軟なWebアプリケーション環境を構築できるようになります。
CORSとは何か
CORS(Cross-Origin Resource Sharing)は、異なるオリジン(ドメイン、プロトコル、ポート)間でリソースを共有するための仕組みです。通常、セキュリティ上の理由から、Webブラウザは異なるオリジンへのリクエストを制限します。これを「同一オリジンポリシー」と呼びます。
CORSは、この制限を緩和し、安全に異なるオリジンからのリソース取得を可能にする技術です。たとえば、https://example.com のWebアプリケーションが https://api.example.net からデータを取得する場合、CORSが適切に設定されていればアクセスが許可されます。
CORSの仕組み
CORSは、サーバー側のレスポンスヘッダーを使って制御されます。典型的なCORSレスポンスヘッダーは以下のようになります。
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: Content-Type
これにより、https://example.com からのリクエストが許可され、GET や POST などの指定されたメソッドを使用できるようになります。
CORSが必要なケース
- APIとの連携:フロントエンドが異なるサーバー上のAPIとやり取りする場合。
- マイクロサービスアーキテクチャ:複数のサービスが異なるオリジンに存在するケース。
- CDN(コンテンツデリバリネットワーク):静的リソースを外部のCDNから取得する場合。
CORSの適切な設定は、セキュリティを保ちながら異なるオリジン間でのリソース共有を可能にします。次のセクションでは、ApacheでCORSを設定する基本的な方法について解説します。
ApacheにおけるCORS設定の基本
ApacheサーバーでCORSを設定するには、主にレスポンスヘッダーを追加する方法を用います。Apacheはmod_headersモジュールを使用して、必要なCORSヘッダーを設定します。
基本的なCORS設定
ApacheでCORSを設定するためには、httpd.confや.htaccessファイルに以下のようなディレクティブを追加します。
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
</IfModule>
この設定により、すべてのオリジンからのリクエストが許可されます。Access-Control-Allow-Originを*にすることで、任意のオリジンを受け入れることができますが、セキュリティ上のリスクがあるため、本番環境では特定のオリジンを指定することが推奨されます。
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "https://example.com"
</IfModule>
特定のオリジンのみ許可する場合は、このようにドメインを指定します。
複数のHTTPメソッドを許可する
次に、GET、POST、PUTなどのメソッドを指定して、特定の操作だけを許可します。
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "https://example.com"
Header set Access-Control-Allow-Methods "GET, POST, PUT"
</IfModule>
これにより、許可されたメソッドのみがアクセス可能になります。
カスタムヘッダーの許可
クライアントがContent-Typeなどのカスタムヘッダーを送信する場合、それも許可する必要があります。
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "https://example.com"
Header set Access-Control-Allow-Methods "GET, POST, PUT"
Header set Access-Control-Allow-Headers "Content-Type, Authorization"
</IfModule> プリフライトリクエストの対応
OPTIONSリクエスト(プリフライトリクエスト)にも対応する必要があります。これはブラウザが本リクエストを送る前に確認のため送信するリクエストです。
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "https://example.com"
Header set Access-Control-Allow-Methods "GET, POST, PUT"
Header set Access-Control-Allow-Headers "Content-Type, Authorization"
Header set Access-Control-Max-Age "3600"
</IfModule> Access-Control-Max-Ageはプリフライトリクエストの結果をキャッシュする時間を指定します。
これで、Apacheサーバーでの基本的なCORS設定が完了します。次のセクションでは、動的コンテンツと静的コンテンツに対して個別にCORSを設定する方法を解説します。
動的コンテンツに対するCORSの設定方法
動的コンテンツ(PHP、Python、Node.jsなどで生成されるレスポンス)では、CORSの設定をサーバーサイドで柔軟に制御する必要があります。Apacheでは、mod_headersを使い、動的なパスや特定のディレクトリに対して異なるCORS設定を行うことができます。
特定のディレクトリでのCORS設定
動的コンテンツが配置されているディレクトリに対して、以下のようにDirectoryディレクティブを用いてCORSを設定します。
<Directory "/var/www/html/api">
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "https://example.com"
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
Header set Access-Control-Allow-Headers "Content-Type, Authorization"
</IfModule>
</Directory>
この設定により、/var/www/html/api配下の動的コンテンツにCORSが適用されます。これにより、特定のオリジンだけがAPIにアクセスできるようになります。
PHPでのCORSヘッダー設定
PHPで動的にCORSを設定する場合は、以下のようにコード内でヘッダーを追加します。これにより、APIごとに異なるオリジンを許可することが可能になります。
<?php
// オリジンの判定
$origin = $_SERVER['HTTP_ORIGIN'];
$allowed_origins = ['https://example.com', 'https://app.example.net'];
if (in_array($origin, $allowed_origins)) {
header("Access-Control-Allow-Origin: $origin");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type, Authorization");
header("Access-Control-Max-Age: 3600");
} else {
header("HTTP/1.1 403 Forbidden");
echo "Access denied";
exit;
}
このコードは、許可されたオリジンからのリクエストのみ受け入れる仕組みです。
Node.jsでのCORS設定
Node.jsでは、corsモジュールを使用して簡単にCORSを設定できます。
const express = require('express');
const cors = require('cors');
const app = express();
const allowedOrigins = ['https://example.com', 'https://app.example.net'];
app.use(cors({
origin: function (origin, callback) {
if (allowedOrigins.includes(origin)) {
callback(null, true);
} else {
callback(new Error('Not allowed by CORS'));
}
},
methods: ['GET', 'POST', 'OPTIONS'],
allowedHeaders: ['Content-Type', 'Authorization']
}));
app.get('/api/data', (req, res) => {
res.json({ message: 'CORS is working!' });
});
これにより、Node.jsアプリケーションでも動的にCORS設定が可能になります。
セキュリティの強化
動的コンテンツでは、特にAPIが攻撃対象になりやすいため、以下の点に注意してCORSを設定しましょう。
- 許可するオリジンを限定する
OPTIONSリクエストの適切な処理を行う- セッション管理や認証を強化する
次のセクションでは、静的コンテンツに対してCORSを設定する方法を解説します。
静的コンテンツに対するCORSの設定方法
静的コンテンツ(画像、CSS、JavaScriptなど)にもCORSを適用することで、他のドメインからのリソース取得が可能になります。特にCDN(コンテンツデリバリネットワーク)を使用する場合や、異なるドメイン間でリソースを共有する必要がある場合に重要です。
静的コンテンツのCORS設定例
Apacheでは、静的ファイルが配置されているディレクトリに対してFilesMatchやDirectoryディレクティブを使ってCORSを設定できます。
<Directory "/var/www/html/static">
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "GET, OPTIONS"
</IfModule>
</Directory>
この例では、/var/www/html/static配下のすべての静的コンテンツが外部からアクセス可能になります。Access-Control-Allow-Originを*に設定することで、どのオリジンからでもアクセスが許可されます。
特定のファイルタイプにCORSを設定
画像やフォントファイルだけにCORSを適用したい場合は、FilesMatchを使って対象を絞ることができます。
<IfModule mod_headers.c>
<FilesMatch "\.(jpg|jpeg|png|gif|svg|woff|woff2|ttf|css|js)$">
Header set Access-Control-Allow-Origin "*"
</FilesMatch>
</IfModule>
この設定により、jpgやcssなどの静的リソースに対してCORSが適用されます。フォントや画像のCORSエラーを防ぐことができます。
.htaccessを使った静的コンテンツのCORS設定
.htaccessを使うことで、特定のディレクトリに対して簡単にCORSを設定できます。以下の例は、/staticディレクトリにCORSを適用する方法です。
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "https://example.com"
</IfModule>
.htaccessは柔軟性が高く、管理しやすいため、静的コンテンツのCORS設定には便利です。
CDNを使用する場合のCORS設定
CDNで静的コンテンツを提供する場合は、Apache側で適切にCORSを設定し、クライアントがスムーズにリソースを取得できるようにします。
<IfModule mod_headers.c>
<FilesMatch "\.(js|css|png|jpg|gif|svg)$">
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "GET, OPTIONS"
</FilesMatch>
</IfModule>
これにより、外部からCDN経由で配信される静的コンテンツが正常に読み込まれます。
セキュリティ上の考慮事項
静的コンテンツのCORS設定では、以下のポイントに注意しましょう。
Access-Control-Allow-Originを*に設定するのは開発環境のみで使用し、本番環境では特定のオリジンを指定する。- フォントや画像などのリソースに対する不要なオリジンのアクセスを防ぐため、必要最低限のオリジンだけを許可する。
次のセクションでは、Locationディレクティブを用いた動的・静的コンテンツのセクション分けについて解説します。
Locationディレクティブを使用したセクション分け
Apacheでは、Locationディレクティブを使ってURLパスごとに異なるCORS設定を適用できます。これにより、動的コンテンツと静的コンテンツを明確に分離し、必要な部分だけにCORSを適用することが可能です。
Locationディレクティブの基本
Locationディレクティブは、URLパスに基づいて設定を適用します。たとえば、/apiへのリクエストにはCORSを許可し、/staticには適用しないといった細かな制御が可能です。
<Location /api>
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "https://example.com"
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
Header set Access-Control-Allow-Headers "Content-Type, Authorization"
</IfModule>
</Location>
<Location /static>
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "GET, OPTIONS"
</IfModule>
</Location>
この例では、/apiへのアクセスはhttps://example.comからのみ許可され、/static以下の静的リソースはすべてのオリジンからアクセス可能になります。
動的コンテンツと静的コンテンツの分離
Locationディレクティブを使うことで、APIやバックエンドサービスとフロントエンドの静的リソースを分離できます。これにより、セキュリティとパフォーマンスを両立した設定が可能になります。
<Location /backend>
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "https://app.example.net"
Header set Access-Control-Allow-Methods "POST, GET, OPTIONS"
Header set Access-Control-Allow-Headers "Authorization, X-Requested-With"
</IfModule>
</Location>
<Location /assets>
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "GET, OPTIONS"
</IfModule>
</Location>
この設定では、/backendのAPIは特定のオリジンからのみアクセスが許可され、/assets(画像やJSファイルなど)はすべてのオリジンからアクセス可能になります。
動的パスのCORS設定
LocationMatchを使うと、正規表現で複数のパスにCORS設定を適用できます。たとえば、/api/v1や/api/v2などのパスを一括して管理できます。
<LocationMatch "^/api/v[0-9]+">
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "https://example.com"
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
Header set Access-Control-Allow-Headers "Content-Type, Authorization"
</IfModule>
</LocationMatch>
この設定では、/api/v1や/api/v2などのすべてのAPIバージョンでCORSが適用されます。
セキュリティとパフォーマンスの向上
- 動的コンテンツには必要最小限のオリジンだけを許可する。
- 静的コンテンツは柔軟にアクセスできるように設定しつつ、キャッシュを有効にしてパフォーマンスを最適化する。
OPTIONSリクエストに適切に対応し、プリフライトリクエストの回数を最小限に抑える。
次のセクションでは、.htaccessを使った簡単なCORS設定方法を解説します。
.htaccessでのCORS設定方法
.htaccessファイルを使用すると、Apacheの設定を柔軟に行うことができます。特にCORS設定は.htaccessで手軽に適用でき、特定のディレクトリやファイルに対して簡単にカスタマイズ可能です。.htaccessはサイトのルートや特定のフォルダに配置され、設定内容がそのディレクトリ以下に適用されます。
.htaccessを使った基本的なCORS設定
以下は、すべてのオリジンからのアクセスを許可する基本的な設定例です。
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
Header set Access-Control-Allow-Headers "Content-Type, Authorization"
</IfModule>
この設定は、任意のオリジンからのGETやPOSTリクエストを許可し、Content-TypeやAuthorizationといったカスタムヘッダーを受け付けます。
特定のオリジンを許可する設定
本番環境では、特定のオリジンからのみアクセスを許可する方が安全です。
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "https://example.com"
Header set Access-Control-Allow-Methods "GET, POST"
Header set Access-Control-Allow-Headers "Authorization"
</IfModule>
この設定では、https://example.comからのリクエストだけを受け付けます。他のオリジンからのアクセスは拒否されます。
特定のファイルタイプにCORSを適用
画像やフォントファイルなど、特定のファイルタイプにCORSを適用することも可能です。
<IfModule mod_headers.c>
<FilesMatch "\.(jpg|jpeg|png|gif|svg|woff|woff2|ttf|css|js)$">
Header set Access-Control-Allow-Origin "*"
</FilesMatch>
</IfModule>
この例では、画像やフォント、CSS、JavaScriptなどのリソースに対してCORSが適用されます。外部からのフォントロードや画像アクセスのエラーを防ぐことができます。
OPTIONSリクエスト(プリフライト)への対応
CORSでは、OPTIONSメソッドによるプリフライトリクエストが送信されることがあります。これに対応しないと、ブラウザがCORSエラーを返します。.htaccessで以下のように設定することで、プリフライトリクエストを適切に処理できます。
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "https://example.com"
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
Header set Access-Control-Allow-Headers "Content-Type, Authorization"
</IfModule>
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L] RewriteRuleを使って、OPTIONSリクエストに対して200ステータスコードを返し、プリフライトリクエストを許可します。
サブディレクトリごとのCORS設定
特定のディレクトリに対して異なるCORS設定を行いたい場合は、サブディレクトリごとに.htaccessを配置します。
# /var/www/html/api/.htaccess
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "https://app.example.net"
</IfModule>
# /var/www/html/static/.htaccess
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
</IfModule>
APIディレクトリでは特定のオリジンのみ許可し、静的コンテンツはすべてのオリジンからアクセス可能にしています。
セキュリティ上の考慮事項
*を使うと任意のオリジンからアクセスが可能になるため、本番環境では避け、特定のオリジンを指定する。- 誤った設定を避けるため、必要なディレクティブのみを適用し、不要なメソッドやヘッダーの許可を最小限に抑える。
- CORS設定後はブラウザで適切に反映されているか検証し、エラーが発生しないことを確認する。
次のセクションでは、CORSエラーのデバッグ方法について解説します。
CORSエラーのデバッグ方法
CORS(Cross-Origin Resource Sharing)エラーは、異なるオリジン間でリソースをやり取りする際に発生します。これらのエラーはブラウザのセキュリティ機能によってブロックされることが多く、適切にデバッグしないと問題が解消されません。ここでは、CORSエラーを特定し、解消するための具体的な方法を解説します。
ブラウザでのエラーチェック
CORSエラーの多くはブラウザの開発者ツールで確認できます。以下の手順でエラーを確認します。
- ブラウザの開発者ツールを開く:
- Chrome:
F12またはCtrl + Shift + I - Firefox:
F12またはCtrl + Shift + I
- 「コンソール」タブを開く:
CORSエラーは赤字で表示されます。エラーメッセージには「CORS policy」と記載されていることが多いです。 - 「ネットワーク」タブでリクエストを確認:
- エラーが発生したリクエストを選択し、「ヘッダー」タブを確認します。
- RequestとResponseヘッダーを比較し、
Access-Control-Allow-Originなどが正しく設定されているか確認します。
よくあるCORSエラーと原因
- No ‘Access-Control-Allow-Origin’ header is present on the requested resource
→ サーバー側でAccess-Control-Allow-Originが設定されていません。 - The ‘Access-Control-Allow-Origin’ header has a value ‘null’
→ オリジンが不正に設定されているか、サーバー側が適切にオリジンを処理していません。 - Preflight request failed
→OPTIONSリクエストにサーバーが対応していない、またはAccess-Control-Allow-Methodsが不足しています。
サーバーログでのエラー確認
Apacheのログを確認することで、サーバー側の設定ミスを特定できます。
sudo tail -f /var/log/apache2/access.log
sudo tail -f /var/log/apache2/error.log
エラーが記録されている場合は、該当するディレクティブが正しく動作していない可能性があります。
プリフライトリクエストのデバッグ
CORSでは、ブラウザがOPTIONSメソッドによるプリフライトリクエストを送信します。これが失敗すると、リクエストがブロックされます。以下の方法でプリフライトを確認します。
curl -X OPTIONS -H "Origin: https://example.com" https://api.example.com
このリクエストが200 OKで返ってくることを確認してください。
CORSエラーの解消方法
- サーバー側でCORSヘッダーを正しく設定:
.htaccessまたはhttpd.confで以下のように設定します。
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "https://example.com"
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
Header set Access-Control-Allow-Headers "Content-Type, Authorization"
</IfModule> - プリフライト対応:
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L] - オリジンの動的対応(PHP例):
<?php
$origin = $_SERVER['HTTP_ORIGIN'];
$allowed_origins = ['https://example.com', 'https://app.example.net'];
if (in_array($origin, $allowed_origins)) {
header("Access-Control-Allow-Origin: $origin");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type, Authorization");
} else {
header("HTTP/1.1 403 Forbidden");
exit;
} キャッシュのクリア
CORSヘッダーの変更後は、ブラウザキャッシュが原因で変更が反映されない場合があります。以下の方法でキャッシュをクリアします。
- スーパーリロード:
Ctrl + F5(Chrome, Firefox) - キャッシュ削除:ブラウザの設定からキャッシュをクリア
次のセクションでは、セキュリティ面での注意点について解説します。
セキュリティ面での注意点
CORS(Cross-Origin Resource Sharing)設定は、異なるオリジン間でのリソース共有を可能にする便利な機能ですが、誤った設定はセキュリティリスクを引き起こします。CORSの設定ミスが原因で、機密データの漏洩や攻撃を受ける可能性があるため、適切なセキュリティ対策が必要です。
セキュリティリスクと対策
1. ワイルドカード(*)の乱用を避ける
Access-Control-Allow-Originを*に設定すると、すべてのオリジンからリソースにアクセス可能になります。これは便利ですが、攻撃者にとってもリソースが簡単に取得可能となり、セキュリティホールとなります。
対策:
- 必ず特定のオリジンを明示的に指定する。
Header set Access-Control-Allow-Origin "https://example.com" - 必要に応じて複数のオリジンを動的に処理する。
2. プリフライトリクエストを慎重に設定
OPTIONSリクエストへの不適切な対応は、悪意のあるリクエストを許可する原因になります。
対策:
- 必要最低限のメソッドのみ許可する。
Header set Access-Control-Allow-Methods "GET, POST" - 不要なHTTPメソッド(PUT, DELETEなど)を許可しない。
- 認証が必要なAPIは
Authorizationヘッダーの検証を行う。
3. センシティブなデータへのアクセス制限
APIレスポンスにAccess-Control-Allow-Origin: *が設定されていると、認証情報やユーザーデータが他のオリジンから取得される可能性があります。
対策:
- 認証が必要なエンドポイントにはCORSを適用しない。
- セッションデータやクッキーが関与するリクエストは、
Access-Control-Allow-Credentialsを使用して制御する。
Header set Access-Control-Allow-Credentials "true"
Header set Access-Control-Allow-Origin "https://example.com" 4. クレデンシャル付きリクエストの慎重な取り扱い
Access-Control-Allow-Credentials: trueを使用すると、認証情報が含まれたリクエストが許可されますが、オリジンの設定ミスがあると重大な情報漏洩の原因になります。
対策:
Access-Control-Allow-OriginとAccess-Control-Allow-Credentialsを併用し、ワイルドカードを使わない。- オリジンを動的に検証し、許可リストに含まれていない場合は403エラーを返す。
<?php
$origin = $_SERVER['HTTP_ORIGIN'];
$allowed_origins = ['https://example.com', 'https://trusted.com'];
if (in_array($origin, $allowed_origins)) {
header("Access-Control-Allow-Origin: $origin");
header("Access-Control-Allow-Credentials: true");
} else {
header("HTTP/1.1 403 Forbidden");
exit;
} 5. サーバーレスポンスの最小化
エラーメッセージに詳細な情報を含めると、攻撃者が脆弱性を特定する手がかりになります。
対策:
- エラーレスポンスに機密情報を含めない。
- 必要最低限のヘッダーのみを返す。
Header always unset X-Powered-By
Header always unset Server 監視とログの重要性
CORS関連のリクエストは、アクセスログやエラーログに記録されるため、定期的に監視することで不審な動きを検知できます。
sudo tail -f /var/log/apache2/access.log
sudo tail -f /var/log/apache2/error.log まとめ
CORS設定は柔軟で便利ですが、設定ミスがセキュリティ上の脅威となる可能性があります。ワイルドカードの使用を避け、オリジンやメソッドを厳密に制御することで、安全なWebアプリケーション環境を構築しましょう。次のセクションでは、ApacheでのCORS設定のまとめを行います。
まとめ
本記事では、Apacheで動的コンテンツと静的コンテンツに応じたCORS設定方法について詳しく解説しました。CORSは異なるオリジン間でのリソース共有を可能にする重要な技術ですが、設定ミスがセキュリティリスクを引き起こす可能性があります。
動的コンテンツ(APIなど)には、特定のオリジンを指定することでセキュリティを強化し、静的コンテンツ(画像やCSS、JavaScriptなど)には柔軟なCORS設定を適用することで、利便性と安全性を両立させることが重要です。
- 動的コンテンツには
Locationディレクティブを活用して細かく制御する - 静的コンテンツには
.htaccessで簡潔にCORSを設定する - プリフライトリクエストやクレデンシャル対応を慎重に設定し、セキュリティリスクを最小限に抑える
CORS設定の適切な運用により、Webアプリケーションの信頼性と安全性を向上させることができます。

コメント