교차 출처 리소스 공유 (CORS)

Added in version 4.5.0.

교차 출처 리소스 공유(CORS)는 HTTP 헤더 기반의 보안 메커니즘으로, 서버가 자신의 출처 이외에 브라우저가 리소스 로딩을 허용해야 할 다른 오리진(도메인, 스킴 또는 포트)을 명시할 수 있도록 합니다.

CORS는 HTTP 요청 및 응답에 헤더를 추가하여 요청된 리소스가 서로 다른 오리진 간에 공유될 수 있는지 여부를 나타내며, 교차 사이트 요청 위조(CSRF) 및 데이터 도용과 같은 악의적인 공격을 방지하는 데 도움을 줍니다.

CORS 및 CORS 헤더에 익숙하지 않다면 MDN CORS 문서를 참고하세요.

CodeIgniter는 CORS 필터와 헬퍼 클래스를 제공합니다.

CORS 설정하기

기본 설정 지정하기

CORS는 app/Config/Cors.php에서 설정할 수 있습니다.

최소한 $default 속성의 다음 항목들을 설정해야 합니다:

  • allowedOrigins: 허용할 오리진을 명시적으로 나열합니다.

  • allowedHeaders: 허용할 HTTP 헤더를 명시적으로 나열합니다.

  • allowedMethods: 허용할 HTTP 메서드를 명시적으로 나열합니다.

경고

최소 권한 원칙에 따라 최소한으로 필요한 오리진, 메서드, 헤더만 허용해야 합니다.

교차 출처 요청과 함께 자격 증명(예: 쿠키)을 전송하는 경우 supportsCredentialstrue로 설정하세요.

CORS 활성화하기

CORS를 활성화하려면 두 가지 작업이 필요합니다:

  1. CORS를 허용할 라우트에 cors 필터를 지정합니다.

  2. CORS 프리플라이트 요청을 위한 OPTIONS 라우트를 추가합니다.

라우트에 설정하기

app/Config/Routes.php에서 라우트에 cors 필터를 설정할 수 있습니다.

예시:

<?php

use CodeIgniter\Router\RouteCollection;

$routes->group('', ['filter' => 'cors'], static function (RouteCollection $routes): void {
    $routes->resource('product');

    $routes->options('product', static function () {
        // Implement processing for normal non-preflight OPTIONS requests,
        // if necessary.
        $response = response();
        $response->setStatusCode(204);
        $response->setHeader('Allow:', 'OPTIONS, GET, POST, PUT, PATCH, DELETE');

        return $response;
    });
    $routes->options('product/(:any)', static function () {});
});

프리플라이트 요청을 위한 OPTIONS 라우트를 추가하는 것을 잊지 마세요. 라우트가 존재하지 않으면 컨트롤러 필터(필수 필터 제외)가 동작하지 않기 때문입니다.

CORS 필터가 모든 프리플라이트 요청을 처리하므로 OPTIONS 라우트의 클로저 컨트롤러는 일반적으로 호출되지 않습니다.

Config\Filters에 설정하기

또는 app/Config/Filters.php에서 URI 경로에 cors 필터를 설정할 수 있습니다.

예시:

<?php

namespace Config;

use CodeIgniter\Config\Filters as BaseFilters;

// ...

class Filters extends BaseFilters
{
    // ...
    public array $filters = [
        // ...
        'cors' => [
            'before' => ['api/*'],
            'after'  => ['api/*'],
        ],
    ];
}

프리플라이트 요청을 위한 OPTIONS 라우트를 추가하는 것을 잊지 마세요. 라우트가 존재하지 않으면 컨트롤러 필터(필수 필터 제외)가 동작하지 않기 때문입니다.

예시:

<?php

use CodeIgniter\Router\RouteCollection;

$routes->group('', ['filter' => 'cors'], static function (RouteCollection $routes): void {
    $routes->options('api/(:any)', static function () {});
});

CORS 필터가 모든 프리플라이트 요청을 처리하므로 OPTIONS 라우트의 클로저 컨트롤러는 일반적으로 호출되지 않습니다.

라우트와 필터 확인하기

설정 후 spark routes 명령으로 라우트와 필터를 확인할 수 있습니다.

다른 설정 지정하기

기본 설정과 다른 설정을 사용하려면 app/Config/Cors.php에 속성을 추가하세요.

예를 들어 $api 속성을 추가합니다.

<?php

namespace Config;

use CodeIgniter\Config\BaseConfig;

/**
 * Cross-Origin Resource Sharing (CORS) Configuration
 *
 * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
 */
class Cors extends BaseConfig
{
    // ...

    public array $api = [
        'allowedOrigins'         => ['https://app.example.com'],
        'allowedOriginsPatterns' => [],
        'supportsCredentials'    => true,
        'allowedHeaders'         => ['Authorization', 'Content-Type'],
        'exposedHeaders'         => [],
        'allowedMethods'         => ['GET', 'POST', 'PUT', 'DELETE'],
        'maxAge'                 => 7200,
    ];
}

속성 이름(위 예시에서는 api)이 설정 이름이 됩니다.

그런 다음 cors:api와 같이 속성 이름을 필터 인수로 지정합니다:

<?php

use CodeIgniter\Router\RouteCollection;

$routes->group('api', ['filter' => 'cors:api'], static function (RouteCollection $routes): void {
    $routes->resource('user');

    $routes->options('user', static function () {});
    $routes->options('user/(:any)', static function () {});
});

필터 인수도 사용할 수 있습니다.

클래스 레퍼런스

class CodeIgniter\HTTP\Cors
CodeIgniter\HTTP\Cors::addResponseHeaders(RequestInterface $request, ResponseInterface $response) ResponseInterface
매개변수:
  • $request (RequestInterface) – 요청 인스턴스

  • $response (ResponseInterface) – 응답 인스턴스

반환:

응답 인스턴스

반환 형식:

ResponseInterface

CORS를 위한 응답 헤더를 추가합니다.

CodeIgniter\HTTP\Cors::handlePreflightRequest(RequestInterface $request, ResponseInterface $response) ResponseInterface
매개변수:
  • $request (RequestInterface) – 요청 인스턴스

  • $response (ResponseInterface) – 응답 인스턴스

반환:

응답 인스턴스

반환 형식:

ResponseInterface

프리플라이트 요청을 처리합니다.

CodeIgniter\HTTP\Cors::isPreflightRequest(IncomingRequest $request) bool
매개변수:
반환:

프리플라이트 요청이면 true입니다.

반환 형식:

bool

요청이 프리플라이트 요청인지 확인합니다.