아래 예시에서 AuthGuard는 요청 헤더에 토큰이 삽입되는 등의 방법으로 인증이 된 사용자를 가정한다. 그리고 request 객체에서 토큰을 추출하여 검증하고 해당 요청에 대한 권한이 있는지 확인하는 외부의 validateRequest() 함수를 이용해서 요청/응답 처리의 진행 여부를 결정한다.
// auth.guard.ts
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Observable } from 'rxjs';
@Injectable()
export class AuthGuard implements CanActivate {
canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
const request = context.switchToHttp().getRequest();
return validateRequest(request);
}
}
파이프와 예외 필터처럼 가드는 컨트롤러 수준, 라우팅 핸들러 메서드 수준, 또는 전역으로 등록할 수 있다. 또한 다른 것과 마찬가지로, new의 사용 여부는 선택이지만, new를 사용하지 않아야만 의존성 주입이 가능하다.
@Controller('cats')
@UseGuards(MyGuard)
export class CatsController {}
라우팅 핸들러 수준으로 등록
컨트롤러 클래스의 라우팅 핸들러 메서드에 @UseGuards() 데코레이터를 사용합니다. 하나 이상 지정할 수 있다.
전역으로 등록
앱 인스턴스에 useGlobalGuards()를 호출하여 등록한다. 이전 챕터에서 설명한대로 이 방법은 의존성 주입이 불가능하다.
const app = await NestFactory.create(AppModule);
app.useGlobalGuards(new MyGuard());
추가적인 이야기가 더 있지만 솔직히 무슨 내용인지 알기가 매우 어려워서 더 공부를 하고 진행할 필요가 있겠다.
참고: 네스트 공식문서