[Laravel] MiddleWare
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
{}