Skip to main content

개요

Laravel 13에서는 컨트롤러에 대한 미들웨어 할당과 인가 검사를 PHP 어트리뷰트로 선언할 수 있게 되었습니다. 기존의 middleware() 메서드나 can 미들웨어 대신, 클래스나 메서드에 직접 어트리뷰트를 부여하는 것만으로 설정이 완료됩니다.
컨트롤러 어트리뷰트는 모두 Illuminate\Routing\Attributes\Controllers 네임스페이스에 있습니다.

#[Middleware] — 미들웨어 할당하기

클래스에 적용

클래스 레벨에 #[Middleware]를 부여하면, 해당 컨트롤러의 모든 액션에 미들웨어가 적용됩니다.
여러 미들웨어를 부여하려면 어트리뷰트를 반복해서 사용합니다.

메서드에 적용

메서드 레벨에 부여한 미들웨어는 클래스 레벨의 미들웨어와 병합됩니다.

only / except로 대상 좁히기

클래스 레벨 어트리뷰트에 only 또는 except를 지정하면 대상 메서드를 좁힐 수 있습니다.

클로저 미들웨어

어트리뷰트에는 클로저도 사용할 수 있습니다. 인라인으로 처리를 작성하고 싶을 때 편리합니다.

기존 middleware() 메서드와 비교

어트리뷰트를 사용할 때는 HasMiddleware 인터페이스를 구현할 필요가 없습니다. 다만 middleware() 메서드와 어트리뷰트를 혼용하면 의도치 않은 동작이 발생할 수 있으므로, 한쪽으로 통일하는 것을 권장합니다.

#[WithoutMiddleware] — 미들웨어 제외하기

클래스 레벨에서 적용된 미들웨어를 특정 메서드 또는 클래스 전체에서 제외합니다.

메서드에 적용

클래스에 적용 및 only / except

#[WithoutMiddleware]를 클래스 레벨에 부여하면, 자식 클래스를 포함한 모든 액션에서 미들웨어가 제외됩니다. only / except로 제외 범위를 제한할 수 있습니다.
#[WithoutMiddleware]라우트 미들웨어에만 유효합니다. app/Http/Kernel.php에 등록된 전역 미들웨어는 제외할 수 없습니다.

#[Authorize] — 정책 기반 인가

can 미들웨어의 문법적 편의로, 정책 기반 인가 검사를 어트리뷰트로 선언할 수 있습니다.

기본 사용법

정책 인수

두 번째 인수에는 다음과 같은 값을 전달할 수 있습니다.

can 미들웨어와 비교

라우트 파일에 미들웨어를 작성할 필요가 없어지고, 인가 로직이 컨트롤러에 집중됩니다.

실전 예제

리소스 컨트롤러에 적용

API 컨트롤러에 적용

어트리뷰트 처리 순서

여러 어트리뷰트가 부여된 경우, 처리 순서는 다음과 같습니다.
#[Authorize]는 내부적으로 can 미들웨어로 동작하므로, #[Middleware]와 동일한 파이프라인에서 처리됩니다.

정리: 어느 것을 사용해야 할까

다음 단계

PHP 어트리뷰트 (큐·Eloquent)

큐 잡이나 Eloquent 모델에서 사용할 수 있는 PHP 어트리뷰트를 설명합니다.

중급: 컨트롤러

Laravel 컨트롤러의 기본적인 사용법을 배웁니다.
마지막 수정일 2026년 8월 2일