본문으로 건너뛰기
버전: 10.x
Laravel 10.x · 한국어 문서https://laravel.com/docs/10.x/requests

HTTP Requests

Introduction​

Laravel의 Illuminate\Http\Request 클래스는 현재 애플리케이션에서 처리 중인 HTTP 요청에 객체 지향 방식으로 접근할 수 있도록 해줍니다. 또한, 요청과 함께 제출된 입력값, 쿠키, 파일에 접근할 수 있습니다.

Interacting With The Request​

Accessing the Request​

현재 HTTP 요청 인스턴스를 의존성 주입을 통해 받으려면, 라우트 클로저 또는 컨트롤러 메서드에서 Illuminate\Http\Request 클래스를 타입 힌트로 지정하면 됩니다. 들어오는 요청 인스턴스는 Laravel service container에 의해 자동으로 주입됩니다.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;

class UserController extends Controller
{
/**
* Store a new user.
*/
public function store(Request $request): RedirectResponse
{
$name = $request->input('name');

// Store the user...

return redirect('/users');
}
}

앞서 언급한 것처럼, 라우트 클로저에서도 Illuminate\Http\Request 클래스를 타입 힌트로 사용할 수 있습니다. 서비스 컨테이너가 클로저를 실행할 때 요청 인스턴스를 자동으로 주입해줍니다.

use Illuminate\Http\Request;

Route::get('/', function (Request $request) {
// ...
});

Dependency Injection and Route Parameters​

컨트롤러 메서드가 라우트 파라미터도 함께 받을 경우, 라우트 파라미터는 다른 의존성 뒤에 나열해야 합니다. 예를 들어, 라우트가 다음과 같이 정의되어 있다면,

use App\Http\Controllers\UserController;

Route::put('/user/{id}', [UserController::class, 'update']);

컨트롤러 메서드에서는 Illuminate\Http\Request를 타입 힌트로 받고, id 라우트 파라미터도 함께 받을 수 있습니다.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;

class UserController extends Controller
{
/**
* Update the specified user.
*/
public function update(Request $request, string $id): RedirectResponse
{
// Update the user...

return redirect('/users');
}
}

Request Path, Host, and Method​

Illuminate\Http\Request 인스턴스에는 들어오는 HTTP 요청을 검사할 수 있는 다양한 메서드가 있습니다. 이 클래스는 Symfony\Component\HttpFoundation\Request를 확장합니다. 여기서는 가장 중요한 몇 가지 메서드를 살펴보겠습니다.

Retrieving the Request Path​

path 메서드는 요청의 경로 정보를 반환합니다. 예를 들어, 들어오는 요청이 http://example.com/foo/bar라면, path 메서드는 foo/bar를 반환합니다.

$uri = $request->path();

Inspecting the Request Path / Route​

is 메서드를 사용하면, 들어온 요청의 경로가 특정 패턴과 일치하는지 확인할 수 있습니다. 이때 * 문자를 와일드카드로 사용할 수 있습니다.

if ($request->is('admin/*')) {
// ...
}

routeIs 메서드를 사용하면, 요청이 named route에 매칭되는지 확인할 수 있습니다.

if ($request->routeIs('admin.*')) {
// ...
}

Retrieving the Request URL​

들어온 요청의 전체 URL을 가져오려면 url 또는 fullUrl 메서드를 사용할 수 있습니다. url 메서드는 쿼리 스트링을 제외한 URL을, fullUrl 메서드는 쿼리 스트링을 포함한 URL을 반환합니다.

$url = $request->url();

$urlWithQueryString = $request->fullUrl();

현재 URL에 쿼리 문자열 데이터를 합치려면, fullUrlWithQuery 메서드를 사용할 수 있습니다. 이 메서드는 전달한 배열의 쿼리 문자열 데이터를 기존 쿼리스트링과 병합합니다.

$request->fullUrlWithQuery(['type' => 'phone']);

특정 쿼리 스트링 파라미터를 제외한 현재 URL을 얻으려면 fullUrlWithoutQuery 메서드를 사용합니다.

$request->fullUrlWithoutQuery(['type']);

Retrieving the Request Host​

들어온 요청의 "host" 정보는 host, httpHost, schemeAndHttpHost 메서드를 통해 가져올 수 있습니다.

$request->host();
$request->httpHost();
$request->schemeAndHttpHost();

Retrieving the Request Method​

method 메서드는 요청의 HTTP 메서드(verb)를 반환합니다. 또한 isMethod 메서드로 특정 HTTP 메서드와 일치하는지 확인할 수 있습니다.

$method = $request->method();

if ($request->isMethod('post')) {
// ...
}

Request Headers​

Illuminate\Http\Request 인스턴스의 header 메서드를 이용하여 요청 헤더 값을 가져올 수 있습니다. 해당하는 헤더가 없으면 null이 반환됩니다. 단, header 메서드는 선택적인 두 번째 인자를 받아, 헤더가 요청에 없을 때 해당 값을 반환합니다.

$value = $request->header('X-Header-Name');

$value = $request->header('X-Header-Name', 'default');

hasHeader 메서드를 사용하면 요청에 특정 헤더가 있는지 확인할 수 있습니다.

if ($request->hasHeader('X-Header-Name')) {
// ...
}

편의를 위해 Authorization 헤더에서 bearer 토큰을 가져오는 bearerToken 메서드도 사용할 수 있습니다. 해당 헤더가 없으면 빈 문자열이 반환됩니다.

$token = $request->bearerToken();

Request IP Address​

ip 메서드를 사용하면 요청을 보낸 클라이언트의 IP 주소를 얻을 수 있습니다.

$ipAddress = $request->ip();

프록시를 거쳐 전달된 모든 클라이언트 IP 주소의 배열이 필요하다면 ips 메서드를 사용할 수 있습니다. 배열의 맨 마지막이 "실제" 클라이언트 IP입니다.

$ipAddresses = $request->ips();

일반적으로 IP 주소는 신뢰할 수 없는, 사용자가 제어하는 입력값이므로 참고용으로만 사용해야 합니다.

Content Negotiation​

Laravel은 요청의 Accept 헤더를 통해 원하는 콘텐츠 타입을 검사할 수 있는 여러 메서드를 제공합니다. 우선, getAcceptableContentTypes 메서드는 요청에서 허용하는 모든 콘텐츠 타입의 배열을 반환합니다.

$contentTypes = $request->getAcceptableContentTypes();

accepts 메서드는 전달한 콘텐츠 타입 배열 중 하나라도 요청이 받아들인다면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

if ($request->accepts(['text/html', 'application/json'])) {
// ...
}

여러 콘텐츠 타입 중 요청이 가장 선호하는 타입을 알고 싶다면 prefers 메서드를 사용하세요. 만약 해당 배열 내에서 요청이 받아들이는 타입이 없다면 null이 반환됩니다.

$preferred = $request->prefers(['text/html', 'application/json']);

대부분의 애플리케이션이 HTML 또는 JSON만을 반환한다면, 요청이 JSON 응답을 원하는지 expectsJson 메서드로 간단히 검사할 수 있습니다.

if ($request->expectsJson()) {
// ...
}

PSR-7 Requests​

PSR-7 standard은 HTTP 메시지(요청 및 응답)를 위한 인터페이스를 정의합니다. Laravel 요청 대신 PSR-7 요청 인스턴스를 받고 싶다면, 먼저 몇 가지 라이브러리를 설치해야 합니다. Laravel은 Symfony HTTP Message Bridge 컴포넌트를 이용해 일반적인 요청 및 응답을 PSR-7 호환 구현체로 변환합니다.

composer require symfony/psr-http-message-bridge
composer require nyholm/psr7

이 라이브러리를 설치하면, 라우트 클로저나 컨트롤러 메서드에서 PSR-7 요청 인터페이스를 타입 힌트로 사용할 수 있습니다.

use Psr\Http\Message\ServerRequestInterface;

Route::get('/', function (ServerRequestInterface $request) {
// ...
});

라우트나 컨트롤러에서 PSR-7 응답 인스턴스를 반환하는 경우, 프레임워크에 의해 자동으로 다시 Laravel 응답 인스턴스로 변환되어 화면에 표시됩니다.

Input​

Retrieving Input​

Retrieving All Input Data​

들어온 요청의 모든 입력값을 array로 가져오려면 all 메서드를 사용하세요. 이 메서드는 HTML 폼 또는 XHR 요청 구분 없이 사용할 수 있습니다.

$input = $request->all();

collect 메서드를 사용하면 요청의 모든 입력값을 collection으로도 가져올 수 있습니다.

$input = $request->collect();

또한 collect 메서드는 일부 입력만 컬렉션으로 가져올 수도 있습니다.

$request->collect('users')->each(function (string $user) {
// ...
});

Retrieving an Input Value​

간단한 여러 메서드를 통해, 요청 방식(GET, POST 등)에 상관없이 Illuminate\Http\Request 인스턴스에서 사용자의 입력값에 접근할 수 있습니다. input 메서드는 HTTP 메서드에 상관없이 값을 가져옵니다.

$name = $request->input('name');

input 메서드의 두 번째 인자로 기본값을 전달할 수 있습니다. 요청에 해당 입력값이 없을 때 이 값이 반환됩니다.

$name = $request->input('name', 'Sally');

배열 입력값이 포함된 폼일 경우에는 "dot" 표기법을 사용해 각 배열 원소에 접근할 수 있습니다.

$name = $request->input('products.0.name');

$names = $request->input('products.*.name');

아무 인자 없이 input 메서드를 호출하면, 모든 입력값을 연관 배열로 반환합니다.

$input = $request->input();

Retrieving Input From the Query String​

input 메서드는 요청 전체 페이로드(쿼리 문자열 포함)에서 값을 가져오지만, query 메서드는 오직 쿼리 문자열에서만 값을 가져옵니다.

$name = $request->query('name');

해당 쿼리 스트링 값이 없을 때 두 번째 인자 값이 반환됩니다.

$name = $request->query('name', 'Helen');

query 메서드를 아무 인자 없이 호출하면, 모든 쿼리 문자열 값을 연관 배열로 반환합니다.

$query = $request->query();

Retrieving JSON Input Values​

애플리케이션으로 JSON 요청이 들어올 때, 요청의 Content-Type 헤더가 application/json으로 올바르게 설정되어 있다면 input 메서드를 통해 JSON 데이터에 접근할 수 있습니다. "dot" 표기법으로 JSON 배열/객체 내부 값도 꺼낼 수 있습니다.

$name = $request->input('user.name');

Retrieving Stringable Input Values​

입력값을 string 타입이 아닌 Illuminate\Support\Stringable 객체로 받고 싶다면, string 메서드를 이용하세요.

$name = $request->string('name')->trim();

Retrieving Boolean Input Values​

체크박스 같은 HTML 요소를 처리할 때, 애플리케이션은 실제로는 문자열인 "truthy"(참 같은) 값을 받을 수 있습니다. 예를 들어 "true" 또는 "on"이 그렇습니다. 편의를 위해 boolean 메서드를 사용하면 이러한 값을 불리언으로 가져올 수 있습니다. boolean 메서드는 1, "1", true, "true", "on", "yes"에 대해 true를 반환하며, 그 외의 모든 값에 대해서는 false를 반환합니다.

$archived = $request->boolean('archived');

Retrieving Date Input Values​

날짜/시간 값을 입력받을 때 편리하게 date 메서드로 입력값을 Carbon 인스턴스로 변환해 가져올 수 있습니다. 값이 없으면 null이 반환됩니다.

$birthday = $request->date('birthday');

date 메서드가 받는 두 번째, 세 번째 인자로 각각 날짜의 포맷과 타임존을 지정할 수도 있습니다.

$elapsed = $request->date('elapsed', '!H:i', 'Europe/Madrid');

입력값이 존재하지만 포맷이 올바르지 않다면 InvalidArgumentException이 발생하니, date 메서드를 호출하기 전에 입력값을 검증하는 것이 좋습니다.

Retrieving Enum Input Values​

PHP enums과 연결되는 입력값도 요청에서 받아올 수 있습니다. 해당 이름의 입력값이 없거나 enum에 입력값과 일치하는 백킹 값이 없다면 null이 반환됩니다. enum 메서드는 입력값의 이름과 enum 클래스를 첫 번째, 두 번째 인자로 받습니다.

use App\Enums\Status;

$status = $request->enum('status', Status::class);

Retrieving Input via Dynamic Properties​

Illuminate\Http\Request 인스턴스에서 동적 프로퍼티 방식으로도 입력값에 접근할 수 있습니다. 예를 들어, 폼에 name 필드가 있다면 아래처럼 값을 얻을 수 있습니다.

$name = $request->name;

동적 프로퍼티를 사용할 때 Laravel은 먼저 요청 페이로드(입력값)에서 값을 찾고, 없으면 매칭된 라우트의 파라미터에서 값을 찾습니다.

Retrieving a Portion of the Input Data​

입력값 중 일부만 가져오고 싶다면 only와 except 메서드를 사용할 수 있습니다. 두 메서드는 하나의 array 또는 동적으로 나열한 여러 인자를 받을 수 있습니다.

$input = $request->only(['username', 'password']);

$input = $request->only('username', 'password');

$input = $request->except(['credit_card']);

$input = $request->except('credit_card');

only 메서드는 요청에 실제로 존재하는 key/value 쌍만 반환합니다. 요청에 없는 키에 대해서는 값을 반환하지 않습니다.

Input Presence​

입력값이 요청에 포함되어 있는지 확인하려면 has 메서드를 사용하세요. has 메서드는 값이 요청에 있으면 true를 반환합니다.

if ($request->has('name')) {
// ...
}

배열을 전달하면 has 메서드는 지정된 모든 값이 요청에 있는지 확인합니다.

if ($request->has(['name', 'email'])) {
// ...
}

hasAny 메서드를 사용하면 지정된 값 중 하나라도 요청에 있으면 true를 반환합니다.

if ($request->hasAny(['name', 'email'])) {
// ...
}

whenHas 메서드는 지정한 값이 존재할 때만 클로저를 실행합니다.

$request->whenHas('name', function (string $input) {
// ...
});

지정한 값이 요청에 없을 때 실행되는 두 번째 클로저를 whenHas 메서드에 전달할 수도 있습니다.

$request->whenHas('name', function (string $input) {
// The "name" value is present...
}, function () {
// The "name" value is not present...
});

값이 존재하고 비어있지 않은(빈 문자열 아님) 경우를 판단하려면 filled 메서드를 사용하세요.

if ($request->filled('name')) {
// ...
}

여러 값 중 하나라도 비어있지 않으면 anyFilled가 true를 반환합니다.

if ($request->anyFilled(['name', 'email'])) {
// ...
}

whenFilled 메서드는 값이 존재하며 비어있지 않을 때 주어진 클로저를 실행합니다.

$request->whenFilled('name', function (string $input) {
// ...
});

지정한 값이 "filled" 상태가 아닐 때 실행되는 두 번째 클로저를 whenFilled 메서드에 전달할 수도 있습니다.

$request->whenFilled('name', function (string $input) {
// The "name" value is filled...
}, function () {
// The "name" value is not filled...
});

요청에 특정 키가 없음을 확인하려면 missing과 whenMissing 메서드를 사용할 수 있습니다.

if ($request->missing('name')) {
// ...
}

$request->whenMissing('name', function (array $input) {
// The "name" value is missing...
}, function () {
// The "name" value is present...
});

Merging Additional Input​

가끔, 요청의 기존 입력값에 추가로 값을 직접 병합하고 싶을 때가 있습니다. 이럴 때는 merge 메서드를 사용하면 됩니다. 이미 요청에 존재하는 입력 키라면 merge 메서드에 전달한 데이터로 덮어씁니다.

$request->merge(['votes' => 0]);

mergeIfMissing 메서드는 주어진 키가 이미 요청 입력값에 존재하지 않을 때만 값을 병합합니다.

$request->mergeIfMissing(['votes' => 0]);

Old Input​

Laravel에서는 이전 요청의 입력값을 다음 요청까지 유지할 수 있습니다. 이 기능은 주로 유효성 검증 후 폼 입력값을 다시 채우고 싶을 때 매우 유용합니다. 다만, Laravel의 validation features 기능을 사용한다면, 해당 기능이 내부적으로 이 입력값 저장(플래시) 과정을 자동으로 처리하므로 직접 호출할 필요가 없을 수 있습니다.

Flashing Input to the Session​

Illuminate\Http\Request 클래스의 flash 메서드는 현재 입력값을 session에 저장(플래시)하여 다음 요청에서도 사용할 수 있게 해줍니다.

$request->flash();

flashOnly와 flashExcept 메서드를 사용하면 일부 데이터만 선택적으로 세션에 플래시할 수 있습니다. 예를 들어 비밀번호와 같은 민감한 정보는 세션에 저장하지 않을 때 유용합니다.

$request->flashOnly(['username', 'email']);

$request->flashExcept('password');

Flashing Input Then Redirecting​

입력값을 세션에 플래시한 뒤 바로 이전 페이지로 리다이렉트할 때가 많은데, 이때는 withInput 메서드를 체이닝해서 사용할 수 있습니다.

return redirect('form')->withInput();

return redirect()->route('user.create')->withInput();

return redirect('form')->withInput(
$request->except('password')
);

Retrieving Old Input​

이전 요청에서 플래시된 입력값을 가져오려면, Illuminate\Http\Request 인스턴스의 old 메서드를 호출하세요. old 메서드는 session에 저장된 이전 입력값을 반환합니다.

$username = $request->old('username');

또한 Laravel에서는 전역 old 헬퍼도 제공됩니다. Blade template에서 폼에 이전 값을 다시 채울 때는 old 헬퍼를 사용하는 것이 더 편리합니다. 만약 해당 필드에 이전 값이 없으면 null이 반환됩니다.

<input type="text" name="username" value="{{ old('username') }}">

Cookies​

Retrieving Cookies From Requests​

Laravel에서 생성된 모든 쿠키는 암호화 및 인증 코드로 서명되어 있기 때문에, 클라이언트에서 쿠키가 변경되면 무효 처리됩니다. 요청에서 쿠키 값을 가져오려면 Illuminate\Http\Request 인스턴스의 cookie 메서드를 사용하십시오.

$value = $request->cookie('name');

Input Trimming and Normalization​

Laravel에서는 기본적으로 App\Http\Middleware\TrimStrings와 Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull 미들웨어를 전체 글로벌 미들웨어 스택에 포함시킵니다. 이 미들웨어들은 App\Http\Kernel 클래스에 의해 글로벌 미들웨어 스택에 등록됩니다. 즉, 이 미들웨어들은 들어오는 모든 요청의 문자열 필드를 자동으로 trim(양쪽 공백 제거)하고, 빈 문자열을 null로 변환해줍니다. 따라서 라우트나 컨트롤러에서 이 부분을 신경 쓸 필요가 없습니다.

Disabling Input Normalization​

모든 요청에서 이 동작을 끄고 싶다면, 두 미들웨어를 App\Http\Kernel 클래스의 $middleware 속성에서 제거하면 됩니다.

특정 요청에 대해서만 문자열 트리밍 또는 빈 문자열 변환을 비활성화하고 싶다면, 각 미들웨어가 제공하는 skipWhen 메서드를 사용할 수 있습니다. 이 메서드는 입력값 정규화를 건너뛸지(true/false)를 나타내는 값을 반환하는 클로저를 인자로 받습니다. 일반적으로 skipWhen 메서드는 애플리케이션의 AppServiceProvider의 boot 메서드 내부에서 호출합니다.

use App\Http\Middleware\TrimStrings;
use Illuminate\Http\Request;
use Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull;

/**
* Bootstrap any application services.
*/
public function boot(): void
{
TrimStrings::skipWhen(function (Request $request) {
return $request->is('admin/*');
});

ConvertEmptyStringsToNull::skipWhen(function (Request $request) {
// ...
});
}

Files​

Retrieving Uploaded Files​

Illuminate\Http\Request 인스턴스의 file 메서드나 동적 프로퍼티를 통해 업로드된 파일을 가져올 수 있습니다. file 메서드는 PHP의 SplFileInfo를 확장한 Illuminate\Http\UploadedFile 인스턴스를 반환하며, 파일과 상호작용할 수 있는 다양한 메서드를 제공합니다.

$file = $request->file('photo');

$file = $request->photo;

업로드된 파일이 요청에 포함되어 있는지 확인하려면 hasFile 메서드를 사용하세요.

if ($request->hasFile('photo')) {
// ...
}

Validating Successful Uploads​

파일이 실제로 잘 업로드되었는지를 확인하려면 isValid 메서드를 호출하면 됩니다.

if ($request->file('photo')->isValid()) {
// ...
}

File Paths and Extensions​

UploadedFile 클래스에는 파일의 전체 경로와 확장자 정보를 얻을 수 있는 메서드도 있습니다. extension 메서드는 파일 내용을 기반으로 확장자를 추측하며, 이는 클라이언트가 제공한 확장자와 다를 수 있습니다.

$path = $request->photo->path();

$extension = $request->photo->extension();

Other File Methods​

UploadedFile 인스턴스에는 이 외에도 다양한 메서드가 있습니다. 보다 자세한 정보는 API documentation for the class를 참조하세요.

Storing Uploaded Files​

업로드된 파일을 저장하려면, 보통 미리 설정해둔 filesystems을 사용하게 됩니다. UploadedFile 클래스의 store 메서드는 업로드된 파일을 로컬 디스크 또는 Amazon S3와 같은 클라우드 저장소에 옮길 수 있습니다.

store 메서드에는 파일을 저장할 경로(파일 이름은 제외, 파일 시스템의 루트에서 상대 경로)를 지정해야 합니다. 파일 이름은 자동으로 고유값이 생성되어 사용됩니다.

또한 store 메서드는 파일을 저장할 디스크 이름을 선택적인 두 번째 인자로 받을 수도 있습니다. 이 메서드는 디스크의 루트 기준 저장 경로를 반환합니다.

$path = $request->photo->store('images');

$path = $request->photo->store('images', 's3');

파일 이름을 직접 지정하려면, storeAs 메서드를 사용하면 됩니다. 이 메서드는 경로, 파일명, 디스크명을 인자로 받습니다.

$path = $request->photo->storeAs('images', 'filename.jpg');

$path = $request->photo->storeAs('images', 'filename.jpg', 's3');

Laravel 파일 저장에 관해 더 많은 정보가 필요하다면, file storage documentation를 참고하세요.

Configuring Trusted Proxies​

로드 밸런서를 통해 TLS/SSL 인증서가 종료되는 환경에서, url 헬퍼로 링크를 생성할 때 애플리케이션이 HTTPS 링크를 만들지 않는 문제가 발생할 수 있습니다. 이는 주로 로드 밸런서가 포트 80으로 트래픽을 전달하기 때문이며, 이로 인해 애플리케이션이 보안 링크 생성을 알아채지 못하는 상황이 생깁니다.

이런 경우에는 Laravel 애플리케이션에 포함된 App\Http\Middleware\TrustProxies 미들웨어를 설정하세요. 이 미들웨어는 애플리케이션에서 신뢰할 로드 밸런서 또는 프록시를 간편하게 지정할 수 있게 해줍니다. 신뢰할 프록시는 이 미들웨어의 $proxies 속성에 배열로 지정하며, 신뢰할 프록시 $headers도 별도로 지정할 수 있습니다.

<?php

namespace App\Http\Middleware;

use Illuminate\Http\Middleware\TrustProxies as Middleware;
use Illuminate\Http\Request;

class TrustProxies extends Middleware
{
/**
* The trusted proxies for this application.
*
* @var string|array
*/
protected $proxies = [
'192.168.1.1',
'192.168.1.2',
];

/**
* The headers that should be used to detect proxies.
*
* @var int
*/
protected $headers = Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_HOST | Request::HEADER_X_FORWARDED_PORT | Request::HEADER_X_FORWARDED_PROTO;
}

AWS Elastic Load Balancing을 사용한다면, $headers 값은 Request::HEADER_X_FORWARDED_AWS_ELB여야 합니다. $headers 속성에 사용 가능한 상수에 대한 자세한 내용은 Symfony의 trusting proxies를 참고하세요.

Trusting All Proxies​

Amazon AWS 등 클라우드 로드 밸런서를 사용하는 경우, 실제 밸런서의 IP 주소를 알지 못할 수도 있습니다. 이럴 때는 *를 사용하여 모든 프록시를 신뢰할 수 있습니다.

/**
* The trusted proxies for this application.
*
* @var string|array
*/
protected $proxies = '*';

Configuring Trusted Hosts​

기본적으로 Laravel은 요청의 Host 헤더 값이 무엇이든 모든 요청에 응답합니다. 또한, 웹 요청에서 애플리케이션의 절대 URL을 생성할 때 Host 헤더 값을 사용합니다.

일반적으로 Nginx, Apache 등 웹 서버에서 지정한 호스트 이름과 일치하는 요청만 애플리케이션으로 전달하도록 설정해야 합니다. 다만, 웹 서버를 직접 제어할 수 없고 Laravel 자체적으로 특정 호스트에만 응답하고 싶다면, App\Http\Middleware\TrustHosts 미들웨어를 활성화하면 됩니다.

TrustHosts 미들웨어는 이미 $middleware 스택에 포함되어 있으니, 주석을 해제하면 바로 동작합니다. 미들웨어의 hosts 메서드에서 애플리케이션이 응답해야 할 호스트명을 지정할 수 있습니다. 나머지 Host 헤더 값으로 요청이 들어오면 거부됩니다.

/**
* Get the host patterns that should be trusted.
*
* @return array<int, string>
*/
public function hosts(): array
{
return [
'laravel.test',
$this->allSubdomainsOfApplicationUrl(),
];
}

allSubdomainsOfApplicationUrl 헬퍼 메서드는 애플리케이션의 app.url 설정값의 모든 서브도메인과 매칭되는 정규표현식을 반환합니다. 이 메서드는 와일드카드 서브도메인 기반 애플리케이션 구성 시 매우 편리하게 사용할 수 있습니다.