프로그래밍/Nest.js

Nest.js에서의 커스텀 가드: 보안과 비즈니스 로직의 최전선

shimdh 2025. 3. 24. 20:57
728x90

Nest.js는 현대 웹 애플리케이션 개발에 있어 강력한 프레임워크로 자리 잡고 있습니다. 그 중에서도 가드는 요청을 처리하기 전에 특정 조건을 검사하여 요청의 유효성을 판단하는 중요한 역할을 합니다. 이번 포스트에서는 Nest.js에서 커스텀 가드를 만드는 방법과 그 필요성에 대해 깊이 있게 살펴보겠습니다.

Meta description:

Nest.js에서 커스텀 가드를 활용하여 보안과 비즈니스 로직을 강화하는 방법을 알아보세요. 요청의 유효성을 검사하고, 애플리케이션의 보안을 높이는 방법을 소개합니다.

1. 커스텀 가드란?

커스텀 가드는 Nest.js의 CanActivate 인터페이스를 구현하여 작성됩니다. 이를 통해 개발자는 요청의 유효성을 검증하고, 특정 조건이 충족되지 않을 경우 요청을 차단할 수 있습니다. 커스텀 가드는 다음과 같은 장점을 제공합니다:

  • 보안성 강화: 특정 사용자만 접근할 수 있도록 제한하여 애플리케이션의 보안을 높입니다.
  • 비즈니스 로직 적용: 비즈니스 요구사항에 맞춘 접근 제어를 쉽게 구현할 수 있습니다.
  • 재사용성: 여러 컨트롤러나 라우트에서 동일한 규칙을 재사용할 수 있어 코드 중복을 줄이고 유지보수를 용이하게 합니다.

2. 커스텀 가드를 사용하는 이유

2.1 보안 강화

커스텀 가드를 사용하면 민감한 데이터에 접근할 수 있는 권한을 가진 사용자만 접근할 수 있도록 설정할 수 있습니다. 예를 들어, 관리자가 아닌 사용자가 특정 API 엔드포인트에 접근하지 못하도록 할 수 있습니다.

2.2 비즈니스 로직 적용

비즈니스 요구사항에 따라 특정 조건을 만족하는 사용자만 특정 기능을 사용할 수 있도록 제한할 수 있습니다. 이는 애플리케이션의 유연성을 높이는 데 기여합니다.

2.3 재사용성

여러 컨트롤러나 라우트에서 동일한 규칙을 재사용할 수 있어 코드 중복을 줄이고, 유지보수를 용이하게 할 수 있습니다. 이는 개발자의 생산성을 높이는 데 기여합니다.

3. 커스텀 가드 만들기

커스텀 가드를 만드는 과정은 다음과 같은 단계로 이루어집니다:

  1. 가드 클래스 생성: 새로운 가드 클래스를 생성하여 필요한 로직을 구현합니다.
  2. CanActivate 인터페이스 구현: CanActivate 인터페이스를 구현하여 요청이 허용될 조건을 정의합니다.
  3. 가드를 프로바이더로 등록: 생성한 가드를 Nest.js의 프로바이더로 등록하여 애플리케이션 전반에서 사용할 수 있도록 설정합니다.

예제: RolesGuard

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Reflector } from '@nestjs/core';

@Injectable()
export class RolesGuard implements CanActivate {
    constructor(private reflector: Reflector) {}

    canActivate(context: ExecutionContext): boolean {
        const roles = this.reflector.get<string[]>('roles', context.getHandler());
        if (!roles) {
            return true;
        }

        const request = context.switchToHttp().getRequest();
        const user = request.user;

        return user && user.roles && roles.some(role => user.roles.includes(role));
    }
}

위 예제에서는 RolesGuard라는 이름의 커스텀 가드를 정의했습니다. 이 가드는 사용자의 역할이 특정 핸들러에서 요구하는 역할 목록과 일치하는지를 확인하여 요청의 진행 여부를 결정합니다.

4. 메타데이터 설정하기

메타데이터는 데코레이터를 사용하여 설정할 수 있으며, 이를 통해 어떤 역할이 필요한지 명확히 지정할 수 있습니다:

import { SetMetadata } from '@nestjs/common';

export const Roles = (...roles: string[]) => SetMetadata('roles', roles);

컨트롤러에서 사용할 때는 다음과 같이 설정합니다:

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

    @Get()
    @Roles('admin')
    findAll() {
        // ...
    }
}

위 코드는 /cats 엔드포인트에 접근하려면 'admin' 역할이 필요하다는 것을 의미합니다. 이를 통해 애플리케이션의 보안성을 더욱 강화할 수 있습니다.

5. 결론

커스텀 가드는 Nest.js 애플리케이션 내에서 강력한 보안 및 비즈니스 로직 처리를 위한 필수 요소입니다. 다양한 상황에 맞춰 유연하게 조정 가능하며, 개발자는 자신의 필요에 맞게 간편하게 사용할 수 있습니다. 실제로 복잡한 애플리케이션에서는 다양한 권한 및 인증 시스템이 존재하므로, 이러한 고급 기능들을 활용하면 보다 안전하고 효율적인 API 서버를 구축할 수 있게 됩니다. 이를 통해 사용자에게 신뢰할 수 있는 서비스를 제공할 수 있습니다.

728x90