프로그래밍/Nest.js

Nest.js에서의 인증 및 권한 가드: 보안의 기초

shimdh 2025. 3. 18. 10:18
728x90

Nest.js는 현대적인 웹 애플리케이션을 구축하기 위한 강력한 프레임워크로, 그 중에서도 요청 처리 파이프라인의 중요한 구성 요소인 가드는 애플리케이션의 보안을 강화하는 데 필수적인 역할을 합니다. 이번 포스트에서는 인증 및 권한 가드의 개념, 필요성, 구현 방법에 대해 자세히 알아보겠습니다.

인증 및 권한 가드란?

1. 인증 가드

인증 가드는 사용자가 시스템에 접근할 수 있는지를 확인하는 역할을 합니다. 사용자가 로그인했는지 여부를 판단하여 접근 권한을 부여하며, 이를 통해 시스템의 안전성을 높입니다. 예를 들어, 사용자가 로그인하지 않은 상태에서 특정 페이지에 접근하려고 할 경우, 인증 가드는 이를 차단합니다.

2. 권한 가드

권한 가드는 인증된 사용자에게 어떤 자원이나 기능에 대한 접근 권한이 있는지를 결정합니다. 예를 들어, 관리자는 모든 데이터에 접근할 수 있지만 일반 사용자에게는 제한된 데이터만 보여줍니다. 이를 통해 각 사용자에게 적절한 권한을 부여함으로써 데이터의 무단 접근을 방지할 수 있습니다.

가드를 사용하는 이유

  1. 보안 강화

    • 애플리케이션의 각 엔드포인트에 대해 적절한 보안을 적용함으로써 민감한 정보나 기능이 불법적으로 접근되는 것을 방지합니다. 이를 통해 데이터 유출이나 해킹과 같은 보안 위협으로부터 애플리케이션을 보호할 수 있습니다.
  2. 코드 재사용성

    • 동일한 로직을 여러 곳에서 사용할 수 있어 코드 중복을 줄일 수 있습니다. 가드를 통해 인증 및 권한 검사를 중앙 집중식으로 관리함으로써 코드의 일관성을 유지할 수 있습니다.
  3. 유지보수 용이성

    • 중앙 집중식으로 인증과 권한 관리를 하므로 코드 변경 시 유지보수가 간편해집니다. 가드의 변경 사항이 모든 관련 부분에 자동으로 적용되므로, 개발자는 보다 효율적으로 코드를 관리할 수 있습니다.

구현 방법

Nest.js에서는 CanActivate 인터페이스를 구현하여 커스텀 가드를 생성할 수 있습니다. 기본적인 구조는 다음과 같습니다:

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

@Injectable()
export class AuthGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    const request = context.switchToHttp().getRequest();
    // 여기에 인증 로직 추가 (예: JWT 토큰 검증)
    return Boolean(request.headers.authorization);
  }
}

위의 예시에서는 HTTP 요청 헤더에 authorization 필드가 존재하는지를 체크하여 true 또는 false 값을 반환합니다. 이 과정에서 인증 로직을 추가하여 보다 정교한 검증을 수행할 수 있습니다.

모듈 내에서 가드 적용하기

가드를 특정 라우트나 컨트롤러에 적용하려면 @UseGuards() 데코레이터를 사용할 수 있습니다:

import { Controller, Get, UseGuards } from '@nestjs/common';
import { AuthGuard } from './auth.guard';

@Controller('users')
export class UsersController {

  @Get()
  @UseGuards(AuthGuard)
  findAll() {
    return "모든 사용자 정보를 가져옵니다.";
  }
}

위 코드는 /users 경로로 오는 GET 요청은 반드시 AuthGuard를 통과해야만 호출될 수 있도록 설정하고 있습니다. 이를 통해 인증되지 않은 사용자의 접근을 효과적으로 차단할 수 있습니다.

커스텀 권한 가드 구현하기

커스텀 권한 검사를 위한 또 다른 예시는 아래와 같습니다:

@Injectable()
export class RolesGuard implements CanActivate {

  constructor(private readonly reflector: Reflector) {}

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

    const request = context.switchToHttp().getRequest();
    const user = request.user; // 이 부분은 미들웨어에서 설정된 유저 정보입니다.

    return user && requiredRoles.includes(user.role);
  }
}

위 예제에서는 메타데이터(roles)를 통해 필요한 역할(role)을 검사하고 이를 기반으로 액세스를 허용 또는 거부합니다. 이로 인해 애플리케이션의 권한 관리가 더욱 세밀해지고, 다양한 사용자 요구에 맞춘 접근 제어가 가능해집니다.

결론

가드는 Nest.js 애플리케이션의 보안 측면에서 매우 중요한 요소입니다. 인증 및 권한 관리를 통해 안전하게 데이터를 보호하고 비즈니스 로직을 효율적으로 처리할 수 있게 해줍니다. 위의 설명과 실습 예제를 바탕으로 자신의 프로젝트에서도 다양한 종류의 가드를 활용해 보세요! 이를 통해 애플리케이션의 보안을 한층 더 강화하고, 사용자 경험을 개선할 수 있을 것입니다.

728x90