Skip to main content
Sonamu의 Guards 시스템을 사용하여 API 엔드포인트에 권한 기반 접근 제어를 구현하는 방법을 알아봅니다.

Guards 시스템 개요

선언적 권한

@api guards 옵션간단한 권한 설정

Guard 타입

admin, user, query타입 정의 제공

커스텀 Guards

비즈니스 로직유연한 확장

계층적 권한

역할 기반 제어RBAC 구현

Guards의 이해

Guards란?

Guards는 API 메서드가 실행되기 전에 권한을 검증하는 함수입니다. 다음과 같은 상황에서 사용합니다:
  • 로그인한 사용자만 접근 가능한 API
  • 관리자만 접근 가능한 API
  • 특정 조건을 만족하는 사용자만 접근 가능한 API
Guards의 장점:
  1. 선언적: @api({ guards: ["admin"] })처럼 간단하게 선언
  2. 재사용 가능: 여러 API에서 동일한 Guards 사용
  3. 테스트 용이: Guards를 독립적으로 테스트 가능
  4. 관심사 분리: 권한 로직과 비즈니스 로직 분리

Guards의 동작 흐름

Guard 타입

Sonamu는 세 가지 Guard 타입(user, admin, query)이 정의되어 있습니다. 이들은 타입 안전성을 위한 키이며, 실제 검증 로직은 sonamu.config.tsguardHandler에서 구현해야 합니다.

user Guard

user Guard는 로그인한 사용자만 접근할 수 있도록 합니다. 가장 기본적인 인증 Guard입니다.
언제 사용하나요?
  • 로그인이 필요한 모든 API
  • 사용자별 데이터를 다루는 API (내 프로필, 내 주문 등)
  • 콘텐츠 생성/수정/삭제

admin Guard

admin Guard는 관리자만 접근할 수 있도록 합니다. 민감한 관리 기능에 사용합니다.
언제 사용하나요?
  • 시스템 설정 변경
  • 모든 사용자 데이터 접근
  • 사용자 관리 (활성화/비활성화, 권한 변경)
  • 통계 및 분석 데이터
  • 민감한 비즈니스 로직

query Guard

query Guard는 쿼리 스트링 파라미터로 간단한 인증을 구현합니다. 주로 공개 API나 임시 링크에 사용합니다.
언제 사용하나요?
  • 이메일 링크로 전송되는 임시 다운로드 링크
  • 공유 가능한 공개 API
  • Webhook 콜백 (API 키 검증)
  • 단순한 인증이 필요한 경우
query Guard의 구체적인 구현은 프로젝트마다 다를 수 있습니다. API 키, 토큰, 서명 등 다양한 방식으로 확장 가능합니다.

여러 Guards 조합

하나의 API에 여러 Guards를 적용할 수 있습니다. 모든 Guards를 통과해야 API가 실행됩니다.

Guards 구현

Guards는 sonamu.config.tsguardHandler에서 구현합니다. Sonamu가 각 API 호출 시 자동으로 guardHandler를 실행합니다.

guardHandler 구현

커스텀 Guard 타입 추가

프로젝트에 특화된 Guard를 추가하려면 GuardKeys 인터페이스를 확장합니다.
이제 guardHandler에서 새로운 Guard를 구현합니다.

동적 검증이 필요한 경우

API 파라미터에 따라 동적으로 권한을 검증해야 하는 경우, guardHandler에서 api 파라미터를 활용할 수 있습니다.
주의: 복잡한 비즈니스 로직이나 데이터베이스 조회가 필요한 권한 검증은 Guards가 아닌 API 메서드 내부에서 처리하는 것이 좋습니다. Guards는 간단한 인증/권한 확인만 담당해야 합니다.

역할 기반 접근 제어 (RBAC)

더 복잡한 권한 시스템을 구현하려면 RBAC(Role-Based Access Control)를 사용합니다.

역할과 권한 정의

권한 기반 Guard 구현

RBAC 시스템을 Guard에 통합하려면 guardHandler에서 권한을 검증합니다.

권한 Guard 사용

리소스 기반 권한 제어

특정 리소스에 대한 소유권을 확인하는 패턴입니다.

Guards 테스트

Guards를 독립적으로 테스트할 수 있습니다.

주의사항

Guards 사용 시 주의사항: 1. Guards는 인증(Authentication)만 담당, 인가(Authorization)는 비즈니스 로직에서 처리 2. 민감한 데이터는 Guards 통과 후에도 추가 검증 필수 3. Guards 실패 시 403 Forbidden 반환 (401 Unauthorized 아님) 4. 여러 Guards 사용 시 순서 고려 (일반적인 것부터 구체적인 순서로) 5. Guards에서는 복잡한 비즈니스 로직 지양 (단순 권한 확인만) 6. 리소스 소유권 확인은 API 메서드 내부에서 처리

다음 단계

인증 설정

인증 시스템 구축

세션 관리

세션과 토큰 관리

Context

Context 자세히 알아보기

@api 데코레이터

API 데코레이터 옵션