2024년 6월 17일 월요일

Laravel : Middleware

Laravel : Middleware

Laravel : Middleware

middleware 란, 말 그대로 중간에 걸쳐서 뭔가 처리를 추가하는 소프트웨어(또는 하드웨어) 를 말한다.
Laravel에서의 미들웨어는 HTTP요청에 대해 추가처리를 하기 위한 프로그램을 말한다.

Laravel 프레임워크의 app/Http/Middleware 에 보면, 쿠키암호화, 인증, csrf 처리등 사용자 요청이 내부에 전달되기 전에 한번더 작업을 추가하는 역활을 하는 프로그램 들이 있다.

미들웨어는 요청의 흐름에 따라 두가지로 나뉜다.
1.요청(request)를 받아서 처리하고 다음으로 진행을 할지를 결정
2.요청을 전달하여 컨트롤러 등에서 처리한 결과(response)에 대해 처리를 하고 응답(response)를 전달

미들웨어를 적용할때는 라이터에서 적용하는 방법과 컨트롤러에서 적용하는 방법이 있다.

http 요청(request)값을 넘기기 전의 Middleware

공식문서처럼 CheckAge 라는 미들웨어를 추가해보자.
이 미들웨어는 200살 이하는 home 으로 이동시키는 역활을 한다.

1.middleware 를 추가하자.

php artisan make:middleware CheckAge

2.CheckAge.php의 handle 함수에 나이체크하고 home으로 보내는 함수를 추가해보자.

 if ($request->age <= 200) {
        return redirect('/');
    }

3.Kernel.php 에 생성한 미들웨어를 추가해준다. 우리가 만든 미들웨어는 전역(모든 http요청)에서 사용할 용도가 아니기에 어플리케이션 미들웨어로 등록한다.

protected $routeMiddleware = [  
 ...
  
    'checkAge' =>  \App\Http\Middleware\CheckAge::class,  
];

4.Router설명할때 만들었던 /webroute 에 checkAge미들웨어를 추가해보자. routes/web.php 를 수정하자

Route::get('/webroute', 'WebRouteController@test')->middleware('checkAge');

또는 아래처럼 그룹형식으로 지정하여 배열인수에 다른 것들도 같이 추가하거나, 여러개의 route를 묶어서 미들웨어를 지정할수도 있다.

Route::middleware(['checkAge'])->group(function () {  
    Route::get('/webroute', 'WebRouteController@test');  
});

5.이제 route 를 갱신하기 위해서 php artisan route:cache 를 실행하고, 접속해 본다.

  • localhost/webroute?age=123 일때는 ‘/’ 로 이동한다.
  • localhost/webroute?age=201 일때는 화면에 web route 문자가 출력된채로 멈춰있다.(미들웨어 조건에서 200 이상일때는 요청된 페이지를 그대로 표시한다.)

http 응답(response)값을 넘기기 전의 Middleware

앞서 설명했듯이 요청(middleware)->서버에서처리->응답(middleware) 이렇게 서버에서 처리하기 전후로 미들웨어로 뭔가 추가처리가 가능하다.
이번에는 응답정보를 미들웨어로 처리해보자.
1.미들웨어를 추가하자.

php artisan make:middleware CheckAgeResponse

2.CheckAgeResponse.php의 handle 함수에 http응답의 푸터를 추가하자.

public function handle(Request $request, Closure $next)  
{  
    $response = $next($request);  
  
    $content = $response->getContent();  
    $modifiedContent = $content . '<!-- Custom Footer -->';  
    $response->setContent($modifiedContent);  
  
    return $response;  
}

3.어플리케이션 미들웨어로 등록한다.

'checkAgeResponse' =>  \App\Http\Middleware\CheckAgeResponse::class,

4.Router설명할때 만들었던 /webroute 에 checkAge미들웨어를 추가해보자. 위에서 추가한 checkAge 옆에 추가하자.

Route::middleware(['checkAge','checkAgeResponse'])->group(function () {  
Route::get('/webroute', 'WebRouteController@test');  

});

5.이제 route 를 갱신하기 위해서 php artisan route:cache 를 실행하고, 접속해 본다.
http응답이기 때문에 curl로 확인해 보자

 curl -v   http://localhost:80/webroute?age=123

응답내용의 맨 마지막에 미들웨어에서 추가한 '!-- Custom Footer -->'가 표시된다.

0 comments:

댓글 쓰기