(공식문서) NestJS 가드

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
반응형
저작자표시 비영리 변경금지 (새창열림)

'💻 개발 > 프레임워크' 카테고리의 다른 글

(공식문서) NestJS 인터셉터  (0) 2025.02.18
(공식문서) NestJS Pipes와 queryString, Body가 데이터 처리하는 방법  (1) 2025.02.18
(공식문서) NestJS Exception filters  (0) 2025.02.12
[Cursor 페이지네이션] nestJS + Prisma - cursor 페이지네이션 방식 (성능 최적화, 직접 cursor 구현)  (1) 2024.03.31
[Spring][JPA] JPA + S3 + DB 사용해서 파일 업로드 하기  (0) 2023.02.01
'💻 개발/프레임워크' 카테고리의 다른 글
  • (공식문서) NestJS 인터셉터
  • (공식문서) NestJS Pipes와 queryString, Body가 데이터 처리하는 방법
  • (공식문서) NestJS Exception filters
  • [Cursor 페이지네이션] nestJS + Prisma - cursor 페이지네이션 방식 (성능 최적화, 직접 cursor 구현)
foodev
foodev
이것저것 개발과 이것저것 리뷰 합니다.
    반응형
    250x250
  • foodev
    개발 개맛집
    foodev
  • 전체
    오늘
    어제
    • 분류 전체보기 (109)
      • 🌟🙇🏻‍♂️ 꼭 읽어봤으면 하는 글 (4)
      • 💻 개발 (72)
        • 설정 및 세팅 (4)
        • DB&서버&네트워크&암호 (11)
        • React (0)
        • JPA, Querydsl (13)
        • 알고리즘 (7)
        • 언어 (15)
        • 프레임워크 (12)
        • HTML, CSS (10)
      • ✍🏻 (33)
        • 회고록 (16)
        • 독서록 (7)
        • 일지록 (9)
        • 세미나 (1)
      • 💡 리뷰 (0)
        • 제품리뷰 (0)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    db 날림
    스냅샷과히스토리성 차이
    db 날린 썰
    di의존성
    githubaction 라벨 ci/cd
    azure ci/cd
    typedi 동작원리
    typedi란
    JPA
    QueryDSL
    토이프로젝트개발일지
    해피해킹 꿀팁
    해피해킹 커스텀
    해피해킹 키매핑
    스냅샷방식
    di동작원리
    스냅샷과로그성
    스냅샷과 히스토리
    nestjs pipe
    di란
    nestjs pipe body
    서이추
    validation failed (numeric string is expected)
    githubaction 라벨 배포
    창업패키지후기
    개발썰
    해피해킹 방향키
    디비스냅샷
    해피해킹 카라비너
    db 초기화
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
foodev
(공식문서) NestJS 가드
상단으로

티스토리툴바