가드(Guard)

NestJS로 들어오는 요청은 컨트롤러단에 도달하기 전에 가드를 거쳐가도록 되어 있다. pipe 랑 비슷하지만 가드는 특정 상황들(permissions, roles, ACLs)에 따라서 request 가 라우터에 handling 될지 말지를 결정한다. 일반적으로 authorization 구현에 많이 쓰이며 Guard는 모든 middleware 이후에 실행되고, interceptor와 pipe 이전에 실행된다.

 


 

canActivate 메서드

canActivate() 메서드는 가드의 핵심 로직을 구현하는 메서드이다. 해당 메서드는 executionContext 라는 파라미터를 받아서 요청의 context 정보를 알 수 있다. 

canActivate 메서드는 boolean 타입을 반환해야 하며, true 이면 요청이 허용되고, false 면 요청이 거부된다.

canActivate 메서드에 사용자의 권한이나 역할등을 확인하는 로직을 추가 할 수 있다. 

 


 

글로벌 가드 설정

X-API-KEY 를 발급해서 프론트에서 오는 요청에 X-API-KEY가 없는 경우 Guard에서 막도록 로직을 구현했다. X-API-KEY는 모든 라우터에서 검사해야 하기 때문에 전역가드로 설정해 뒀다.

가드 생성

import { BadRequestException, CanActivate, ExecutionContext, Injectable } from "@nestjs/common";
import { Observable } from "rxjs";

@Injectable()
export class JoyGuard implements CanActivate {
  canActivate(ctx: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {
    const req = ctx.switchToHttp().getRequest();
    if (req.headers["x-api-key"] !== process.env.X_API_KEY)
      throw new BadRequestException({ statusCode: 401, message: "unauthorized" });
    return true;
  }
}

위와 같이 가드를 만들고 헤더에 x-api-key 가 env 파일에 넣어둔 X-API-KEY 와 다른 경우 unauthorized 에러를 뱉게 했다. env 파일 설정은 여기를 보면 된다.

 


 

가드 추가

모든 라우터에서 해당 가드를 통과하게 글로벌 가드를 설정했다.

//main.ts
import { NestFactory } from "@nestjs/core";
import { AppModule } from "./app.module";
import { BadRequestException, ValidationPipe } from "@nestjs/common";
import * as cookieParser from "cookie-parser";
import { JoyGuard } from "./joy/joy.guard";
declare const module: any;

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  app.useGlobalGuards(new JoyGuard()); //가드 추가

  await app.listen(3000);
}
bootstrap();

 

 


 

요청 결과

X-API-KEY 가 다를 경우 아래와 같이 에러가 난다.

guard 를 통과하지 못할 경우 로직은 실행되지 않으며 불필요한 자원의 낭비를 막는다.

 

 

 

 

개인 기록용입니다. 만약 잘못된 부분이 있다면 댓글로 알려주신다면 감사하겠습니다!

'프레임워크\라이브러리 > Nest.js' 카테고리의 다른 글

[NestJS] JWT 모듈  (1) 2024.03.01
[NestJS] 구글 로그인 (1)/구글 OAuth 적용  (1) 2024.02.28
[NestJS] 커스텀 파이프  (0) 2024.02.20
[NestJS] 파이프  (1) 2024.02.18
[NestJS] 환경 변수  (0) 2024.02.16