[NestJS] Guard란?

sm·2023년 7월 19일
2

udemy

목록 보기
9/12
post-custom-banner

https://docs.nestjs.com/guards

Guard vs. Middleware 비교

Guard

Guards는 요청을 처리하기 전에 요청을 검사하고 인증, 권한 부여 등의 로직을 적용하는 데 사용
주로 인증, 권한 부여, 입력 유효성 검사 등의 보안 및 인가 관련 작업에 사용된다.
CanActivate 인터페이스를 구현하여 작성되며, 요청 처리 전에 canActivate() 메서드가 호출된다.
CanActivate 인터페이스는 canActivate 메서드를 정의하며, 해당 메서드에서 true를 반환하면 요청이 계속 진행되고, false를 반환하면 요청이 차단된다.
여러 Guards가 함께 사용될 경우, 모든 Guards가 true를 반환해야 요청이 허용됨. 하나라도 false를 반환하면 요청이 거부된다.
요청이 허용되지 않을 경우 throw 문을 사용하여 예외를 발생시키거나, false를 반환.

guards/auth.guard.ts

사용자의 인증상태를 확인 -> 인증된 사용자에게만 요청 허용되도록 하기

import {
  CanActivate,
  ExecutionContext,
  HttpException,
  HttpStatus,
  Injectable,
} from '@nestjs/common';
import { ExpressRequest } from '../types/expressRequest.interface';

@Injectable()
export class AuthGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    const request = context.switchToHttp().getRequest<ExpressRequest>();

    if (request.user) {
      return true;
    }

    throw new HttpException('Not authorized', HttpStatus.UNAUTHORIZED);
  }
}

request.user를 확인하여 사용자가 인증되었는지를 검사한다. 사용자가 인증된 경우 true를 반환하여 요청을 허용하고, 인증되지 않은 경우 HttpException을 던져서 401 Unauthorized 에러를 반환한다.

@UseGuards() 데코레이터를 사용하여 특정 컨트롤러 또는 메서드에 AuthGuard를 적용할 수 있다!


Middleware

요청과 응답 사이에서 동작하여 요청을 변경하거나 특정 작업을 수행하는 데 사용
주로 요청에 대한 로깅, 데이터 변환, 헤더 수정 등과 같은 작업을 수행
@Injectable() 데코레이터로 만들어진 클래스로, NestMiddleware 인터페이스를 구현하여 사용.
NestMiddleware 인터페이스는 use 메서드를 정의하며, 해당 메서드에서 요청과 응답을 조작한다.
여러 개의 미들웨어를 설정하면 순차적으로 실행된다.
use() 메서드에서 등록된 순서대로 실행되며, next() 함수를 호출하여 다음 미들웨어로 넘어갈 수 있다.


Guard는 주로 인증과 권한 검사와 같이 요청의 접근 제어를 처리할 때. 예를 들어, 로그인이 필요한 엔드포인트에서 인증을 검사하고, 특정 권한이 필요한 경우에는 권한 검사를 수행하는 등의 작업에 활용.
Guard를 사용하면 컨트롤러나 핸들러의 코드에서 반복적인 인증 검사를 제거하여 코드의 재사용성과 유지 보수성을 향상시킬 수 있다.

미들웨어는 주로 전역적으로 또는 특정 경로에 적용하여 요청 전/후에 작업을 처리할 때 사용. 예를 들어, 요청과 응답에 대한 로깅, 헤더 수정, 데이터 변환 등의 작업을 처리할 때. 또한, 요청과 응답에 공통적인 데이터를 추가하거나 중간에 특정 작업을 수행하는 경우.

profile
📝 It's been waiting for you
post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

덕분에 좋은 정보 얻어갑니다, 감사합니다.

답글 달기