가드(Guards)
NestJS의 가드(Guards)는 인증(authentication)과 권한 부여(authorization) 과정에서 주로 사용되는 기능입니다.
가드는 특정 조건 하에 요청을 처리할지 말지 결정하는 역할을 하며, NestJS의 실행 과정에서 라우트 핸들러가 실행되기 전에 동작합니다. 이를 통해 미리 정의된 조건에 따라 요청에 대한 접근을 허용하거나 거부할 수 있어 가드는 AOP(Aspect-Oriented Programming)의 개념을 활용하여 애플리케이션의 보안 관련 로직을 관리하는 데 매우 유용하죠.
그래서 가드는 보통 아래와 같은 때에 주로 사용합니다.
- 사용자가 요청을 수행할 권한이 있는지 확인할 때
- 특정 역할(role)을 가진 사용자만 특정 API 엔드포인트에 접근할 수 있도록 제한할 때
- 사용자의 인증 상태(로그인 여부)를 검증할 때
이 부분을 종합해볼 때 사용자가 특정 API 엔드포인트에 접근하기 전에 인증(로그인) 상태를 확인하고, 필요한 권한을 가지고 있는지 검증하거나 어떤 권한을 부여하려 할 때 사용한다라는 것을 알 수 있어요.
가드의 장점
애플리케이션의 보안을 강화하기 위해, 미리 정의된 권한 검증 로직을 통해 민감한 정보나 기능에 대한 접근을 제어할 수 있고, 인증과 권한 부여 로직을 컨트롤러나 서비스 로직에서 분리하여, 애플리케이션의 구조를 더 깔끔하고 관리하기 쉽게 만들 수 있어요.
보안을 관리하게 용이하게 만들었죠.
그럼 이제 가드를 실제 코드에서 어떻게 사용하는 지 알아볼까요?
가드 사용 예시
역할 기반 접근 제어를 위한 가드 예시
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Observable } from 'rxjs';
@Injectable()
export class RolesGuard implements CanActivate {
canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
const request = context.switchToHttp().getRequest();
const user = request.user;
return user && user.roles.some(role => role === 'admin');
}
}
이 예시에서 RolesGuard는 요청을 보낸 사용자가 'admin' 역할을 가지고 있는지 확인하는데 사용자가 'admin' 역할을 가지고 있다면 요청에 대한 접근을 허용하고, 그렇지 않다면 접근을 거부하는 형태의 예시에요.
JWT 인증 가드 예시
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Observable } from 'rxjs';
import { JwtService } from '@nestjs/jwt';
@Injectable()
export class JwtAuthGuard implements CanActivate {
constructor(private jwtService: JwtService) {}
canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
const request = context.switchToHttp().getRequest();
try {
const authHeader = request.headers.authorization;
const bearerToken = authHeader.split(' ')[1];
const decoded = this.jwtService.verify(bearerToken);
// 토큰 유효성 검증 로직, 예를 들어, 디코드된 토큰에서 사용자 정보를 추출하고 검증할 수 있습니다.
return Boolean(decoded);
} catch (error) {
return false; // 토큰 검증 실패 시 접근 거부
}
}
}
이 가드는 들어오는 요청의 헤더에서 JWT를 추출하고, 해당 토큰이 유효한지 검증하는 예시인데 유효한 토큰인 경우 요청을 계속 진행하고, 그렇지 않은 경우 요청을 거부하는 형태에요.
이 가드를 사용하여 API 엔드포인트에 보안을 강화할 수 있어 유효한 JWT를 제공하는 인증된 사용자만이 해당 엔드포인트에 접근할 수 있도록 할 수 있게 만들 수 있습니다.
가드 사용 시 주의할 점
성능 고려하기
가드 내에서 복잡한 로직을 수행하거나 외부 시스템과의 통신을 필요로 하는 경우, 요청 처리 시간에 영향을 줄 수 있기 때문에 가드 로직을 최적화하고 필요한 경우 캐싱 등의 기법을 사용하여 성능 저하를 최소화해야 합니다.
유연성 유지
가드를 너무 엄격하게 구현하면 특정 사용자나 역할에 대한 접근 제어가 과도하게 제한될 수 있기 때문에 애플리케이션의 요구 사항과 보안 정책에 균형을 맞추어 유연성을 유지하는 것이 중요합니다.
오늘은 NestJS의 가드(Guards)에 대해 살펴보았습니다. NestJS의 가드(Guards)는 애플리케이션의 보안을 강화하는 데 필수적인 요소입니다.
위의 예제들을 통해 가드를 통해 개발자는 특정 조건, 특히 사용자의 인증 상태나 권한을 기반으로 요청에 대한 접근을 허용하거나 거부하게 구현하여 애플리케이션 내 민감한 정보와 기능을 보호하는 데 중요한 역할을 한다는 것을 알 수 있었습니다.
NestJS를 사용하는 개발자라면, 가드를 적극적으로 활용하여 보다 안전하고 관리하기 쉬운 애플리케이션을 구축하는 것을 고려해보시는 것을 추천드립니다.
'프로그래밍(Basic) > NestJS' 카테고리의 다른 글
[바미] Nest - 파이프(Pipes) (0) | 2024.03.08 |
---|---|
[바미] NestJS - 예외 필터(Exception Filters) (0) | 2024.03.07 |
[바미] NestJS - 인터셉터(Interceptors) (0) | 2024.03.05 |
[바미] NestJS - 데코레이터(Custom decorators) (0) | 2024.03.02 |
[바미] NestJS를 사용하여 REST API 구현하기 (0) | 2024.03.01 |