자바스크립트 기반 NestJS 애플리케이션의 로그인 인증 방법

개요

로그인 인증은 웹 애플리케이션의 중요한 요소 중 하나입니다. NestJS는 자바스크립트 기반의 프레임워크로서, 강력한 인증 기능을 제공합니다. 이 글에서는 NestJS를 사용하여 자바스크립트 기반 애플리케이션에서 로그인 인증을 구현하는 방법을 알아보겠습니다.

설치

NestJS에서 로그인 인증을 구현하기 위해 passportpassport-local이라는 패키지를 사용합니다. 먼저 패키지를 설치해야 합니다.

npm install passport passport-local

사용자 모델 생성

먼저, 사용자 모델을 생성해야 합니다. 예를 들어, User라는 모델을 생성해보겠습니다.

import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  username: string;

  @Column()
  password: string;
}

위의 코드에서는 typeorm 패키지를 사용하여 데이터베이스에 접근할 수 있도록 합니다.

인증 전략 구현

인증 전략은 사용자의 로그인 요청을 처리하는 방식을 정의합니다. passport-local 패키지를 사용하여 간단한 인증 전략을 구현해보겠습니다.

import { Injectable, UnauthorizedException } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { Strategy } from 'passport-local';
import { AuthService } from './auth.service';

@Injectable()
export class LocalStrategy extends PassportStrategy(Strategy) {
  constructor(private authService: AuthService) {
    super();
  }

  async validate(username: string, password: string): Promise<any> {
    const user = await this.authService.validateUser(username, password);
    if (!user) {
      throw new UnauthorizedException();
    }
    return user;
  }
}

위의 코드에서 validate 메서드에서는 authService를 사용하여 사용자를 유효성 검사합니다. 유효하지 않은 경우 UnauthorizedException을 던집니다.

AuthService 생성

authService는 사용자를 인증하고 토큰을 생성하는 역할을 합니다. 다음과 같이 AuthService를 생성해보겠습니다.

import { Injectable } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { UserService } from '../user/user.service';

@Injectable()
export class AuthService {
  constructor(
    private userService: UserService,
    private jwtService: JwtService,
  ) {}

  async validateUser(username: string, password: string): Promise<any> {
    const user = await this.userService.findByUsername(username);
    if (user && user.password === password) {
      return user;
    }
    return null;
  }

  async login(user: any) {
    const payload = { username: user.username, sub: user.userId };
    return {
      access_token: this.jwtService.sign(payload),
    };
  }
}

위의 코드에서 validateUser 메서드에서는 사용자의 유효성을 검사하고, login 메서드에서는 사용자의 토큰을 생성합니다.

로그인 컨트롤러 생성

마지막으로, 로그인 처리를 담당하는 컨트롤러를 생성해야 합니다.

import { Controller, Post, Request, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { AuthService } from './auth.service';

@Controller('auth')
export class AuthController {
  constructor(private authService: AuthService) {}

  @UseGuards(AuthGuard('local'))
  @Post('login')
  async login(@Request() req) {
    return this.authService.login(req.user);
  }
}

위의 코드에서 @UseGuards(AuthGuard('local'))local 전략의 인증 가드를 사용하도록 설정하는 부분입니다. @Post('login')/auth/login 엔드포인트를 정의하는 부분입니다.

이제 NestJS 기반의 로그인 인증 시스템을 구현한 것입니다. 필요에 따라 세부적인 기능을 추가하거나 커스터마이징할 수 있습니다.

결론

이 글에서는 자바스크립트 기반의 NestJS 애플리케이션에서 로그인 인증을 구현하는 방법을 알아보았습니다. 로그인 인증은 웹 애플리케이션에서 중요한 보안 요소이므로, NestJS의 강력한 인증 기능을 활용하여 안전하고 신뢰할 수 있는 로그인 시스템을 구축할 수 있습니다.

참고 자료