본문 바로가기
  • optimuslee
Nestjs

[Nestjs]7-1. Guard 기본적인 구현 방법

by OptimusLee 2022. 6. 25.
728x90
반응형

안녕하세요~!! 오늘은 저번 시간에 알아본 가드에 대해서 직접 구현해보는 시간을 갖도록 하겠습니다. 

 

 

 

🥊Authorization guard

 

사용자 인증은 가드의 예시 중 가장 대표적인 예시입니다. 우리가 구현할  AuthGuard는 사용자의 헤더에 특정 토큰이 제대로 들어있는 지 확인하는 것입니다. 

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);
  }
}

 

Guard는 canActivate() 함수를 구현해야 합니다. 그리고 해당 함수는 true 혹은 false 값을 반환합니다. 물론 이는 동기 혹은 비동기식으로 구현할 수 있습니다. context.switchToHttp().getRequest()를 통해 request를 전달받고 전달받은 요청이 타당한 요청인지 확인하는 작업을 validateRequest()를 통해 진행하면 됩니다. validateRequest()는 다른 함수로 커스텀해서 사용하면 됩니다. 만약 요청이 타당해서 true 값을 반환하면 다음 메소드가 실행되며 그렇지 않으면 false를 반환해서 요청을 거부합니다. 

 

 

 

🥊Execution context

 

canActivate() 함수는 하나의 argument를 갖습니다. 바로 ExecutionContext 인스턴스입니다. ExecutionContext는 ArgumentsHost를 상속합니다.

export interface ExecutionContext extends ArgumentsHost {
  getClass<T = any>(): Type<T>;
  getHandler(): Function;
}

ArgumentsHost, ExecutionContext를 상속함으로써, 현재 실행 프로세스에 대한 추가적인 세부 사항을 제공하는 몇가지 새로운 helper method를 추가합니다. 이러한 세부 정보는 광범위한 컨트롤러, methods, execution contexts로부터 작동할 수 있는 generic guards를 구축하는데 도움이 될 수 있습니다. getHandler()메소드는 호출될 핸들러에 대한 참조를 리턴합니다. getClass()메소드는 이 특정 핸들러가 속하는 Controller 클래스의 유형을 리턴합니다. 

 

 

🥊Binding guard

 

가드는 범위를 설정해서 적용을 시킬 수 있습니다. 범위는 크게 controller 범위, method 범위와 global 범위로 나뉠 수 있습니다. controller 혹은 method 범위에서 가드를 적용시킬 때는 방법이 동일합니다. @UseGuards() 데코레이터를 사용하여 작성하면 됩니다. 예시는 아래와 같습니다. 

 

✨controller 범위 

import {UseGuards} from "@nestjs/common"
import AuthGuard from "../auth.guard.ts"//AuthGuard의 위치

@Controller('cats')
@UseGuards(AuthGuard)// or @UseGuards(new AuthGuard())
export class CatsController {}

 

method 범위

import {UseGuards} from "@nestjs/common"
import AuthGuard from "../auth.guard.ts"//AuthGuard의 위치

@Controller('cats')
export class CatsController {

@UseGuards(AuthGuard)// or @UseGuards(new AuthGuard())
@Get("test")
async getCats{

	return "cats"

}

}

 

global 범위

const app = await NestFactory.create(AppModule);
app.useGlobalGuards(new RolesGuard());

 

or

 

// app.module.ts
import { Module } from '@nestjs/common';
import { APP_GUARD } from '@nestjs/core';

@Module({
  providers: [
    {
      provide: APP_GUARD,
      useClass: AuthGuard,
    },
  ],
})
export class AppModule {}

 

이렇게 오늘은 가드를 구현하는 기본적인 방법에 대해 알아보았습니다. 생각보다 어렵지 않죠?? ㅎ 다음 시간에는 오늘 배운 내용들을 종합한 다음에 변형해서 우리만의 가드를 만들어 볼 생각입니다. 그럼~~

 

728x90
반응형