Laravel용 https://github.com/fruitcake/php-cors 구현
Laravel 9.2부터 이 미들웨어는 laravel/프레임워크에 포함됩니다. 이 패키지에서 제공하는 미들웨어 및 구성과 호환되어야 하는 제공된 미들웨어를 사용할 수 있습니다. 변경 사항은 https://github.com/laravel/laravel/pull/5825/files를 참조하세요.
업그레이드 단계:
Composer.json에서 "fruitcake/laravel-cors"
제거하세요.
app/Http/Kernel.php
에서 FruitcakeCorsHandleCors::class,
IlluminateHttpMiddlewareHandleCors::class,
로 교체하세요.
고급 사용법은 https://github.com/fruitcake/php-cors
참조하세요. 구성은 동일하게 유지됩니다.
laravel-cors
패키지를 사용하면 Laravel 미들웨어 구성과 함께 Cross-Origin Resource Sharing 헤더를 보낼 수 있습니다.
CORS 워크플로의 전체 개요를 보려면 이 이미지를 찾아보세요.
0.x 버전에서 업그레이드할 때 몇 가지 주요 변경 사항이 있습니다.
특정 경로에서 CORS를 활성화/비활성화하는 데 새로운 '경로' 속성이 사용됩니다. 기본적으로 비어 있으므로 올바르게 입력하세요!
그룹 미들웨어는 더 이상 지원되지 않습니다. 글로벌 미들웨어를 사용하세요.
업체명이 변경되었습니다.(설치/사용방법 참조)
cors.php
에 있는 소품의 케이스가 camelCase에서 snake_case로 변경되었으므로 이미 cors.php
파일이 있는 경우 새 케이스와 일치하도록 거기에 있는 소품을 업데이트해야 합니다.
CORS 비행 전 OPTIONS 요청을 처리합니다.
응답에 CORS 헤더를 추가합니다.
특정 요청에만 CORS를 추가하도록 경로를 일치시킵니다.
composer.json
에 fruitcake/laravel-cors
패키지가 필요하고 종속성을 업데이트하세요.
작곡가는 Fruitcake/laravel-cors가 필요합니다.
충돌이 발생하는 경우 이전 버전의 barryvdh/laravel-cors 또는 Fruitcake/laravel-cors가 설치되었기 때문일 수 있습니다. 먼저 충돌하는 패키지를 제거한 후 다시 설치해 보세요.
작곡가는 barryvdh/laravel-cors Fruitcake/laravel-cors를 제거합니다. 작곡가는 Fruitcake/laravel-cors가 필요합니다.
모든 경로에 CORS를 허용하려면 app/Http/Kernel.php
클래스의 $middleware
속성 상단에 HandleCors
미들웨어를 추가하세요.
protected $middleware = [ FruitcakeCorsHandleCors::class,// ...];
이제 CORS 서비스를 실행하려는 경로를 정의하도록 구성을 업데이트합니다(아래 구성 참조).
'경로' => ['api/*'],
기본값은 config/cors.php
에 설정되어 있습니다. 구성을 게시하여 파일을 자체 구성에 복사합니다.
php artisan Vendor:publish --tag="cors"
참고:
X-Auth-Token
또는X-Requested-With
와 같은 사용자 정의 헤더를 사용하는 경우 해당 헤더를 포함하도록allowed_headers
를 설정해야 합니다. 모든 사용자 정의 헤더를 허용하려면['*']
로 설정할 수도 있습니다.
참고: 헤더를 명시적으로 화이트리스트에 추가하는 경우
Origin
포함해야 합니다. 그렇지 않으면 요청이 CORS로 인식되지 않습니다.
옵션 | 설명 | 기본값 |
---|---|---|
경로 | 예를 들어 하나 이상의 경로에 대해 CORS를 활성화할 수 있습니다. ['api/*'] | [] |
allowed_methods | 요청 방법과 일치합니다. | ['*'] |
allowed_origins | 요청 출처와 일치합니다. 와일드카드를 사용할 수 있습니다. *.mydomain.com 또는 mydomain.com:* | ['*'] |
allowed_origins_patterns | 요청 출처를 preg_match 와 일치시킵니다. | [] |
allowed_headers | Access-Control-Allow-Headers 응답 헤더를 설정합니다. | ['*'] |
노출 헤더 | Access-Control-Expose-Headers 응답 헤더를 설정합니다. | [] |
최대 연령 | Access-Control-Max-Age 응답 헤더를 설정합니다. | 0 |
지원_자격 증명 | Access-Control-Allow-Credentials 헤더를 설정합니다. | false |
allowed_origins
, allowed_headers
및 allowed_methods
['*']
로 설정하여 모든 값을 허용할 수 있습니다.
참고:
allowed_origins
의 경우 와일드카드를 사용하지 않을 때 구성표를 포함해야 합니다.['http://example.com', 'https://example.com']
.allowed_origins_patterns
를 사용할 때 구성표가 존재한다는 점도 고려해야 합니다.
참고: 최대한 구체적으로 작성해 보세요. 느슨한 제약조건으로 개발을 시작할 수 있지만 최대한 엄격한 것이 더 좋습니다!
참고: Laravel의 http 메소드 재정의로 인해 POST 메소드를 허용하면 API 사용자가 PUT 및 DELETE 요청도 수행할 수 있습니다.
참고: 포트를 지정해야 하는 경우도 있습니다 (예를 들어 로컬 환경에서 앱을 코딩하는 경우) . 여기서도 포트를 지정하거나 와일드카드를 사용할 수 있습니다.
localhost:3000
,localhost:*
또는 FQDNapp.mydomain.com:8080
사용
Lumen에서는 bootstrap/app.php
파일에 ServiceProvider를 수동으로 등록하세요.
$app->register(FruitcakeCorsCorsServiceProvider::class);
또한 cors.php 구성 파일을 config/cors.php
에 복사하고 실행해 보세요.
$app->configure('cors');
모든 경로에 대해 CORS를 허용하려면 전역 미들웨어에 HandleCors
미들웨어를 추가하고 구성에서 paths
속성을 설정하세요.
$app->미들웨어([// ...FruitcakeCorsHandleCors::class, ]);
구성의 path
옵션이 정확하고 실제로 사용 중인 경로와 일치하는지 확인하세요. 구성 캐시도 지워야 합니다.
때로는 자체 응답을 반환하는 오류/미들웨어로 인해 CORS 미들웨어가 실행되지 않을 수 있습니다. 미들웨어의 순서를 변경해 보고 그것이 경로 그룹이 아닌 전역 미들웨어의 첫 번째 항목인지 확인하세요. 또한 실제 오류에 대한 로그를 확인하세요. CORS가 없으면 브라우저에서 오류를 무시하고 CORS 오류만 표시하기 때문입니다. 또한 실제로 작동하는지 확인하려면 CORS 없이 실행해 보세요.
요청에 Authorization 헤더가 포함되어 있거나 Credentials 모드를 사용하는 경우 구성에서 supports_credentials
값을 true로 설정하세요. 그러면 Access-Control-Allow-Credentials 헤더가 true
로 설정됩니다.
코드에서 echo()
, dd()
, die()
, exit()
, dump()
등을 사용하면 미들웨어 흐름이 중단됩니다. 출력이 헤더보다 먼저 전송되면 CORS를 추가할 수 없습니다. CORS 미들웨어가 완료되기 전에 스크립트가 종료되면 CORS 헤더가 추가되지 않습니다. 항상 적절한 응답을 반환하거나 예외를 발생시킵니다.
가능하다면 CSRF 보호가 비활성화된 경로 그룹을 사용하십시오. 그렇지 않으면 AppHttpMiddlewareVerifyCsrfToken
에서 특정 요청에 대해 CSRF를 비활성화할 수 있습니다.
protected $just = ['api/*','sub.domain.zone' => [ '접두사/*'], ];
CORS 미들웨어는 이러한 헤더를 추가하는 유일한 장소여야 합니다. .htaccess, nginx 또는 index.php 파일에 헤더도 추가하면 헤더가 중복되어 예상치 못한 결과가 발생합니다.
교차 사이트 요청을 수행하지 않는 경우, 즉 site-b.com에서 site-a.com/api를 요청하지 않는 경우 브라우저는 Origin: https://site-b.com
요청 헤더를 보내지 않습니다. Access-Control-Allow-Origin
헤더도 누락되므로 CORS는 "비활성화"됩니다. 이는 요청이 동일한 곳에서 발송되고 이 경우 보호가 필요하지 않기 때문에 발생합니다.
MIT 라이선스에 따라 출시되었습니다. 라이선스를 참조하세요.