【Laravel】CORSとは? CORSの許可設定・対策をする方法(middleware)

Laravel-CORS

こんにちはフロントエンドエンジニアのまさにょんです!

今回は、LaravelでCORSの許可設定・対策をする方法について解説していきます。

CORSとは?

CORSとは Cross-Origin Resource Sharing の略で、

オリジンが違うプログラム同士のデータ通信のことをCORSと呼びます。

オリジンが違うプログラム同士が Cross-Origin であり、

データ通信(データ共有)が Resource Sharing です。

またCORSの設定に関しては、クライアント側ではなく受信するサーバー側で対応する必要があるので注意です。

CORSの説明は、次の解説がわかりやすいので引用します。

CORSとは?

CORSとは Cross-Origin Resource Sharing の略で、

日本語だとオリジン間リソース共有 (CORS)と言われる。


同一オリジンポリシーを超えて通信を行うことをクロスオリジン間通信といい、その中でリソースの共有、

つまりデータを共有することをCORSという。

オリジンとは何か?

ではオリジンとは何かというと、スキーム + ホスト + ポート番号で構成される組み合わせのことである。
この組み合わせが一致すると同一オリジンと見なされて、

一つでも一致しないとクロスオリジンとみなされる。


ドメインと似ているが、プロトコルとポート番号を含んでいる点がドメインとは異なる。

アクセス元のオリジンが同一オリジンの場合、レスポンスヘッダの有無や内容にかかわらず通信は成功する。


しかし、クロスオリジン間通信では同一オリジンポリシーという制約が発生する。

この設定を調整して、異なるオリジンへアクセスできるように CORSを設定することをCORS対策という。

レスポンスを受けるサーバー側ではリクエストを受ける下記レスポンスヘッダによってクロスオリジン通信の可否が左右される。

引用元: LaravelでのCORS対策とmiddlewareへの理解

上記のように、リクエスト対して、Server側でどう対応するか(レスポンス)がCORSの許可設定・対応につながってきます。

それでは、ここからは、Laravelでの実際のCORSの許可設定・対応方法について見ていきます。

Ver.7.0 以前は、middleware の Cors.php にてCORS設定をする

まずは、次の php artisan コマンドを実行します。

php artisan make:middleware Cors

上記のコマンドを実行すると、Cors.phpファイルが作成されるので、そのファイルを編集します。

File-Path(相対Path)は [ /app/Http/Middleware/Cors.php ]になります。

次のようにCORSの設定しています。

<?php

namespace App\Http\Middleware;

use Closure;

class Cors
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // ここから追加
        return $next($request)
            ->header('Access-Control-Allow-Origin', '*')
            ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
            ->header('Access-Control-Allow-Headers', 'Content-Type');
        // ここまで!
    }
}

続いて、Kernel.php ファイルに新しく作成したcors設定のミドルウェアを追加します。

File-Path(相対Path)は [ /app/Http/Kernel.php ]になります。

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $middleware = [
        \App\Http\Middleware\TrustProxies::class,
        \App\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];

    /**
     * The application's route middleware groups.
     *
     * @var array
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            // \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            'throttle:60,1',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];

    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,

        // 【 CORS-対応 】
        // 1. cors設定のため追加
        'cors' => \App\Http\Middleware\Cors::class,
    ];

    /**
     * The priority-sorted list of middleware.
     *
     * This forces non-global middleware to always be in the given order.
     *
     * @var array
     */
    protected $middlewarePriority = [
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\Authenticate::class,
        \Illuminate\Routing\Middleware\ThrottleRequests::class,
        \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
        \Illuminate\Auth\Middleware\Authorize::class,
    ];
}

Ver.7.0 以降は[ /config/cors.php ]にてCORS設定をする

Laravel7.0以降から、cors.phpファイル を用いたCORS対策が可能になりました。

File-Path(相対Path)は [ /config/cors.php ]になります。

一般的にLaravelの7.0以降のバージョンを使っている場合は cors.phpで書くのがスタンダードになっているようです。

以下は、『LaravelでのCORS対策とmiddlewareへの理解』 から引用します。

<?php
return [
  // CORSヘッダーを出力するパスのパターン、任意でワイルドカード(*)が利用できる。
  //全てのルートを対象にする場合: ['*']
  //APIと特定の画像を対象にする例: ['api/*', 'resources/example.png']
 'paths' => ['*'],

  // マッチするHTTPメソッド。 `[*]` だと全てのリクエストにマッチする。
  //GETとPOSTだけを許可する場合: ['GET', 'POST']
 'allowed_methods' => ['*'],

  // 許可するリクエストオリジンの設定
  //`*`かオリジンに完全一致、またはワイルドカードが利用可。
 'allowed_origins' => ['*'],

  //正規表現によるオリジン指定。preg_matchの引数としてそのまま渡される。
 'allowed_origins_patterns' => [],

 // Access-Control-Allow-Headers response header レスポンスヘッダーの指定
 'allowed_headers' => ['*'],

 //Access-Control-Expose-Headers レスポンスヘッダーの指定
 'exposed_headers' => false,

 //Access-Control-Max-Age レスポンスヘッダーの指定
 'max_age' => false,

 // Access-Control-Allow-Credentialsヘッダーを設定する。
 //falsy値を指定すると出力せず、truthyな値を渡せばtrueが出力される
 'supports_credentials' => false,
];

Twitterやってます!Follow Me!

神聖グンマー帝国の逆襲🔥

神聖グンマー帝国の科学は、世界一ぃぃぃぃぃぃ!!!!!

プログラミング学習・エンジニア転職関連の情報

自宅で現役エンジニアから学べる『TechAcademy』 (エンジニア転職保証)

『GEEK JOBキャンプ』スピード転職コース(無料)

【IT道場】入校時0円! 就職目的プログラミングスクール

エンジニア転職なら100%「自社開発」求人に強い【クラウドリンク】

『techgym』 (Python特化・無料)

PHP / Laravel書籍

参考・引用

  1. LaravelでのCORS対策とmiddlewareへの理解

最近の投稿