단일 책임을 가짐
런타임에 존재하는 특정 조건(ex : 권한(permissions), 역할(roles), ACL 등)에 따라 지정된 요청을 라우터 핸들러에 의해 처리할지 여부를 결정
→ 종종 승인(authorization)이라고 함
승인과 인증(authentication)은 일반적으로 기존 express에서 middleware에 의해 처리됨
→ 그러나 미들웨어는 본직적으로 멍청함
→ next()뒤에 어떤 핸들러가 실행될지 알 수 없음
가드가 위의 단점을 보완함
Guards는 모든 middleware의 다음에 실행되고, interceptor나 pipe이전에 실행
토큰을 추출한 후 확인할 것이고(verify), 추출한 정보로부터 해당 request가 실행될 수 있을지 없을지 판단
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);
}
}
특정 role을 가지고 있는 유저만 허락하는 guard
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Observable } from 'rxjs';
@Injectable()
export class RolesGuard implements CanActivate {
canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
return true;
}
}
Pipe나 Exception Filter처럼, guard도 controller-scoped, method-scoped, global-scoped가 될 수 있음
→ @UseGuards() 데코레이터로 적용