NestJS에서 인증 및 권한 부여(Authentication and Authorization)를 처리하기 위한 데코레이터와 인터페이스입니다.
CanActivate 인터페이스를 상속받고, CanActive 메서드를 구현해야 한다.CanActivate를 구현하여 요청을 처리하거나 차단.
ExecutionContext를 통해 요청과 메타데이터에 접근.
@UseGuards와 @SetMetadata를 조합하여 유연한 권한 부여 로직 구현 가능.
유연성: 요청 단계에서 인증과 권한 검사를 쉽게 처리.
재사용성: Guard는 여러 컨트롤러/핸들러에 재사용 가능.
테스트 가능성: Guard는 독립적으로 테스트 가능.
CanActivate 메소드의 리턴 값Promise<boolean> / Observable<boolean>: 비동기 작업 결과에 따라 요청 허용 여부 결정.interface CanActivate {
canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean>;
}
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으로 전환, 문자열의 경우 값의 유무
}
}
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
}
}

Client Request: 클라이언트에서 HTTP 요청이 시작됩니다.
Middleware: 요청이 들어오자마자 전처리 작업(예: 로깅, 인증 토큰 파싱 등)을 수행합니다.
모든 요청에서 동작한다.
Guards: 요청이 컨트롤러로 전달되기 전에 접근 허용 여부를 결정합니다.
특정 컨트롤러 / 핸들러에만 적용 가능하다.
전역 모듈에 providers로 지정하여 모든 요청에 대해 실행할 수도 있다.
Pipes: 요청 데이터를 검증(Validation)하고 변환(Transformation)합니다.
DTO를 사용하여 데이터 타입 확인 / 요청 데이터 가공
Interceptors (Pre-processing): 컨트롤러 실행 전에 데이터를 가공하거나 추가 로직을 실행합니다.
Controller: 요청을 처리하는 라우트 핸들러가 실행됩니다.
Service: 비즈니스 로직 및 데이터베이스 연동이 수행됩니다.
데이터베이스 조회, 외부 API 호출
Interceptors (Post-processing): 컨트롤러에서 반환된 데이터를 가공하거나 후처리 작업을 수행합니다.
Response: 최종적으로 클라이언트에게 응답이 반환됩니다.
https://velog.io/@emer/NestJS-요청-수명-주기Request-LifeCycle
https://velog.io/@haron/NestJS-Lifecycle-Events