💻 개발/프레임워크
(공식문서) 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