NestJS의 가드(Guards)란?

Daehyeon Yun·2024년 8월 7일

NestJS 에서 가드(Guards) 는 클라이언트로부터 넘어온 요청(Request) 이 처리되기 전에 실행되어, 요청의 권한을 확인 하고 허용할지 여부 를 결정하는 것을 수행한다.

💡 가드(Guards) 의 특징

  • 인증 및 권한 부여 : 요청이 컨트롤러(Controller)라우트 핸들러(Route Handler) 로 전달되기 전에 사용자의 인증 상태나 권한을 검사한다.
  • 흐름 제어 : 요청을 허용하거나 거부 할 수 있으며, 필요한 경우 특정 요청을 거부(차단) 할 수 있다.

💡 가드(Guards) 사용법

🚩 가드(Guards) 정의하기

CanActivate라는 인터페이스를 구현한 뒤 가드를 정의한다.

// 요청을 보낸 사용자가 존재(권한)하는지 판별

// nestjs의 데코레이터, 인터페이스 호출
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
// RxJS에서 제공하는 옵저버 호출
import { Observable } from 'rxjs';

@Injectable() // 해당 데코레이터를 통해 이 클래스를 주입 가능한 서비스로 지정 (DI)
export class AuthGuard implements CanActivate{
	canActivate( // 요청이 처리되기 전 실행
		context: ExecutionContext, // ExecutionContext는 현재 실행 중인 요청에 대한 정보 제공
	): boolean | Promuse<boolean> | Observable<boolean>{ // canActivate는 셋 중 하나를 반환한다.
		const request = context.switchToHttp().getRequest(); // 현재 실행중인 요청 객체를 가져온다.
		const user = request.user; // 요청 객체에서 사용자 정보 호출
		return !!user; // 사용자가 존재하면 true, 존재하지 않는다면 false 반환
	}

🚩 가드(Guards) 적용하기

→ 위에서 정의한 AuthGuard 를 특정 라우트에 적용한다.

import { Controller, Get, UseGuards } from '@nestjs/common';

@Controller('dogs')
export class DogsController{
	@Get()
	@UseGuards(AuthGuard) // @UseGuards 데코레이터는 NestJS에서 가드(Guards)를 설정한다.
	findAll(): string{
		return `모든 강아지들을 불러왔습니다!`;
	}
}

🤔 모든 라우터에 가드(Guards) 를 적용하려면?

글로벌 가드(Global Guards) 를 적용하기 위해선 app.module.ts 에서 설정할 수 있다.

import { Module } from '@nestjs/common';
import { APP_GUARD } from '@nestjs/core'; // 가드 모듈 불러오기

@Module({
  providers: [
    {
      provide: APP_GUARD,
      useClass: AuthGuard, // 정의한 가드 적용
    },
  ],
})
export class AppModule {}

⭐ 요약!

NestJS 에서 가드(Guards) 는 요청이 처리되기 전에 실행되어 인증 및 권한 을 검사한다.

가드(Guards)인증 및 권한 부여 , 요청 흐름 제어 역할을 수행한다.

→ 사용법 : CanActivate 인터페이스를 구현하여 정의하고, 컨트롤러나 라우트에 useGuards 데코레이터로 적용하거나 글로벌 가드로 설정한다.

profile
열심히 살아야지

0개의 댓글