가드 실행 순서
UseGuards1. AuthGuard('jwt')
JWT를 검증하고 `JwtStrategy.validate()`의 반환값을 `req.user`에 넣는다.
2. RolesGuard
이미 채워진 `req.user.roles`와 라우트의 `@Roles()` 조건을 비교한다.
`@Roles()`가 요구 역할을 메타데이터로 남기고, `RolesGuard`가 인증된 사용자의 역할과 비교해 요청을 통과시키거나 403으로 차단한다.
JWT를 검증하고 `JwtStrategy.validate()`의 반환값을 `req.user`에 넣는다.
이미 채워진 `req.user.roles`와 라우트의 `@Roles()` 조건을 비교한다.
`context.getHandler()`가 먼저 조회되어 핸들러의 세부 정책이 우선한다.
메서드에 값이 없을 때 `context.getClass()`의 기본 정책을 사용한다.
`getAllAndOverride(ROLES_KEY, [handler, class])`는 앞쪽 값이 있으면 뒤쪽 값을 덮어쓰는 방식으로 필요한 역할을 결정한다.
라우트가 요구하는 역할 배열을 `ROLES_KEY`에 저장한다.
`getAllAndOverride`로 메서드 우선, 클래스 fallback 순서로 읽는다.
JWT 인증이 끝난 뒤 요청 객체에서 사용자 역할을 꺼낸다.
요구 역할 중 하나라도 사용자 역할에 있으면 `true`가 된다.
`true`면 핸들러로 진행하고, 아니면 Nest가 403 응답을 반환한다.
`requiredRoles`가 없거나, 사용자 역할이 요구 역할 중 하나와 일치한다.
인증은 되었지만 `RolesGuard`의 역할 비교를 통과하지 못했다.