고양이 여름이의 지식채널
Laravel middleware 동작 원리 & 설정 방법 (라라벨 미들웨어) 본문
미들웨어는 라라벨의 요청과 응답 사이에서 실행되는 코드 종류이며. 컨트롤러 메서드가 호출되기 전에 실행되는 명령 집합입니다. 미들웨어는 응용프로그램에 들어오는 HTTP 요청을 필터링하고 조작할 수 있는 방법을 제공합니다. 또한 요청의 유효성을 검사하고 응용프로그램이 반환하는 응답을 수정하는 데 사용할 수 있습니다.
생성 명령어 (artisan)
artisan명령어로 쉽게 생성이 가능합니다.
php artisan make:middleware ExampleMiddleware
실행 원리
HTTP 요청이 라라벨 애플리케이션으로 전송되면 컨트롤러에 도달하기 전에 여러 미들웨어를 통과합니다. 미들웨어는 인증, 로깅 및 검증과 같은 다양한 작업을 수행할 수 있습니다.
각 미들웨어는 요청을 수정하고 요청에서 데이터를 추가하거나 제거할 수 있습니다. 미들웨어가 요청을 처리한 후 체인의 다음 미들웨어로 전달합니다. 체인에 더 이상 미들웨어가 없으면 요청이 컨트롤러 메서드로 전달됩니다.
그런 다음 컨트롤러의 응답은 미들웨어를 통해 역순으로 전달됩니다. 각 미들웨어는 응답을 수정하고 응답에서 데이터를 추가하거나 제거할 수 있습니다. 미들웨어가 응답을 처리한 후 클라이언트로 반환됩니다.
<?php
namespace App\Http\Middleware;
use Closure;
class ExampleMiddleware
{
public function handle($request, Closure $next)
{
// 컨트롤러 요청을 처리하기 전에 작업수행
return $next($request);
}
}
##################
<?php
namespace App\Http\Middleware;
use Closure;
class ExampleMiddleware
{
public function handle($request, Closure $next)
{
$response = $next($request);
// 컨트롤러에서 요청을 처리 한 후에 작업수행
return $response;
}
}
라라벨 미들웨어의 간단한 예입니다. 미들웨어의 실행은 handle function이 호출되어 실행됩니다. $request 매개 변수는 수신 HTTP 요청이며 $next 매개 변수는 다음 미들웨어 체인 또는 컨트롤러 메서드를 나타냅니다. - 다음에 적용되는 미들웨어가 있으면 다음 미들웨어가 실행되고, 없으면 route로 설정된 컨트롤러 메서드가 실행된다.
핸들 메서드 내부에서는 컨트롤러 메서드가 호출되기 전후에 원하는 작업을 수행할 수 있습니다. 예를 들어 사용자가 인증되었는지 확인하거나 요청을 기록하거나 컨트롤러에서 반환된 응답을 수정할 수 있습니다.
미들웨어를 사용하려면 app/Http/Kernel.php 파일의 $middleware 배열에 미들웨어를 추가해야 합니다.
설정 방법
설정 방식은
- $middleware - 전역설정
- $middlewareGroups - 미들웨어 그룹 설정
- $routeMiddleware- 기본적인 미들웨어 설정
protected $middleware = [
// ...
\App\Http\Middleware\ExampleMiddleware::class,
];
$middleware에 미들웨어를 선언하면 모든 요청에 대해서 미들웨어 적용이 됩니다.
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:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
######
// 아래의 route는 web 미들웨어 그룹으로 설정되어있는 모든 미들웨어가 적용됨
Route::get('/', function () {
//
})->middleware('web');
$middlewareGroups로 설정시.
web 이라는 미들웨어를 route에 적용하게 되면 web 에 그룹되어있는 모든 미들웨어가 적용됩니다.
-별다른 설정없이도, web 과 api 미들웨어 그룹이 App\Providers\RouteServiceProvider 에 의해서 자동으로 애플리케이션의 routes/web.php과 routes/api.php 파일에 적용됩니다.
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,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];
일반적으로 미들웨어를 생성하고 적용하려면 routeMiddleware에 선언을 하면 됩니다.