[Laravel] MiddleWare updated_at: 2024-12-16 11:36

MiddleWare

미들웨어란 실제 프로그램이 동작하기 전에 먼저 실행되는 프로그램이다. 라라벨에서는 url이 들어오면 route에서 url을 실제 실행할 controller와 맵핑시켜주는데 맵핑시켜주기 전에 실행한다고 보면 될 것이다.
혹은 Controller의 construct에서 미들웨어를 실행하는 방식도 가능하다.

Kernel

먼저 커널의 속성들에 대해서 이야기 해 보자.

  • app > Http > Kernel.php

middleware

middleware는 route와 상관없이 실행될때 사용된다. 이때는 request를 사용하지 않으며 주로 global 환경등이나 보안등에 필요한 정보를 입력한다.

// \App\Http\Middleware\TrustHosts::class,
\App\Http\Middleware\TrustProxies::class,
\Fruitcake\Cors\HandleCors::class,
\App\Http\Middleware\PreventRequestsDuringMaintenance::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,

middlewareGroups && routeMiddleware

middlewareGroups 과 routeMiddleware 은 route 설정시 필요에 따라 사용할 있는데 middlewareGroups 은 말처럼 여러가지 기능을 하나에 넣어 둔것이고 routeMiddleware 은 단일 기능을 제공한다. 둘다 route용으로 사용할 경우 클래스를 만들때 $next($request) 리턴해 주어야 정상적으로 동작한다.

namespace App\Http\Middleware;
use Closure;
class myMiddleware
{
  public function handle($request, Closure $next)
  {
    return $next($request);
  }
}

$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' => [
  // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
  'throttle:api',
  \Illuminate\Routing\Middleware\SubstituteBindings::class,
],

$routeMiddleware

  'auth' => \App\Http\Middleware\Authenticate::class,
  'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
  'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
  'can' => \Illuminate\Auth\Middleware\Authorize::class,
  'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
  'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
  'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
  'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
  'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
middlewareGroups && routeMiddleware 을 route에 적용하기
Route::get('/', 'WelcomeController@view')->middleware('web'); // web 이라는 middlewareGroups 적용

Route::middleware('auth:api')->get('/user', function (Request $request) {});

Route::get('/user', 'UserController@profile')->name('user.profile')->middleware(['auth', 'verified']); // auth 및  verified 라는 routeMiddleware 적용

Middleware 기능

사용자 정의 middleware를 만들어 사용하기 전에 먼저 기존에 제공하는 기능들을 분석해 보자. Middleware Aliases 상세설명

verified

middleware('verified') 가 적용되면 이메일인증이 되지 않은 회원은 접근할 수 가 없다.
이때는 users table의 email_verified_at 필드가 Null 이 아니여야 한다.
또한 User Model도 아래와 같이 MustVerifyEmail가 implements 되어 있어야 정상적으로 작동한다.

use Illuminate\Contracts\Auth\MustVerifyEmail;
..........
class User extends Authenticatable implements MustVerifyEmail
{}
평점을 남겨주세요
평점 : 5.0
총 투표수 : 1

질문 및 답글