개요
로그인 인증은 웹 애플리케이션의 중요한 요소 중 하나입니다. NestJS는 자바스크립트 기반의 프레임워크로서, 강력한 인증 기능을 제공합니다. 이 글에서는 NestJS를 사용하여 자바스크립트 기반 애플리케이션에서 로그인 인증을 구현하는 방법을 알아보겠습니다.
설치
NestJS에서 로그인 인증을 구현하기 위해 passport
와 passport-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의 강력한 인증 기능을 활용하여 안전하고 신뢰할 수 있는 로그인 시스템을 구축할 수 있습니다.