216.73.216.168 TODAY : 3,938

PHP ์˜จ๋ผ์ธ ๊ฐ•์˜

 > 

PHP - ๊ณ ๊ธ‰

๐Ÿ“š PHP ๊ณ ๊ธ‰ - 3์ฃผ์ฐจ: ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๊ด€๋ฆฌ (ํ”„๋ ˆ์ž„์›Œํฌ) - 02 ๋ฏธ๋“ค์›จ์–ด(Middleware)๋ฅผ ์ด์šฉํ•œ ์ ‘๊ทผ ์ œ์–ด

๐Ÿ“š PHP ๊ณ ๊ธ‰ - 3์ฃผ์ฐจ: ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๊ด€๋ฆฌ (ํ”„๋ ˆ์ž„์›Œํฌ) - 02 ๋ฏธ๋“ค์›จ์–ด(Middleware)๋ฅผ ์ด์šฉํ•œ ์ ‘๊ทผ ์ œ์–ด
ํ‰์  10.0 ๋ผ์ด์„ผ์Šค free
์‚ฌ์šฉ์žํ‰์  10.0 ์šด์˜์ฒด์ œ
๋‹ค์šด๋กœ๋“œ 1 ํŒŒ์ผํฌ๊ธฐ 0
์ œ์ž‘์‚ฌ LUZENSOFT ๋“ฑ๋ก์ผ 2025-09-14 14:11:16
์กฐํšŒ์ˆ˜ 2
- ์„ค๋ช…

๋ฏธ๋“ค์›จ์–ด(Middleware)๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

uploadImage

#๋ฏธ๋“ค์›จ์–ด (Middleware)๋Š” #์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—์„œ ์š”์ฒญ(Request)์ด ๋ผ์šฐํŠธ์— ๋„๋‹ฌํ•˜๊ธฐ ์ „์ด๋‚˜ ์‘๋‹ต(Response)์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌ๋˜๊ธฐ ์ „์— ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ ๊ณ„์ธต์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ฃผ๋กœ ์š”์ฒญ๊ณผ ์‘๋‹ต์„ #ํ•„ํ„ฐ๋ง ํ•˜๊ฑฐ๋‚˜, ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•ต์‹ฌ ๋กœ์ง๊ณผ ๋ถ„๋ฆฌํ•˜์—ฌ #ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ (Cross-cutting Concerns)๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ธ์ฆ ๊ฒ€์‚ฌ, ๋กœ๊น…, #CORS (Cross-Origin Resource Sharing) ํ—ค๋” ์ถ”๊ฐ€ ๋“ฑ์ด ๋ฏธ๋“ค์›จ์–ด์˜ ๋Œ€ํ‘œ์ ์ธ ์—ญํ• ์ž…๋‹ˆ๋‹ค.



๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ด์šฉํ•œ ์ ‘๊ทผ ์ œ์–ด์˜ ํ•„์š”์„ฑ

uploadImage

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ชจ๋“  ๋ผ์šฐํŠธ๋‚˜ ์ปจํŠธ๋กค๋Ÿฌ์— ์ง์ ‘ ์ ‘๊ทผ ์ œ์–ด ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ด๋ฉฐ ์ฝ”๋“œ ์ค‘๋ณต์„ ์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ด€๋ฆฌ์ž๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์„ ๋•Œ, ๊ฐ ํŽ˜์ด์ง€๋งˆ๋‹ค if (user_is_admin()) { ... }์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ #์ ‘๊ทผ ์ œ์–ด ๋กœ์ง์„ ํ•œ ๊ณณ์— ์ง‘์ค‘์‹œ์ผœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฝ”๋“œ์˜ #์žฌ์‚ฌ์šฉ์„ฑ ์„ ๋†’์ด๊ณ  #์œ ์ง€๋ณด์ˆ˜ ๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.



Laravel์—์„œ ๋ฏธ๋“ค์›จ์–ด ๊ตฌํ˜„ ๋ฐ ํ™œ์šฉ

uploadImage

#Laravel ์—์„œ๋Š” ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๋งค์šฐ ์ง๊ด€์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


  1. #๋ฏธ๋“ค์›จ์–ด ์ƒ์„ฑ

    PHP

    php artisan make:middleware AdminMiddleware
    

    ์ด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด app/Http/Middleware/AdminMiddleware.php ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

    <br>

    PHP

    <?php
    
    namespace AppHttpMiddleware;
    
    use Closure;
    use IlluminateHttpRequest;
    use SymfonyComponentHttpFoundationResponse;
    
    class AdminMiddleware
    {
        /**
         * Handle an incoming request.
         *
         * @param  Closure(IlluminateHttpRequest): (SymfonyComponentHttpFoundationResponse)  $next
         */
        public function handle(Request $request, Closure $next): Response
        {
            if (!auth()->check() || !auth()->user()->isAdmin()) {
                return redirect('/home')->with('error', '๊ด€๋ฆฌ์ž๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.');
            }
            return $next($request);
        }
    }
    


    handle ๋ฉ”์†Œ๋“œ์—์„œ ์š”์ฒญ์ด ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด ๋˜๋Š” ๋ผ์šฐํŠธ ํ•ธ๋“ค๋Ÿฌ๋กœ ์ง„ํ–‰๋˜๊ธฐ ์ „์— ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ๋˜์–ด ์žˆ๊ณ  ๊ด€๋ฆฌ์ž์ธ์ง€ ํ™•์ธํ•˜๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋ฆฌ๋‹ค์ด๋ ‰์…˜ํ•ฉ๋‹ˆ๋‹ค.

  2. #๋ฏธ๋“ค์›จ์–ด ๋“ฑ๋ก

    app/Http/Kernel.php ํŒŒ์ผ์— ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๋“ฑ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    PHP

    protected $routeMiddleware = [
        // ...
        'admin' => AppHttpMiddlewareAdminMiddleware::class,
    ];
    
  3. ๋ฏธ๋“ค์›จ์–ด ์ ์šฉ

    ๋ผ์šฐํŠธ์— ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

    PHP

    Route::middleware(['auth', 'admin'])->group(function () {
        Route::get('/admin/dashboard', function () {
            // ๊ด€๋ฆฌ์ž ๋Œ€์‹œ๋ณด๋“œ
        });
    });
    

    ์œ„ ์˜ˆ์‹œ์—์„œ๋Š” auth ๋ฏธ๋“ค์›จ์–ด(๋กœ๊ทธ์ธ ์—ฌ๋ถ€ ํ™•์ธ)์™€ admin ๋ฏธ๋“ค์›จ์–ด(๊ด€๋ฆฌ์ž ์—ฌ๋ถ€ ํ™•์ธ)๋ฅผ ๋™์‹œ์— ์ ์šฉํ•˜์—ฌ, ๋กœ๊ทธ์ธ๋œ ๊ด€๋ฆฌ์ž๋งŒ /admin/dashboard ๊ฒฝ๋กœ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.



Symfony์—์„œ ๋ฏธ๋“ค์›จ์–ด(Event Listener)๋ฅผ ์ด์šฉํ•œ ์ ‘๊ทผ ์ œ์–ด

uploadImage

#Symfony ์—์„œ๋Š” ๋ฏธ๋“ค์›จ์–ด๋ผ๋Š” ์šฉ์–ด ๋Œ€์‹  #Event #Listener ๋‚˜ #Event #Subscriber ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. Symfony์˜ #์ด๋ฒคํŠธ ๋””์ŠคํŒจ์ฒ˜ (Event Dispatcher) ์‹œ์Šคํ…œ์„ ํ™œ์šฉํ•˜์—ฌ ์š”์ฒญ ์ฒ˜๋ฆฌ ๊ณผ์ • ์ค‘ ํŠน์ • ์‹œ์ ์— ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


  1. #์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ƒ์„ฑ

    src/EventSubscriber/AccessDeniedSubscriber.php ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    PHP

    <?php
    
    namespace AppEventSubscriber;
    
    use SymfonyComponentEventDispatcherEventSubscriberInterface;
    use SymfonyComponentHttpKernelEventRequestEvent;
    use SymfonyComponentHttpKernelKernelEvents;
    use SymfonyComponentSecurityCoreSecurity;
    use SymfonyComponentHttpFoundationRedirectResponse;
    use SymfonyComponentRoutingRouterInterface;
    
    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')));
            }
        }
    }
    


    ์ด ๋ฆฌ์Šค๋„ˆ๋Š” KernelEvents::REQUEST ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ์‹คํ–‰๋˜๋ฉฐ, ์š”์ฒญ๋œ ๋ผ์šฐํŠธ๊ฐ€ admin_์œผ๋กœ ์‹œ์ž‘ํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ROLE_ADMIN ์—ญํ• ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋ฉด ํ™ˆ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰์…˜ํ•ฉ๋‹ˆ๋‹ค.

  2. ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋“ฑ๋ก (์ž๋™ ๋“ฑ๋ก)

    Symfony 4.x ์ด์ƒ์—์„œ๋Š” ์„œ๋น„์Šค ์ปจํ…Œ์ด๋„ˆ์— ์ •์˜๋œ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ์ž๋™์œผ๋กœ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ์„ค์ • ์—†์ด ์„œ๋น„์Šค์— ์ฃผ์ž…๋œ ํ›„ ์ž๋™์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

  3. ์ ‘๊ทผ ์ œ์–ด ์„ค์ •

    #Security ์ปดํฌ๋„ŒํŠธ์˜ security.yaml ํŒŒ์ผ์„ ํ†ตํ•ด ๋”์šฑ ์„ ์–ธ์ ์œผ๋กœ ์ ‘๊ทผ ์ œ์–ด๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    YAML

    # config/packages/security.yaml
    security:
        # ...
        access_control:
            - { path: ^/admin, roles: ROLE_ADMIN }
            - { path: ^/profile, roles: ROLE_USER }
    

    ์œ„ ์„ค์ •์€ /admin์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ๊ฒฝ๋กœ์— ๋Œ€ํ•ด ROLE_ADMIN ์—ญํ• ์ด ํ•„์š”ํ•˜๋ฉฐ, /profile๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ๋กœ์—๋Š” ROLE_USER ์—ญํ• ์ด ํ•„์š”ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.



๋ฏธ๋“ค์›จ์–ด/์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ํ™œ์šฉ ์‹œ ๊ณ ๋ ค์‚ฌํ•ญ

uploadImage

  • #์ˆœ์„œ: ์—ฌ๋Ÿฌ ๋ฏธ๋“ค์›จ์–ด/๋ฆฌ์Šค๋„ˆ๊ฐ€ ์ ์šฉ๋  ๊ฒฝ์šฐ ์‹คํ–‰ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ๋งˆ๋‹ค ์ˆœ์„œ ์ œ์–ด ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋ฏ€๋กœ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • #์„ฑ๋Šฅ: ๋ฏธ๋“ค์›จ์–ด/๋ฆฌ์Šค๋„ˆ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ๊ฑฐ๋‚˜ ๋ณต์žกํ•œ ๋กœ์ง์„ ํฌํ•จํ•˜๋ฉด ์š”์ฒญ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉํ•˜๊ณ , ๋กœ์ง์„ ์ตœ์ ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • #์žฌ์‚ฌ์šฉ์„ฑ: ์ผ๋ฐ˜์ ์ธ ์ ‘๊ทผ ์ œ์–ด ๋กœ์ง์€ ๋ฏธ๋“ค์›จ์–ด/๋ฆฌ์Šค๋„ˆ๋กœ ๊ตฌํ˜„ํ•˜๊ณ , ํŠน์ • ์ปจํŠธ๋กค๋Ÿฌ์—๋งŒ ์ ์šฉ๋˜๋Š” ์„ธ๋ถ€ ๋กœ์ง์€ ์ปจํŠธ๋กค๋Ÿฌ ๋‚ด์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ฏธ๋“ค์›จ์–ด ๋˜๋Š” ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ ๊ธฐ๋ฐ˜ #์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—์„œ #๋ณด์•ˆ ๋ฐ #์ ‘๊ทผ ์ œ์–ด ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ์‘์ง‘๋„๋ฅผ ๋†’์ด๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฌ์šด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



๋„ค์ด๋ฒ„ ๋ธ”๋กœ๊ทธ #์„œ์ด์ถ” ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ธ”๋กœ๊ทธ ์„ฑ์žฅ์„ ๊ฐ€์†ํ™”ํ•˜์„ธ์š”. 

๋‹จ์‹œ๊ฐ„์— ์ˆ˜๋ฐฑ ๋ช…์˜ ์ด์›ƒ์„ ์ถ”๊ฐ€ํ•˜๊ณ , ๋ธ”๋กœ๊ทธ ์ง€์ˆ˜๋ฅผ ์ƒ์Šน์‹œํ‚ค๋Š” ๊ฐ€์žฅ ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. 

์ž๋™ํ™”๋œ #์ด์›ƒ์ถ”๊ฐ€, #๋Œ“๊ธ€, #๊ณต๊ฐ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์‹ค์ œ ํ™œ๋™ํ•˜๋Š” ์ด์›ƒ์„ ํ™•๋ณดํ•˜๊ณ , ๋ธ”๋กœ๊ทธ ํ™œ์„ฑ๋„๋ฅผ ๋†’์—ฌ ๋ณด์„ธ์š”. 

๋ธ”๋กœ๊ทธ ์šด์˜ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ง€๊ธˆ ๋ฐ”๋กœ ์‹œ์ž‘ํ•ด ๋ณด์„ธ์š”. 

์ง€์†์ ์ธ #์†Œํ†ต ๊ด€๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ธ”๋กœ๊ทธ ์ž ์žฌ๋ ฅ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

#๋ธ”๋กœ๊ทธ๋งˆ์ผ€ํŒ… #๋ธ”๋กœ๊ทธ์„ฑ์žฅ #๋ธ”๋กœ๊ทธ๊ด€๋ฆฌ #๋„ค์ด๋ฒ„๋ธ”๋กœ๊ทธ

https://ntoppro.luzensoft.com