Untitled

단일 책임을 가짐

런타임에 존재하는 특정 조건(ex : 권한(permissions), 역할(roles), ACL 등)에 따라 지정된 요청을 라우터 핸들러에 의해 처리할지 여부를 결정

→ 종종 승인(authorization)이라고 함

승인과 인증(authentication)은 일반적으로 기존 express에서 middleware에 의해 처리됨

→ 그러나 미들웨어는 본직적으로 멍청함

→ next()뒤에 어떤 핸들러가 실행될지 알 수 없음

가드가 위의 단점을 보완함

Guards는 모든 middleware의 다음에 실행되고, interceptor나 pipe이전에 실행

AuthGuard

토큰을 추출한 후 확인할 것이고(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-based authentication

특정 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;
  }
}

Binding Guards

Pipe나 Exception Filter처럼, guard도 controller-scoped, method-scoped, global-scoped가 될 수 있음

→ @UseGuards() 데코레이터로 적용