NestJs 스터디(7)

연꽃·2022년 2월 28일
0

NestJs

목록 보기
7/7
post-thumbnail

가드(Guards)

🏀 가드란?

  • 가드는 주어진 요청이 라우팅 핸들러에게 전달될지 말지 여부를 결정하는 단일 책임을 갖는다.
  • 해당 여부는 런타임에 권한, 역할, ACL 등의 다양한 근거로 결정될 수 있고 이런 것을 인가(authorization)라고도 한다.
  • 인가(Authorization)는 인증을 통과한 유저가 요청한 기능을 사용할 권한이 있는지를 판별하는 것을 말한다.
  • 즉, 가드를 이용하여 인가를 구현하기에 적합하다는 이야기이다.

🏀 인가 가드

아래 예시에서 AuthGuard는 요청 헤더에 토큰이 삽입되는 등의 방법으로 인증이 된 사용자를 가정한다. 그리고 request 객체에서 토큰을 추출하여 검증하고 해당 요청에 대한 권한이 있는지 확인하는 외부의 validateRequest() 함수를 이용해서 요청/응답 처리의 진행 여부를 결정한다.

// auth.guard.ts

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

@Injectable()
export class AuthGuard implements CanActivate {
  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    const request = context.switchToHttp().getRequest();
    return validateRequest(request);
  }
}

🏀 가드 등록

파이프와 예외 필터처럼 가드는 컨트롤러 수준, 라우팅 핸들러 메서드 수준, 또는 전역으로 등록할 수 있다. 또한 다른 것과 마찬가지로, new의 사용 여부는 선택이지만, new를 사용하지 않아야만 의존성 주입이 가능하다.

  • 컨트롤러 수준으로 등록
@Controller('cats')
@UseGuards(MyGuard)
export class CatsController {}
  • 라우팅 핸들러 수준으로 등록
    컨트롤러 클래스의 라우팅 핸들러 메서드에 @UseGuards() 데코레이터를 사용합니다. 하나 이상 지정할 수 있다.

  • 전역으로 등록
    앱 인스턴스에 useGlobalGuards()를 호출하여 등록한다. 이전 챕터에서 설명한대로 이 방법은 의존성 주입이 불가능하다.

const app = await NestFactory.create(AppModule);
app.useGlobalGuards(new MyGuard());

추가적인 이야기가 더 있지만 솔직히 무슨 내용인지 알기가 매우 어려워서 더 공부를 하고 진행할 필요가 있겠다.

참고: 네스트 공식문서

profile
우물에서 자라나는 중

0개의 댓글