RBAC Guard Flow

RBAC 권한 판단 흐름

`@Roles()`가 요구 역할을 메타데이터로 남기고, `RolesGuard`가 인증된 사용자의 역할과 비교해 요청을 통과시키거나 403으로 차단한다.

가드 실행 순서

UseGuards

1. AuthGuard('jwt')

JWT를 검증하고 `JwtStrategy.validate()`의 반환값을 `req.user`에 넣는다.

2. RolesGuard

이미 채워진 `req.user.roles`와 라우트의 `@Roles()` 조건을 비교한다.

메타데이터 우선순위

Reflector

메서드 @Roles

`context.getHandler()`가 먼저 조회되어 핸들러의 세부 정책이 우선한다.

클래스 @Roles

메서드에 값이 없을 때 `context.getClass()`의 기본 정책을 사용한다.

`getAllAndOverride(ROLES_KEY, [handler, class])`는 앞쪽 값이 있으면 뒤쪽 값을 덮어쓰는 방식으로 필요한 역할을 결정한다.

권한 판단 단계

allow or 403
@Roles 메타데이터 Reflector getAllAndOverride req.user.roles requiredRoles.some allow / 403
01

@Roles 메타데이터

라우트가 요구하는 역할 배열을 `ROLES_KEY`에 저장한다.

02

Reflector 조회

`getAllAndOverride`로 메서드 우선, 클래스 fallback 순서로 읽는다.

03

req.user.roles

JWT 인증이 끝난 뒤 요청 객체에서 사용자 역할을 꺼낸다.

04

requiredRoles.some

요구 역할 중 하나라도 사용자 역할에 있으면 `true`가 된다.

05

allow / 403

`true`면 핸들러로 진행하고, 아니면 Nest가 403 응답을 반환한다.

허용

`requiredRoles`가 없거나, 사용자 역할이 요구 역할 중 하나와 일치한다.

403 Forbidden

인증은 되었지만 `RolesGuard`의 역할 비교를 통과하지 못했다.