Laravel Passport 최신 스코프 – 속성 기반 OAuth 스코프 적용

발행: (2026년 1월 8일 오전 08:49 GMT+9)
5 min read
원문: Dev.to

Source: Dev.to

Laravel Passport는 전통적으로 라우팅 레벨에서 OAuth 스코프를 적용하며, 보통 라우트 파일에 정의된 미들웨어를 통해 동작합니다. 이는 동작하지만 다음과 같은 문제를 일으키는 경우가 많습니다:

  • 라우트마다 흩어져 있는 인가 규칙
  • 인프라스트럭처와 결합된 컨트롤러
  • 중복되거나 검토하기 어려운 스코프 요구사항
  • API가 성장함에 따라 명확성이 떨어짐

Laravel Passport Modern Scopes는 다른 접근 방식을 제시합니다.

아이디어: 의미 있는 곳에 스코프 선언하기

스코프를 라우트에 연결하는 대신, 이 패키지는 PHP 8 어트리뷰트를 사용해 컨트롤러 혹은 컨트롤러 액션에 직접 OAuth 스코프 요구사항을 선언할 수 있게 합니다. 인가 의도는 보호하는 코드 바로 옆에 위치하고, Passport는 인증 및 토큰 검증을 완전히 담당합니다.

예시

use N3XT0R\PassportModernScopes\Support\Attributes\RequiresScope;
use N3XT0R\PassportModernScopes\Support\Attributes\RequiresAnyScope;

#[RequiresScope('users:read')]
final class UserController
{
    public function index()
    {
        // Requires users:read
    }

    #[RequiresAnyScope('users:update', 'users:write')]
    public function update()
    {
        // Requires at least one of the given scopes
    }
}

단일 미들웨어가 런타임에 컨트롤러 어트리뷰트를 검사하고 Laravel Passport의 기본 tokenCan 검사를 사용해 이를 강제합니다. 인증 자체는 설정된 가드(예: auth:api)의 책임으로 남아 있습니다.

이 패키지가 하는 일

  • 어트리뷰트 기반 OAuth 스코프 적용을 지원
  • 라우트를 깔끔하게 유지하고 인프라와 무관하게 설계
  • 인가 요구사항을 명시적이고 탐색 가능하게 함
  • Passport 기존 스코프 검증과 호환
  • Passport 내부 구조를 변경할 필요 없음

스코프는 연결되는 것이 아니라 선언되는 것입니다.

어트리뷰트를 사용하는 이유

  • 선언적이고 명시적임
  • 라우트와 컨트롤러 사이에 중복이 없음
  • 코드 리뷰 시 이해가 쉬움
  • 정적 분석 및 문서 도구와 친화적
  • 라우트 정의에 흩어져 있는 매직 문자열이 없음

이렇게 하면 인가 의도HTTP 연결과 분리됩니다.

이 패키지가 하지 않는 일

  • ❌ Laravel Passport를 대체하지 않음
  • ❌ 인증을 구현하지 않음
  • ❌ 커스텀 가드를 도입하지 않음
  • ❌ 비즈니스 규칙을 강제하지 않음

오직 선언된 OAuth 스코프 요구사항만을 해석하고 적용합니다.

아키텍처 상 위치

Laravel Passport Modern Scopes는 의도적으로 작고 집중된 패키지입니다. 다음과 잘 어울립니다:

  • 구조화된 스코프 모델(resource:action 등)
  • 도메인 레벨 인가 로직
  • 중앙에서 스코프를 관리하는 관리자 도구

단독으로 사용하거나 상위 수준 인가 라이브러리와 함께 사용할 수 있습니다.

설치

composer require n3xt0r/laravel-passport-modern-scopes:^2.0

미들웨어는 패키지의 서비스 프로바이더를 통해 자동으로 등록됩니다.

마무리 생각

이 패키지는 추상화가 아니라 명확성에 중점을 둡니다. 다음을 선호한다면:

  • 명시적인 인가 요구사항
  • 깔끔한 라우트
  • 의도를 명확히 표현하는 컨트롤러

어트리뷰트 기반 스코프 적용은 매우 자연스러운 선택이 될 수 있습니다.

피드백과 토론을 환영합니다.

Back to Blog

관련 글

더 보기 »

DataBlock와 실제 API 탐색

GitHub와 Packagist 데이터를 사용하여 Symfony와 Laravel을 비교합니다. 첫 번째 기사 “Handling Nested PHP Arrays Using DataBlock”에서 우리는 DataBlock을 …