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

NestJS는 Node.js 기반의 프레임워크로, 서버 사이드 애플리케이션을 개발하기 위해 많은 개발자들에게 선택되고 있습니다. 이 프레임워크는 Express.js 위에서 구축되며, 강력한 모듈러 구조와 간결한 코드 작성을 지원합니다. 이번에는 NestJS 애플리케이션에서 세션 인증을 구현하는 방법에 대해 소개하겠습니다.

세션 인증이란?

세션 인증은 사용자가 로그인한 후 서버에서 사용자 정보를 저장하는 인증 방법입니다. 사용자가 인증된 상태를 유지하기 위해 세션 ID를 사용하며, 이 세션 ID는 보통 쿠키를 통해 클라이언트에 저장됩니다. 각 요청이 있을 때마다 서버는 세션 ID를 확인하여 인증 여부를 판단합니다.

NestJS에서 세션 인증 구현하기

NestJS에서 세션 인증을 구현하기 위해서는 다음과 같은 단계를 거쳐야 합니다:

1. 익스프레스 세션 미들웨어 설치

NestJS는 익스프레스 기반이므로, 세션을 처리하기 위해 익스프레스 세션 미들웨어를 설치해야 합니다. 프로젝트 디렉토리에서 다음 명령어를 실행하여 익스프레스 세션 패키지를 설치합니다.

npm install express-session

2. 익스프레스 세션 설정

익스프레스 앱 모듈에서 세션 미들웨어를 설정해야 합니다. app.module.ts 파일을 열고 다음과 같이 NestExpressApplication을 가져온 후, use 메소드를 사용하여 세션 미들웨어를 적용합니다.

import { NestFactory } from '@nestjs/core';
import { NestExpressApplication } from '@nestjs/platform-express';
import session from 'express-session';

async function bootstrap() {
  const app = await NestFactory.create<NestExpressApplication>(AppModule);
  
  app.use(session({
    secret: 'my-secret-key',
    resave: false,
    saveUninitialized: false,
  }));

  await app.listen(3000);
}
bootstrap();

3. 로그인 라우터 구현

세션을 사용하여 로그인 기능을 구현하기 위해 로그인 라우터를 만들어야 합니다. auth.controller.ts 파일을 생성하고, 다음과 같이 로그인 라우터를 작성합니다.

import { Controller, Post, Req, Res } from '@nestjs/common';
import { Request, Response } from 'express';

@Controller('auth')
export class AuthController {
  @Post('login')
  async login(@Req() req: Request, @Res() res: Response) {
    // 로그인 로직 구현
    const { username, password } = req.body;
    // 사용자 인증 로직
    if (username === 'admin' && password === '1234') {
      // 세션에 사용자 정보 저장
      req.session.user = { username };
      res.send('로그인 성공');
    } else {
      res.send('로그인 실패');
    }
  }
}

4. 인증된 요청 처리

세션에 사용자 정보를 저장한 후, 인증된 요청을 처리하기 위해서는 미들웨어를 작성해야 합니다. 미들웨어 함수를 작성하고, 각 라우터에서 이 함수를 사용하여 인증 여부를 확인합니다.

// auth.middleware.ts
import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';

@Injectable()
export class AuthMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {
    if (!req.session.user) {
      res.status(401).send('인증 필요');
    } else {
      next();
    }
  }
}

// app.module.ts
import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
import { AuthMiddleware } from './auth.middleware';

@Module({
  // ...
})
export class AppModule implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(AuthMiddleware).forRoutes('*');
  }
}

이제 NestJS 애플리케이션에서 세션 인증을 구현하는 방법을 알게 되었습니다. 세션을 사용하여 사용자 인증을 처리함으로써, 보안적인 측면과 사용자 경험 측면에서 좋은 결과를 얻을 수 있습니다. NestJS를 활용하여 안전하고 신뢰할 수 있는 웹 애플리케이션을 개발하는 데 도움이 되기를 바랍니다.

참고 문헌:

#NestJS #JavaScript