728x90

- Guard란?

Guard는 권한등 조건을 확인한 후 요청이 라우트 핸들러로 전달될지 말지를 결정한다. 이 과정을 우린 흔히 인가 (Authorization)이라고 부르며, 요청을 보낸 사용자가 요청을 수행할 자격이 있는지 확인하게 된다.

 

Middleware에서도 Guard와 같은 기능을 수행 할 수 있지만 Middleware는 실행 문맥이 부족하다. 어느 한 Middleware가 실행된 다음에 어떤 기능이 실행될지 알수가 없다. 반면 Guard는ExcutionContext 객체에 어떤 기능이 다음으로 실행될지 정확히 알 수 있다.


- 가드 선언법

@Injectable()
export class RolesGuard implements CanActivate {
  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    return true;
  }
}

true: 가드 통과, false: 가드 통과 못함


- 가드 적용법

- UseGuard 데코레이터

@Controller('cats')
@UseGuards(RolesGuard)
export class CatsController {}

엔드포인트에 사용하고 싶으면 메서드 위에, 클래스 전체에 사용하고 싶으면 클래스 위에 적용

 

- 글로벌 1: useGlobalGuards

// main.ts

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

 

- 글로벌 2: 디펜던시 인젝션이 필요한 경우 = AppModule의 providers

// app.module.ts

@Module({
  providers: [
    {
      provide: APP_GUARD,
      useClass: RolesGuard,
    },
  ],
})

- 사용 예시

import { Reflector } from '@nestjs/core';

export const Public = Reflector.createDecorator();

예외처리 데코레이터 생성

@Public()
@Post('register')

가드 제외할 라우터에 데코레이터 적용

() 안에 string 넣으면 아래 코드의 isPublic에 반환됨

@Injectable()
export class AuthGuard implements CanActivate {
  constructor(private readonly reflector: Reflector) {}
  canActivate(context: ExecutionContext): boolean {
    const isPublic = this.reflector.get(Public, context.getHandler());
    if (isPublic) return true;

    const requset = context.switchToHttp().getRequest();

    if (!requset.user || requset.user.type !== 'access') {
      return false;
    }

    return true;
  }
}

가드 생성

@isPublic이 달린 경우 {}가 반환, 없으면 undefined가 반환

 

providers: [
    {
      provide: APP_GUARD,
      useClass: AuthGuard,
    },
  ],

app.modue.ts 에 적용

 

https://fastcampus.co.kr/classroom/239666

 

커리어 성장을 위한 최고의 실무교육 아카데미 | 패스트캠퍼스

성인 교육 서비스 기업, 패스트캠퍼스는 개인과 조직의 실질적인 '업(業)'의 성장을 돕고자 모든 종류의 교육 콘텐츠 서비스를 제공하는 대한민국 No. 1 교육 서비스 회사입니다.

fastcampus.co.kr

 

728x90

'코딩 > Nest.js' 카테고리의 다른 글

Pagination  (0) 2024.10.23
RBAC (Role Based Access Control)  (0) 2024.10.23
Middleware  (0) 2024.10.22
passport  (0) 2024.10.22
JWT  (0) 2024.10.22

+ Recent posts