- nestjs 공식문서 : https://docs.nestjs.com/guards#authorization-guard
개요

HTTP request를 처리하기 전에, 요청이 들어오면 사전에 적합한 요청인지 검증 및 필터링 한 후, 통과한 요청에 한해서만 handling 하도록 하고싶을 경우
Guard
를 이용하면 된다.Guard 클래스 작성

가드용 클래스는
CanActivate
라는 인터페이스
를 구현하면 된다.canActivate()
라는 메소드를 정의해야 하고, 이 함수의 반환값은 가드를 통과했는지 여부를 의미한다.
CanActive 인터페이스를 살펴보면,
canActivate()
메소드는 graphql context
가 인자로 전달되는 것을 볼 수 있다. 즉, context 값을 활용하여 가드 메소드를 정의할 수 있다는 의미다.import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common'; import { GqlExecutionContext } from '@nestjs/graphql'; @Injectable() export class AuthGuard implements CanActivate { canActivate(context: ExecutionContext) { const gqlContext = GqlExecutionContext.create(context).getContext(); const user = gqlContext['user']; if (!user) { return false; } return true; } }
context에 user 정보가 설정되지 않았다면 guard false로 간주하도록 간단하게 Guard Class 코드를 작성하였다.
graphql resolver에서 context를 활용하고자 할 경우,
ExecutionContext
를 GqlExecutionContext
로 변환 후 사용해야 한다.NestJS에서 Guard 연동
각각 용도에 맞는 Guard가 필요할 경우 아래와 같은 방식으로 Guard를 연동하면 된다.
i.g.) 고객, 배달원, 사장 등 role based guard가 필요할 경우 role 별로 guard를 작성하여 각각 개별로 목적에 맞는 Guard를 연동시키면 된다.

NestJs
에서는 작성한 graphql resolver에 @UseGuards()
데코레이터를 명시하여 가드 클래스를 연동시킬 수 있다.
canActivate()
메소드에서 false
를 반환할 경우 Guard를 통과하지 못한 것이며, 이 경우 더 이상 처리를 이어가지 않는다.“Forbidden resource”
에러를 볼 수 있고, 에러발생 위치는 canActivateFn
임을 확인할 수 있다.