[Nest.js] @Guards

ayboori·2024년 12월 4일

Nest.js

목록 보기
11/11

Guards

NestJS에서 인증 및 권한 부여(Authentication and Authorization)를 처리하기 위한 데코레이터와 인터페이스입니다.

  • Guard는 특정 요청이 컨트롤러나 라우트 핸들러에 접근하기 전에 실행되며, 요청이 승인될지 여부를 결정합니다.
  • CanActivate 인터페이스를 상속받고, CanActive 메서드를 구현해야 한다.

CanActivate를 구현하여 요청을 처리하거나 차단.
ExecutionContext를 통해 요청과 메타데이터에 접근.
@UseGuards와 @SetMetadata를 조합하여 유연한 권한 부여 로직 구현 가능.

장점

유연성: 요청 단계에서 인증과 권한 검사를 쉽게 처리.
재사용성: Guard는 여러 컨트롤러/핸들러에 재사용 가능.
테스트 가능성: Guard는 독립적으로 테스트 가능.

인증 / 인가

  • 인증(Authentication): 사용자가 누구인지 확인 (JWT 토큰 검증)
  • 인가(Authorization): 사용자가 특정 리소스에 접근할 권한이 있는지 확인 (사용자 Role 체크)

CanActive

  • CanActivate 메소드의 리턴 값
    true: 요청을 허용.
    false: 요청을 거부.
    Promise<boolean> / Observable<boolean>: 비동기 작업 결과에 따라 요청 허용 여부 결정.
  • CanActivate 인터페이스
interface CanActivate {
  canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean>; 
}

Guard 구현

토큰 검증

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';

@Injectable()
export class AuthGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    const request = context.switchToHttp().getRequest();
    const token = request.headers['authorization'];
    return !!token; // 토큰이 있으면 true 반환
    // !! : 어떤 값을 강제로 boolean으로 전환, 문자열의 경우 값의 유무
  }
}
  • 적용 1
import { Controller, Get, UseGuards } from '@nestjs/common';

@Controller('example')
export class ExampleController {
  @UseGuards(AuthGuard) // 위에서 작성한 로직으로 적용
  @Get()
  findAll() {
    return 'This route is protected!';
  }
}

권한 확인

@Injectable()
export class RolesGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    const request = context.switchToHttp().getRequest();
    const user = request.user; // 요청에 포함된 사용자 정보
    return user && user.role === 'admin'; // 관리자인 경우 true
  }
}

요청 처리 라이프사이클

  1. Client Request: 클라이언트에서 HTTP 요청이 시작됩니다.

  2. Middleware: 요청이 들어오자마자 전처리 작업(예: 로깅, 인증 토큰 파싱 등)을 수행합니다.

    모든 요청에서 동작한다.

  3. Guards: 요청이 컨트롤러로 전달되기 전에 접근 허용 여부를 결정합니다.

    특정 컨트롤러 / 핸들러에만 적용 가능하다.
    전역 모듈에 providers로 지정하여 모든 요청에 대해 실행할 수도 있다.

  4. Pipes: 요청 데이터를 검증(Validation)하고 변환(Transformation)합니다.

    DTO를 사용하여 데이터 타입 확인 / 요청 데이터 가공

  5. Interceptors (Pre-processing): 컨트롤러 실행 전에 데이터를 가공하거나 추가 로직을 실행합니다.

  6. Controller: 요청을 처리하는 라우트 핸들러가 실행됩니다.

  • 비즈니스 로직 실행
  1. Service: 비즈니스 로직 및 데이터베이스 연동이 수행됩니다.

    데이터베이스 조회, 외부 API 호출

  2. Interceptors (Post-processing): 컨트롤러에서 반환된 데이터를 가공하거나 후처리 작업을 수행합니다.

  3. Response: 최종적으로 클라이언트에게 응답이 반환됩니다.


https://velog.io/@emer/NestJS-요청-수명-주기Request-LifeCycle
https://velog.io/@haron/NestJS-Lifecycle-Events

profile
프로 개발자가 되기 위해 뚜벅뚜벅.. 뚜벅초

0개의 댓글