📚 PHP 고급 - 3주차: 인증 및 권한 관리 (프레임워크) - 02 미들웨어(Middleware)를 이용한 접근 제어

2025. 9. 14. 14:11프로그램/PHP 고급

미들웨어(Middleware)란 무엇인가?

📚 PHP 고급 - 3주차: 인증 및 권한 관리 (프레임워크) - 02 미들웨어(Middleware)를 이용한 접근 제어

#미들웨어 (Middleware)는 #웹 애플리케이션 에서 요청(Request)이 라우트에 도달하기 전이나 응답(Response)이 사용자에게 전달되기 전에 실행되는 코드 계층을 의미합니다. 이는 주로 요청과 응답을 #필터링 하거나, 특정 작업을 수행하고, 애플리케이션의 핵심 로직과 분리하여 #횡단 관심사 (Cross-cutting Concerns)를 처리하는 데 사용됩니다. 예를 들어, 인증 검사, 로깅, #CORS (Cross-Origin Resource Sharing) 헤더 추가 등이 미들웨어의 대표적인 역할입니다.


미들웨어를 이용한 접근 제어의 필요성

애플리케이션에서 모든 라우트나 컨트롤러에 직접 접근 제어 로직을 구현하는 것은 비효율적이며 코드 중복을 야기합니다. 예를 들어, 관리자만 접근할 수 있는 페이지가 여러 개 있을 때, 각 페이지마다 if (user_is_admin()) { ... }와 같은 코드를 반복해서 작성해야 합니다. 미들웨어를 사용하면 이러한 #접근 제어 로직을 한 곳에 집중시켜 관리할 수 있으며, 코드의 #재사용성 을 높이고 #유지보수 를 용이하게 만듭니다.


Laravel에서 미들웨어 구현 및 활용

#Laravel 에서는 미들웨어를 매우 직관적으로 구현하고 사용할 수 있습니다.

 

  1. #미들웨어 생성이 명령어를 실행하면 app/Http/Middleware/AdminMiddleware.php 파일이 생성됩니다. 
  2. PHP
     
    <?php
    
    namespace App\Http\Middleware;
    
    use Closure;
    use Illuminate\Http\Request;
    use Symfony\Component\HttpFoundation\Response;
    
    class AdminMiddleware
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
         */
        public function handle(Request $request, Closure $next): Response
        {
            if (!auth()->check() || !auth()->user()->isAdmin()) {
                return redirect('/home')->with('error', '관리자만 접근할 수 있습니다.');
            }
            return $next($request);
        }
    }
    
  3. handle 메소드에서 요청이 다음 미들웨어 또는 라우트 핸들러로 진행되기 전에 로직을 수행합니다. 여기서는 사용자가 로그인되어 있고 관리자인지 확인하며, 그렇지 않으면 리다이렉션합니다.
  4. PHP
     
    php artisan make:middleware AdminMiddleware
    
  5. #미들웨어 등록
    PHP
     
    protected $routeMiddleware = [
        // ...
        'admin' => \App\Http\Middleware\AdminMiddleware::class,
    ];
    
  6. app/Http/Kernel.php 파일에 미들웨어를 등록해야 합니다.
  7. 미들웨어 적용
    PHP
     
    Route::middleware(['auth', 'admin'])->group(function () {
        Route::get('/admin/dashboard', function () {
            // 관리자 대시보드
        });
    });
    
    위 예시에서는 auth 미들웨어(로그인 여부 확인)와 admin 미들웨어(관리자 여부 확인)를 동시에 적용하여, 로그인된 관리자만 /admin/dashboard 경로에 접근할 수 있도록 합니다.
  8. 라우트에 미들웨어를 적용합니다.

Symfony에서 미들웨어(Event Listener)를 이용한 접근 제어

#Symfony 에서는 미들웨어라는 용어 대신 #Event #Listener 나 #Event #Subscriber 를 사용하여 유사한 기능을 구현합니다. Symfony의 #이벤트 디스패처 (Event Dispatcher) 시스템을 활용하여 요청 처리 과정 중 특정 시점에 코드를 실행할 수 있습니다.

 

  1. #이벤트 리스너 생성
    PHP
     
    <?php
    
    namespace App\EventSubscriber;
    
    use Symfony\Component\EventDispatcher\EventSubscriberInterface;
    use Symfony\Component\HttpKernel\Event\RequestEvent;
    use Symfony\Component\HttpKernel\KernelEvents;
    use Symfony\Component\Security\Core\Security;
    use Symfony\Component\HttpFoundation\RedirectResponse;
    use Symfony\Component\Routing\RouterInterface;
    
    class AccessDeniedSubscriber implements EventSubscriberInterface
    {
        private $security;
        private $router;
    
        public function __construct(Security $security, RouterInterface $router)
        {
            $this->security = $security;
            $this->router = $router;
        }
    
        public static function getSubscribedEvents()
        {
            return [
                KernelEvents::REQUEST => ['onKernelRequest', 10],
            ];
        }
    
        public function onKernelRequest(RequestEvent $event)
        {
            $request = $event->getRequest();
            $route = $request->attributes->get('_route');
    
            // 예시: /admin 경로에 대한 접근 제어
            if (str_starts_with($route, 'admin_') && !$this->security->isGranted('ROLE_ADMIN')) {
                $event->setResponse(new RedirectResponse($this->router->generate('app_home')));
            }
        }
    }
    
  2. 이 리스너는 KernelEvents::REQUEST 이벤트가 발생할 때 실행되며, 요청된 라우트가 admin_으로 시작하고 사용자가 ROLE_ADMIN 역할을 가지고 있지 않다면 홈 페이지로 리다이렉션합니다.
  3. src/EventSubscriber/AccessDeniedSubscriber.php 파일을 생성합니다.
  4. 이벤트 리스너 등록 (자동 등록)
  5. Symfony 4.x 이상에서는 서비스 컨테이너에 정의된 이벤트 리스너가 자동으로 등록됩니다. 별도의 설정 없이 서비스에 주입된 후 자동으로 작동합니다.
  6. 접근 제어 설정 위 설정은 /admin으로 시작하는 모든 경로에 대해 ROLE_ADMIN 역할이 필요하며, /profile로 시작하는 경로에는 ROLE_USER 역할이 필요함을 의미합니다.
  7. YAML
     
    # config/packages/security.yaml
    security:
        # ...
        access_control:
            - { path: ^/admin, roles: ROLE_ADMIN }
            - { path: ^/profile, roles: ROLE_USER }
    
  8. #Security 컴포넌트의 security.yaml 파일을 통해 더욱 선언적으로 접근 제어를 설정할 수 있습니다.

미들웨어/이벤트 리스너 활용 시 고려사항

  • #순서: 여러 미들웨어/리스너가 적용될 경우 실행 순서가 중요할 수 있습니다. 프레임워크마다 순서 제어 방식이 다르므로 문서를 참고해야 합니다.
  • #성능: 미들웨어/리스너가 너무 많거나 복잡한 로직을 포함하면 요청 처리 성능에 영향을 줄 수 있습니다. 필요한 경우에만 사용하고, 로직을 최적화해야 합니다.
  • #재사용성: 일반적인 접근 제어 로직은 미들웨어/리스너로 구현하고, 특정 컨트롤러에만 적용되는 세부 로직은 컨트롤러 내에서 처리하는 것이 좋습니다.

미들웨어 또는 이벤트 리스너는 프레임워크 기반 #애플리케이션 에서 #보안 및 #접근 제어 를 구현하는 강력하고 유연한 방법입니다. 이를 통해 코드의 응집도를 높이고 관리하기 쉬운 애플리케이션을 구축할 수 있습니다.

 

네이버 블로그 #서이추 프로그램을 사용하여 블로그 성장을 가속화하세요. 

단시간에 수백 명의 이웃을 추가하고, 블로그 지수를 상승시키는 가장 효율적인 방법입니다. 

자동화된 #이웃추가, #댓글, #공감 기능을 통해 실제 활동하는 이웃을 확보하고, 블로그 활성도를 높여 보세요. 

블로그 운영 시간을 절약하고 싶다면 지금 바로 시작해 보세요. 

지속적인 #소통 관리를 통해 블로그 잠재력을 극대화할 수 있습니다. 

#블로그마케팅 #블로그성장 #블로그관리 #네이버블로그

https://ntoppro.luzensoft.com

 

서이추 프로그램 신규추가 - N사 마케팅 컨설팅/프로그램 | NTOPPRO | 루젠소프트

서이추,최상위검색마케팅,포털마케팅프로그램,블로그마케팅프로그램,바이럴마케팅프로그램,홍보프로그램,마케팅프로그램

ntoppro.luzensoft.com