Apacheでmod_rewriteを使用してCORS設定を柔軟に管理する方法

CORS (Cross-Origin Resource Sharing) は、異なるオリジン間でのリソースのやり取りを許可または制限するためのセキュリティ機構です。近年のWebアプリケーション開発では、フロントエンドとバックエンドが異なるドメインやポートで動作することが一般的であり、CORS設定が適切でないとAPIリクエストがブロックされてしまいます。

Apacheは、Webサーバーとして広く利用されており、その柔軟なモジュール構成が特徴です。特にmod_rewriteは、リクエストの書き換えやリダイレクトを行う強力なモジュールであり、CORSの設定を細かく管理する際にも役立ちます。

本記事では、Apacheのmod_rewriteを使用して、CORS設定を柔軟に管理する方法を解説します。特定のオリジンを許可する方法や、複数のオリジンを動的に許可するテクニック、さらにはセキュリティを強化するための設定例を紹介します。mod_rewriteの基礎から応用までを網羅し、効率的にCORSの課題を解決できる内容となっています。

目次
  1. CORSの基本と必要性
    1. CORSが必要な場面
    2. CORSを設定しない場合の問題
  2. Apacheとmod_rewriteの概要
    1. mod_rewriteの役割
    2. mod_rewriteの基本的な動作
    3. mod_rewriteの利点
  3. mod_rewriteを使ったCORS設定の仕組み
    1. 基本的なCORS設定の流れ
    2. mod_rewriteによるCORSヘッダーの付与例
    3. 動作の仕組み
    4. メリットと応用
  4. 基本的なmod_rewriteルールの記述方法
    1. mod_rewriteルールの基本構成
    2. 基本構文の例
    3. CORS対応の具体例
    4. ルールの解説
    5. 複数のオリジンを許可する場合
    6. ポイント
  5. 特定のオリジンだけを許可する方法
    1. 単一のオリジンを許可する基本設定
    2. 複数のオリジンを個別に許可する方法
    3. 許可されていないオリジンを拒否する設定
    4. パフォーマンスを考慮したルールの最適化
  6. 複数のオリジンを動的に許可する設定
    1. 複数のオリジンを正規表現で許可する方法
    2. ホワイトリストのリスト管理
    3. リクエストオリジンを動的に許可する設定
    4. 利点と注意点
  7. セキュリティを考慮したCORS設定のポイント
    1. 1. ワイルドカード`*`の使用を避ける
    2. 2. 認証付きリクエストではオリジンを固定する
    3. 3. プリフライトリクエストへの対応
    4. 4. レスポンスヘッダーの露出を制限
    5. 5. 信頼されたオリジンのみ許可
    6. 6. オリジン検証のログ出力
    7. 7. デバッグ用の緩和設定を本番環境で使わない
    8. セキュリティチェックリスト
  8. 実際の設定例と.htaccessのサンプルコード
    1. 1. 単一オリジンを許可する.htaccessの例
    2. 2. 複数のオリジンを許可する.htaccessの例
    3. 3. プリフライトリクエストを許可する.htaccess
    4. 4. ホワイトリスト方式でオリジンを管理する.htaccess
    5. 5. 許可されていないオリジンを拒否する.htaccess
    6. 注意点
  9. まとめ

CORSの基本と必要性


CORS (Cross-Origin Resource Sharing) とは、異なるオリジン間でリソースを共有する際のセキュリティ制約を管理する仕組みです。オリジンとは、プロトコル、ドメイン、ポートの組み合わせを指します。たとえば、https://example.comhttps://api.example.comは異なるオリジンです。

Webブラウザは、セキュリティ上の理由から異なるオリジン間でのリクエストを制限します。これを「同一オリジンポリシー」と呼びます。同一オリジンポリシーは、悪意のあるサイトが他サイトのデータを不正に取得することを防ぐ重要な仕組みです。しかし、API連携が不可欠な現代のWeb開発では、異なるオリジンのリソースにアクセスする必要が多々あります。

そこでCORSが登場します。CORSは、サーバー側で特定のオリジンからのリクエストを許可することで、この制限を回避します。これにより、フロントエンドとバックエンドが異なるオリジンでホストされていても、安全にデータのやり取りが可能になります。

CORSが必要な場面

  • SPA (シングルページアプリケーション) とAPIの連携
  • フロントエンドとバックエンドが異なるドメインで動作するプロジェクト
  • 外部サービスのAPIを利用するサードパーティアプリケーション

CORSを設定しない場合の問題


CORS設定が適切でない場合、次のような問題が発生します。

  • リクエストがブロックされる:ブラウザがリクエストを遮断し、APIからのレスポンスが得られません。
  • エラーが発生:開発者ツールのコンソールに「CORS policy: No ‘Access-Control-Allow-Origin’ header is present」のエラーが表示されます。

CORSを正しく理解し設定することで、APIリクエストをスムーズに処理し、異なるオリジン間の通信が可能になります。次章では、Apacheとmod_rewriteを用いたCORS設定方法について詳しく解説します。

Apacheとmod_rewriteの概要


Apacheは、Webサーバーソフトウェアとして世界中で広く利用されており、その安定性と柔軟性から多くのプロジェクトで採用されています。特に、モジュールを追加することで多様な機能を実現できる点が特徴です。その中でもmod_rewriteは、リクエストの書き換えやリダイレクトを行う強力なモジュールとして知られています。

mod_rewriteを活用することで、URLの書き換えやリダイレクト、特定条件下でのリクエストの制御が可能になります。これにより、CORS設定の柔軟な管理が可能となり、特定のオリジンからのリクエストのみを許可する高度な設定を実現できます。

mod_rewriteの役割


mod_rewriteの主な役割は、クライアントからのリクエストを受け取った際にURLを動的に書き換えることです。これにより、以下のような処理が可能になります。

  • 動的なリダイレクト:特定のパスにアクセスされた場合、別のURLへ転送します。
  • 条件付きの処理:リクエストヘッダーやIPアドレスに応じて異なる処理を適用します。
  • CORS設定の書き換え:特定のオリジンに対してのみAccess-Control-Allow-Originヘッダーを動的に付与します。

mod_rewriteの基本的な動作


mod_rewriteは、主に以下の3つのディレクティブを使用して設定します。

  • RewriteEngine – mod_rewriteの有効化
  • RewriteCond – 条件指定
  • RewriteRule – 書き換えルールの設定

以下は基本的な構文の例です。

RewriteEngine On  
RewriteCond %{HTTP_HOST} ^example\.com$  
RewriteRule ^(.*)$ http://api.example.com/$1 [P]  


この設定により、example.comへのリクエストはすべてapi.example.comへプロキシされます。

mod_rewriteの利点

  • 柔軟なリクエスト制御:リクエストの内容やヘッダーに基づいて動的に処理を変更可能です。
  • 効率的なCORS管理:複数のオリジンに対して条件付きでCORS設定を適用できます。
  • メンテナンスの簡素化:.htaccessファイルに記述することで、Webサーバーの設定を柔軟に変更できます。

次章では、mod_rewriteを使用して具体的にCORS設定を行う方法について解説していきます。

mod_rewriteを使ったCORS設定の仕組み


mod_rewriteを使用すると、リクエストごとに条件を分岐させ、動的にCORSヘッダーを付与することが可能になります。通常、ApacheでCORSを設定する場合はHeaderディレクティブを使用しますが、mod_rewriteを併用することで、より細かくオリジンを制御し、特定のオリジンのみを許可する設定が容易になります。

基本的なCORS設定の流れ

  1. クライアントからリクエストが送信される
  2. ApacheがリクエストヘッダーのOriginを確認する
  3. RewriteCondでリクエストヘッダーを条件分岐
  4. RewriteRuleで特定のオリジンに対してAccess-Control-Allow-Originヘッダーを付与

これにより、複数のオリジンを動的に許可するだけでなく、不要なオリジンからのアクセスを制限することが可能になります。

mod_rewriteによるCORSヘッダーの付与例


以下は、特定のオリジンhttps://trusted.comからのリクエストのみ許可する設定例です。

RewriteEngine On  
RewriteCond %{HTTP:Origin} ^https://trusted\.com$ [NC]  
RewriteRule .* - [E=ORIGIN_OK:1]  

Header set Access-Control-Allow-Origin "https://trusted.com" env=ORIGIN_OK  
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS" env=ORIGIN_OK  
Header set Access-Control-Allow-Headers "Authorization, Content-Type" env=ORIGIN_OK  


この設定では、trusted.comからのリクエストでOriginヘッダーが一致した場合のみ、Access-Control-Allow-Originが付与されます。

動作の仕組み

  • RewriteCondは、リクエストヘッダーOriginが特定の値と一致するかどうかをチェックします。
  • RewriteRuleは、リクエストのURLを変更せずに処理を続行します。-はURLを書き換えないことを意味します。
  • env=ORIGIN_OKという環境変数を設定し、Headerディレクティブがこの変数の存在に応じてヘッダーを付与します。

メリットと応用

  • 柔軟性:複数のオリジンをリスト化し、動的に許可/拒否できます。
  • 拡張性:特定のパスやリソースに対してのみCORSを適用することも可能です。
  • セキュリティ向上:不要なオリジンからのリクエストをフィルタリングし、不正アクセスを防止します。

次章では、mod_rewriteルールの記述方法について、さらに詳しく掘り下げていきます。

基本的なmod_rewriteルールの記述方法


mod_rewriteを使用してCORSを設定するためには、適切なルールを記述することが重要です。ここでは、基本的なmod_rewriteの記述方法と構文を解説し、CORS対応に必要なルール作成の基礎を押さえます。

mod_rewriteルールの基本構成


mod_rewriteのルールは、主に以下の3つの要素で構成されます。

  1. RewriteEngine – mod_rewriteを有効にする
  2. RewriteCond – 条件の指定
  3. RewriteRule – 条件に一致した場合の処理

基本構文の例

RewriteEngine On  
RewriteCond 条件 [フラグ]  
RewriteRule パターン 書き換え先 [オプションフラグ]  
  • RewriteEngine On:mod_rewriteを有効化します。
  • RewriteCond:リクエストヘッダーやURLなどの特定条件を指定します。
  • RewriteRule:条件に一致した場合にどのようにURLを変更または処理するかを指定します。

CORS対応の具体例


以下の例では、https://example.comからのリクエストのみを許可するCORS設定を行います。

RewriteEngine On  
RewriteCond %{HTTP:Origin} ^https://example\.com$ [NC]  
RewriteRule .* - [E=ORIGIN_OK:1]  

Header set Access-Control-Allow-Origin "https://example.com" env=ORIGIN_OK  
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS" env=ORIGIN_OK  
Header set Access-Control-Allow-Headers "Authorization, Content-Type" env=ORIGIN_OK  

ルールの解説

  • RewriteCond %{HTTP:Origin} ^https://example.com$ [NC]
  • リクエストヘッダーOriginhttps://example.comと一致する場合に処理を実行します。
  • [NC]は「大文字小文字を区別しない」(No Case) という意味です。
  • RewriteRule .* – [E=ORIGIN_OK:1]
  • すべてのリクエストに対して適用されます。-はURLを書き換えないことを意味します。
  • E=ORIGIN_OK:1は、環境変数ORIGIN_OKに値1を設定します。
  • Header set Access-Control-Allow-Origin
  • 環境変数ORIGIN_OKが存在する場合に、CORSヘッダーを付与します。

複数のオリジンを許可する場合


複数のオリジンを許可したい場合は、RewriteCondを追加して対応します。

RewriteEngine On  
RewriteCond %{HTTP:Origin} ^https://(example\.com|trusted\.com)$ [NC]  
RewriteRule .* - [E=ORIGIN_OK:1]  

Header set Access-Control-Allow-Origin "%{HTTP:Origin}" env=ORIGIN_OK  
  • この例では、example.comまたはtrusted.comからのリクエストを許可します。
  • %{HTTP:Origin}を使用して、リクエストのOriginをそのままAccess-Control-Allow-Originに反映させます。

ポイント

  • パフォーマンスを考慮し、必要最低限の条件を記述することが重要です。
  • 正規表現を活用して、複数のオリジンやパターンを効率的にマッチさせます。
  • 環境変数を活用することで、複雑な条件分岐もシンプルに記述可能です。

次章では、特定のオリジンだけを許可する具体的な設定方法について詳しく解説します。

特定のオリジンだけを許可する方法


特定のオリジンのみを許可するCORS設定は、セキュリティを高める重要な手法です。mod_rewriteを使うことで、リクエストのOriginヘッダーを検査し、許可されたオリジンに対してのみCORSヘッダーを付与することができます。

単一のオリジンを許可する基本設定


以下の例では、https://trusted.comからのリクエストのみを許可する設定を行います。

RewriteEngine On  
RewriteCond %{HTTP:Origin} ^https://trusted\.com$ [NC]  
RewriteRule .* - [E=ORIGIN_OK:1]  

Header set Access-Control-Allow-Origin "https://trusted.com" env=ORIGIN_OK  
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS" env=ORIGIN_OK  
Header set Access-Control-Allow-Headers "Authorization, Content-Type" env=ORIGIN_OK  

設定のポイント

  • RewriteCondOriginヘッダーを検査し、trusted.comと一致した場合に環境変数ORIGIN_OKをセットします。
  • Header setを使い、環境変数が存在する場合のみAccess-Control-Allow-Originヘッダーが追加されます。
  • NCフラグを使うことで、大文字小文字を区別せずマッチします。

複数のオリジンを個別に許可する方法


複数のオリジンを個別に許可したい場合は、RewriteCondを複数記述します。

RewriteEngine On  
RewriteCond %{HTTP:Origin} ^https://trusted\.com$ [NC,OR]  
RewriteCond %{HTTP:Origin} ^https://partner\.com$ [NC]  
RewriteRule .* - [E=ORIGIN_OK:1]  

Header set Access-Control-Allow-Origin "%{HTTP:Origin}" env=ORIGIN_OK  
  • ORフラグを使用して、複数のRewriteCondが「または」で接続されます。
  • trusted.compartner.comのいずれかのオリジンが一致した場合にCORSヘッダーが付与されます。
  • %{HTTP:Origin}を使い、リクエスト元のOriginをそのまま反映します。

許可されていないオリジンを拒否する設定


許可されていないオリジンからのリクエストは、デフォルトでCORSヘッダーが付与されません。これにより、セキュリティが確保されます。ただし、カスタムのエラーメッセージを返すことも可能です。

RewriteEngine On  
RewriteCond %{HTTP:Origin} !^https://(trusted\.com|partner\.com)$ [NC]  
RewriteRule .* - [F]  
  • Fフラグは「403 Forbidden」を返します。
  • 許可されていないオリジンの場合、アクセスが拒否されます。

パフォーマンスを考慮したルールの最適化

  • 許可するオリジンが多い場合は、正規表現を活用して一行で記述します。
  • RewriteCondのチェック回数を減らし、サーバー負荷を軽減します。

次章では、複数のオリジンを動的に許可する方法について解説します。

複数のオリジンを動的に許可する設定


複数のオリジンを許可する場合、手動で1つずつ記述するのは手間がかかります。mod_rewriteを使えば、正規表現や動的な環境変数を活用して、複数のオリジンを柔軟に管理できます。これにより、特定の条件を満たしたオリジンに対して自動的にAccess-Control-Allow-Originヘッダーが設定されます。

複数のオリジンを正規表現で許可する方法


次の例では、trusted.compartner.comなど複数のオリジンを正規表現で許可します。

RewriteEngine On  
RewriteCond %{HTTP:Origin} ^https://(trusted\.com|partner\.com|example\.org)$ [NC]  
RewriteRule .* - [E=ORIGIN_OK:1]  

Header set Access-Control-Allow-Origin "%{HTTP:Origin}" env=ORIGIN_OK  
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS" env=ORIGIN_OK  
Header set Access-Control-Allow-Headers "Authorization, Content-Type" env=ORIGIN_OK  

設定のポイント

  • trusted.compartner.comexample.orgの3つのオリジンを許可しています。
  • 正規表現の(trusted\.com|partner\.com|example\.org)部分で、複数のドメインを簡潔に記述できます。
  • 許可されたオリジンは、そのままAccess-Control-Allow-Originとしてセットされます。

ホワイトリストのリスト管理


ホワイトリストとしてオリジンをリスト化し、動的に参照する方法もあります。

RewriteEngine On  
RewriteMap origins "txt:/etc/apache2/origin_whitelist.txt"  
RewriteCond ${origins:%{HTTP:Origin}|NOT_FOUND} !=NOT_FOUND  
RewriteRule .* - [E=ORIGIN_OK:1]  

Header set Access-Control-Allow-Origin "%{HTTP:Origin}" env=ORIGIN_OK  
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS" env=ORIGIN_OK  
Header set Access-Control-Allow-Headers "Authorization, Content-Type" env=ORIGIN_OK  

origin_whitelist.txt (例)

https://trusted.com -  
https://partner.com -  
https://example.org -  
  • RewriteMapを使い、外部ファイル(/etc/apache2/origin_whitelist.txt)にオリジンを登録します。
  • リスト内に存在するオリジンだけが許可されます。
  • NOT_FOUNDをデフォルトとし、存在しないオリジンは自動的に拒否されます。

リクエストオリジンを動的に許可する設定


特定のパターンでマッチするオリジンを動的に許可する方法です。

RewriteEngine On  
RewriteCond %{HTTP:Origin} ^https://([a-z0-9-]+\.)?example\.com$ [NC]  
RewriteRule .* - [E=ORIGIN_OK:1]  

Header set Access-Control-Allow-Origin "%{HTTP:Origin}" env=ORIGIN_OK  
  • サブドメインを含むexample.comのオリジンを動的に許可します。
  • ([a-z0-9-]+\.)?の部分でサブドメインを許可しています。
  • example.comドメイン配下のすべてのサブドメインがCORS許可対象になります。

利点と注意点

  • メンテナンスの簡素化:ホワイトリストをファイルで管理することで、リストの追加や削除が容易です。
  • セキュリティ強化:許可されていないオリジンからのアクセスは自動的にブロックされます。
  • 柔軟性:新しいオリジンが追加された場合も.htaccessを編集する必要がありません。

次章では、セキュリティを考慮したCORS設定のポイントについて解説します。

セキュリティを考慮したCORS設定のポイント


CORS設定は便利ですが、誤った設定はセキュリティリスクを招く可能性があります。特に、すべてのオリジンを許可するワイルドカード*の使用や、不必要に多くのオリジンを許可することは避けるべきです。ここでは、安全にCORSを設定するためのポイントを解説します。

1. ワイルドカード`*`の使用を避ける


Access-Control-Allow-Origin*を指定すると、すべてのオリジンからのリクエストが許可されます。これは便利ですが、機密データや認証が必要なAPIでは重大なセキュリティリスクとなります。

# 安全でない例
Header set Access-Control-Allow-Origin "*"  


安全な代替方法: 特定のオリジンのみを許可するルールを作成します。

RewriteEngine On  
RewriteCond %{HTTP:Origin} ^https://trusted\.com$ [NC]  
RewriteRule .* - [E=ORIGIN_OK:1]  

Header set Access-Control-Allow-Origin "https://trusted.com" env=ORIGIN_OK  

2. 認証付きリクエストではオリジンを固定する


*は認証付きのリクエストでは使用できません。認証が必要なAPIでは、許可するオリジンを明示的に指定する必要があります。

Header set Access-Control-Allow-Origin "https://trusted.com"  

3. プリフライトリクエストへの対応


OPTIONSメソッドによるプリフライトリクエストを適切に処理することで、安全性を確保します。

RewriteEngine On  
RewriteCond %{REQUEST_METHOD} OPTIONS  
RewriteCond %{HTTP:Origin} ^https://trusted\.com$ [NC]  
RewriteRule .* - [E=ORIGIN_OK:1]  

Header set Access-Control-Allow-Origin "https://trusted.com" env=ORIGIN_OK  
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS" env=ORIGIN_OK  
Header set Access-Control-Allow-Headers "Authorization, Content-Type" env=ORIGIN_OK  
Header set Access-Control-Max-Age "3600" env=ORIGIN_OK  
  • Access-Control-Max-Ageはプリフライトリクエストの結果をキャッシュする時間です。リクエスト回数を減らし、サーバー負荷を軽減できます。

4. レスポンスヘッダーの露出を制限


Access-Control-Expose-Headersを使い、クライアントがアクセスできるレスポンスヘッダーを制限します。

Header set Access-Control-Expose-Headers "X-Custom-Header"  

5. 信頼されたオリジンのみ許可


正規表現を使い、特定のオリジン群だけを許可することで、不要なアクセスを防ぎます。

RewriteEngine On  
RewriteCond %{HTTP:Origin} ^https://(trusted\.com|partner\.com)$ [NC]  
RewriteRule .* - [E=ORIGIN_OK:1]  

Header set Access-Control-Allow-Origin "%{HTTP:Origin}" env=ORIGIN_OK  

6. オリジン検証のログ出力


許可されていないオリジンからのリクエストをログに記録し、不正アクセスの監視を行います。

RewriteCond %{HTTP:Origin} !^https://(trusted\.com|partner\.com)$ [NC]  
RewriteRule .* - [E=UNAUTHORIZED:1]  

CustomLog ${APACHE_LOG_DIR}/cors_denied.log common env=UNAUTHORIZED  
  • 許可されていないオリジンは専用のログファイルcors_denied.logに記録されます。

7. デバッグ用の緩和設定を本番環境で使わない


開発中はすべてのオリジンを許可することがありますが、本番環境に移行する際には必ず特定のオリジンだけを許可するように変更します。

セキュリティチェックリスト

  • [ ] *を使用せず、特定のオリジンだけを許可しているか
  • [ ] 認証付きリクエストでAccess-Control-Allow-Credentialsを適切に設定しているか
  • [ ] プリフライトリクエストを正しく処理しているか
  • [ ] 不要なヘッダーが公開されていないか
  • [ ] オリジンのログ監視を行っているか

次章では、実際の.htaccessファイルのサンプルコードを用いて、CORS設定をさらに具体的に解説します。

実際の設定例と.htaccessのサンプルコード


ここでは、実際の.htaccessファイルを例に、Apacheでmod_rewriteを使用したCORS設定方法を紹介します。これにより、複数のオリジンを柔軟に管理し、安全で効果的なCORSポリシーを実装できます。

1. 単一オリジンを許可する.htaccessの例


以下の例は、https://trusted.comからのリクエストのみを許可する基本的な設定です。

<IfModule mod_rewrite.c>  
RewriteEngine On  
RewriteCond %{HTTP:Origin} ^https://trusted\.com$ [NC]  
RewriteRule .* - [E=ORIGIN_OK:1]  
</IfModule>  

<IfModule mod_headers.c>  
Header set Access-Control-Allow-Origin "https://trusted.com" env=ORIGIN_OK  
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS" env=ORIGIN_OK  
Header set Access-Control-Allow-Headers "Authorization, Content-Type" env=ORIGIN_OK  
Header set Access-Control-Max-Age "3600" env=ORIGIN_OK  
</IfModule>  
  • RewriteCondで特定のオリジンのみをマッチさせ、環境変数ORIGIN_OKをセットします。
  • Header setを使い、条件に一致した場合のみCORSヘッダーが付与されます。

2. 複数のオリジンを許可する.htaccessの例


複数のオリジンを正規表現で許可する方法です。

<IfModule mod_rewrite.c>  
RewriteEngine On  
RewriteCond %{HTTP:Origin} ^https://(trusted\.com|partner\.com|example\.org)$ [NC]  
RewriteRule .* - [E=ORIGIN_OK:1]  
</IfModule>  

<IfModule mod_headers.c>  
Header set Access-Control-Allow-Origin "%{HTTP:Origin}" env=ORIGIN_OK  
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS" env=ORIGIN_OK  
Header set Access-Control-Allow-Headers "Authorization, Content-Type" env=ORIGIN_OK  
</IfModule>  
  • 許可されたオリジンがそのままAccess-Control-Allow-Originに反映されます。
  • 追加のオリジンがあれば、正規表現を修正して対応可能です。

3. プリフライトリクエストを許可する.htaccess


プリフライトリクエスト(OPTIONSメソッド)に対応する設定です。

<IfModule mod_rewrite.c>  
RewriteEngine On  
RewriteCond %{REQUEST_METHOD} OPTIONS  
RewriteCond %{HTTP:Origin} ^https://trusted\.com$ [NC]  
RewriteRule .* - [E=ORIGIN_OK:1]  
</IfModule>  

<IfModule mod_headers.c>  
Header set Access-Control-Allow-Origin "https://trusted.com" env=ORIGIN_OK  
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS" env=ORIGIN_OK  
Header set Access-Control-Allow-Headers "Authorization, Content-Type" env=ORIGIN_OK  
Header set Access-Control-Max-Age "3600" env=ORIGIN_OK  
</IfModule>  
  • OPTIONSメソッドに対してCORSヘッダーを付与し、プリフライトリクエストを許可します。
  • クライアント側でのエラーを防ぐために必要な設定です。

4. ホワイトリスト方式でオリジンを管理する.htaccess


外部ファイルでオリジンのホワイトリストを管理し、柔軟に許可オリジンを追加できる方法です。

<IfModule mod_rewrite.c>  
RewriteEngine On  
RewriteMap origins "txt:/etc/apache2/origin_whitelist.txt"  
RewriteCond ${origins:%{HTTP:Origin}|NOT_FOUND} !=NOT_FOUND  
RewriteRule .* - [E=ORIGIN_OK:1]  
</IfModule>  

<IfModule mod_headers.c>  
Header set Access-Control-Allow-Origin "%{HTTP:Origin}" env=ORIGIN_OK  
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS" env=ORIGIN_OK  
Header set Access-Control-Allow-Headers "Authorization, Content-Type" env=ORIGIN_OK  
</IfModule>  


origin_whitelist.txt(例)

https://trusted.com -  
https://partner.com -  
https://example.org -  
  • RewriteMapを使い、外部のテキストファイルからオリジンを読み込んでCORSを許可します。
  • 許可リストを管理しやすく、大規模なプロジェクトで便利です。

5. 許可されていないオリジンを拒否する.htaccess


許可されていないオリジンに対して403エラーを返します。

<IfModule mod_rewrite.c>  
RewriteEngine On  
RewriteCond %{HTTP:Origin} !^https://(trusted\.com|partner\.com)$ [NC]  
RewriteRule .* - [F]  
</IfModule>  
  • 許可されていないオリジンは403 Forbiddenエラーを返し、アクセスが拒否されます。

注意点

  • mod_headersが有効であることを確認してください。a2enmod headersで有効化できます。
  • CORS設定ミスによるブロックはブラウザのデバッグツールで確認可能です。
  • オリジンリストを頻繁に変更する場合は、外部ファイルでの管理が効率的です。

次章では、記事の内容をまとめてCORS設定の全体像を振り返ります。

まとめ


本記事では、Apacheでmod_rewriteを使用してCORS設定を柔軟に管理する方法について解説しました。CORSはWebアプリケーションにおいて重要なセキュリティ機構であり、mod_rewriteを活用することで、特定のオリジンのみを許可する高度な制御が可能になります。

主要なポイントは以下の通りです。

  • CORSの基本概念と、その必要性について理解を深めました。
  • Apacheとmod_rewriteの仕組みを学び、リクエストの書き換えによるCORS制御の流れを確認しました。
  • 特定のオリジンを許可する設定方法、複数オリジンを動的に許可する方法を具体例とともに紹介しました。
  • セキュリティを強化するためにワイルドカード*の使用を避ける方法や、プリフライトリクエストへの対応を解説しました。
  • 実際の.htaccessファイルのサンプルコードを提示し、すぐに導入できる形で説明しました。

適切にCORSを管理することで、不正なクロスオリジンリクエストを防ぎつつ、必要なAPIリクエストを安全に許可することができます。CORS設定は慎重に行い、運用後も監視とメンテナンスを行うことが重要です。

コメント

コメントする

目次
  1. CORSの基本と必要性
    1. CORSが必要な場面
    2. CORSを設定しない場合の問題
  2. Apacheとmod_rewriteの概要
    1. mod_rewriteの役割
    2. mod_rewriteの基本的な動作
    3. mod_rewriteの利点
  3. mod_rewriteを使ったCORS設定の仕組み
    1. 基本的なCORS設定の流れ
    2. mod_rewriteによるCORSヘッダーの付与例
    3. 動作の仕組み
    4. メリットと応用
  4. 基本的なmod_rewriteルールの記述方法
    1. mod_rewriteルールの基本構成
    2. 基本構文の例
    3. CORS対応の具体例
    4. ルールの解説
    5. 複数のオリジンを許可する場合
    6. ポイント
  5. 特定のオリジンだけを許可する方法
    1. 単一のオリジンを許可する基本設定
    2. 複数のオリジンを個別に許可する方法
    3. 許可されていないオリジンを拒否する設定
    4. パフォーマンスを考慮したルールの最適化
  6. 複数のオリジンを動的に許可する設定
    1. 複数のオリジンを正規表現で許可する方法
    2. ホワイトリストのリスト管理
    3. リクエストオリジンを動的に許可する設定
    4. 利点と注意点
  7. セキュリティを考慮したCORS設定のポイント
    1. 1. ワイルドカード`*`の使用を避ける
    2. 2. 認証付きリクエストではオリジンを固定する
    3. 3. プリフライトリクエストへの対応
    4. 4. レスポンスヘッダーの露出を制限
    5. 5. 信頼されたオリジンのみ許可
    6. 6. オリジン検証のログ出力
    7. 7. デバッグ用の緩和設定を本番環境で使わない
    8. セキュリティチェックリスト
  8. 実際の設定例と.htaccessのサンプルコード
    1. 1. 単一オリジンを許可する.htaccessの例
    2. 2. 複数のオリジンを許可する.htaccessの例
    3. 3. プリフライトリクエストを許可する.htaccess
    4. 4. ホワイトリスト方式でオリジンを管理する.htaccess
    5. 5. 許可されていないオリジンを拒否する.htaccess
    6. 注意点
  9. まとめ