💻 개발/프레임워크

(공식문서) NestJS 가드

foodev 2025. 2. 18. 15:09
728x90
가드는 @Injectable() 데코레이터로 주석이 달린 클래스로,CanActivate 인터페이스를 구현합니다.

 

 

관련된 링크: https://docs.nestjs.com/guards

 

 

 

🌠 목차
✅ 가드와 미들웨어 차이점
✅ 가드 구현 canActivation과 FirebaseTokenGuard
✅ 

 

가드와 미들웨어 차이점 


가드란? 

가드에는 단일 책임이 있습니다.

역할: 런타임에 존재하는 특정 조건(권한, 역할)에 따라 주어진 요청이 라우트 핸들러에 의해 처리될지 여부를 결정합니다.

주로 Controller에서 @AuthGuard, @TokenGuard, @AdminGuard로 사용됩니다.

 

Express에서는 middleware에 의해 처리되었습니다. 

미들웨어는 토큰 유효성 검사 및 요청 개체에 속성 첨부 등의 작업이 특정 경로 컨텍스트와 강하게 연결되지 않기 때문에 

인증에 적합한 선택입니다.

 

가드와 미들웨어 차이점 비교 

1. 실행시점

  • 가드: 라우트 핸들러 실행 여부를 결정하기 위해 실행됩니다.
  • 미들웨어: 라우트 핸들러 실행 전에 실행됩니다. 

2. 역할

  • 가드(경비원)
    • 특정 조건(권한, 역할, 인증)을 충족하는 경우에만 라우트 핸들러러를 실행 허용합니다.
    • 조건을 충존하지 못하면 예외를 발생시키거나 다른 응답을 반환합니다.
  • 미들웨어(문지기)
    • 요청 객체를 수정하거나 추가 정보를 추가합니다.
    • 응답 객체를 수정하거나 추가 정보를 추가합니다(timestamp등)
    • 다음 미들웨어 또는 라우트 핸들러로 요청을 전달합니다.
      • next()함수를 통해 진행

3. ExecutionContext

- ExecutionContext란 NestJS에서 요청 처리 과정에 대한 다양한 정보를 담고 있는 객체 

- 요청객체, 응답객체, URL, 메서드 등을 담고 있습니다. 

  • 가드
    • ExecutionContext인스턴스에 접근하여 다음에 실행될 핸들러에 대한 정보를 얻을 수 있습니다.
  • 미들웨어
    • ExcutionContext인스턴스에 접근할 수 있지만, 다음에 어떤 핸들러가 실행될지 알 수 없습니다.

요약

 

 

가드 구현 canActivation과 FirebaseTokenGuard


canActivation()함수를 구현해야 한다.

[canActivation.interface.d.ts] 

import { Observable } from 'rxjs';
import { ExecutionContext } from './execution-context.interface';
/**
 * Interface defining the `canActivate()` function that must be implemented
 * by a guard.  Return value indicates whether or not the current request is
 * allowed to proceed.  Return can be either synchronous (`boolean`)
 * or asynchronous (`Promise` or `Observable`).
 *
 * @see [Guards](https://docs.nestjs.com/guards)
 *
 * @publicApi
 */
export interface CanActivate {
    /**
     * @param context Current execution context. Provides access to details about
     * the current request pipeline.
     *
     * @returns Value indicating whether or not the current request is allowed to
     * proceed.
     */
    canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean>;
}

 

[firebaseTokenGuard.ts]

import { ExecutionContext, Injectable } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { AuthGuard } from '@nestjs/passport';

@Injectable()
export class FirebaseTokenGuard extends AuthGuard('firebase-token') {
  constructor(private reflector: Reflector) {
    super();
  }
  canActivate(context: ExecutionContext) {
    const isPublic = this.reflector.getAllAndOverride<boolean>('public', [
      context.getHandler(),
      context.getClass(),
    ]);
    if (isPublic) {
      return true;
    }
    return super.canActivate(context);
  }
}

ExecutionContext를 사용하여 요청 정보를 얻는 방법

@Injectable()
export class AuthGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
  const request = context.switchToHttp().getRequest(); // 요청 객체 가져오기
  const user = request.user; // 요청 객체에 담긴 유저 정보
  const handler = context.getHanlder() // 현재 실행중인 핸들러 정보 
  const classRef = ontext.getClass() // 현재 실행중인 컨트롤러 정보 
  }

 



 

 

 

글 잼나게 보셨으면 좋아요 눌러주고 가세요

관심받는 거 좋아합니다

 

728x90