고양이 여름이의 지식채널

Laravel middleware 동작 원리 & 설정 방법 (라라벨 미들웨어) 본문

Programming/Laravel

Laravel middleware 동작 원리 & 설정 방법 (라라벨 미들웨어)

썸머캣 2023. 3. 2. 00:29

미들웨어는 라라벨의 요청과 응답 사이에서 실행되는 코드 종류이며. 컨트롤러 메서드가 호출되기 전에 실행되는 명령 집합입니다. 미들웨어는 응용프로그램에 들어오는 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에 선언을 하면 됩니다.

 


Laravel 서비스 컨테이너. 설명 및 예제

 

Laravel 서비스 컨테이너. 설명 및 예제

서비스 컨테이너. Laravel 서비스 컨테이너는 PHP 응용 프로그램에서 종속성 관리를 단순화하는 강력한 기능입니다. 이번에는 예제 코드를 사용하여 서비스 컨테이너의 작동 방식을 살펴봅니다.

summer-cat93.tistory.com

 

728x90
반응형
Comments