Vue.js 를 배워보자

Node.js, Express, JWT를 이용한 로그인 애플리케이션 구현하기

_Blue_Sky_ 2025. 2. 18. 22:24
728x90
728x90

Node.js, Express, JWT는 현대적인 웹 애플리케이션 개발에서 널리 사용되는 기술 스택입니다. 특히, JWT(JSON Web Token)는 상태 비저장(stateless) 인증 방식으로, 사용자 인증 및 권한 관리에 효과적인 솔루션을 제공합니다. 이 글에서는 이러한 기술들을 활용하여 간단한 로그인 애플리케이션을 구축하는 과정을 상세하게 설명하고, 예제 코드를 통해 실제 구현 방법을 보여드리겠습니다.

1. 프로젝트 설정 및 의존성 설치

먼저, 새로운 Node.js 프로젝트를 생성하고 필요한 의존성을 설치합니다.

mkdir jwt-login-app
cd jwt-login-app
npm init -y
npm install express jsonwebtoken bcryptjs cors
  • express: Node.js 웹 프레임워크
  • jsonwebtoken: JWT 생성 및 검증
  • bcryptjs: 비밀번호 해싱
  • cors: CORS 설정 (다른 도메인에서 요청 허용)
728x90

2. 사용자 모델 정의

사용자 정보를 저장하기 위한 모델을 정의합니다. 간단하게 이름과 비밀번호를 저장하는 모델을 만들어 보겠습니다.

// models/user.js
const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');

const userSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true
  },
  password: {
    type: String,
    required: true
  }
});

userSchema.pre('save', async function(next) {
  const salt = await bcrypt.genSalt(10);
  this.password = await bcrypt.hash(this.password, salt);
  next();
});

module.exports = mongoose.model('User', userSchema);

3. JWT 생성 및 검증 함수

JWT를 생성하고 검증하는 함수를 구현합니다.

// utils/jwt.js
const jwt = require('jsonwebtoken');

const generateToken = (id) => {
  return jwt.sign({ id }, process.env.JWT_SECRET, { expiresIn: '30d' });
};

const verifyToken = (token) => {
  return jwt.verify(token, process.env.JWT_SECRET);
};

module.exports = { generateToken, verifyToken };

4. Express 서버 설정

Express 서버를 설정하고, 사용자 등록, 로그인, 인증된 요청 처리 등의 라우트를 정의합니다.

 
// index.js
const express = require('express');
const mongoose = require('mongoose');
const dotenv = require('dotenv');
const cors = require('cors');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');

// ... (생략)

const app = express();
dotenv.config();

// ... (생략)

app.post('/register', async (req, res) => {
  // ... (사용자 등록 로직)
});

app.post('/login', async (req, res) => {
  // ... (로그인 로직)
});

app.get('/protected', authenticateToken, (req, res) => {
  res.json({ message: 'You are authorized' });
});

// ... (생략)

function authenticateToken(req, res, next) {
  const authHeader = req.headers['authorization'];
  const token = authHeader && authHeader.split(' ')[1];
  if (token == null) return res.sendStatus(401);

  jwt.verify(token, process.env.JWT_SECRET, (err, user) => {
    if (err) return res.sendStatus(403);
    req.user = user;
    next();
  });
}

// ... (생략)

핵심 기능:

  • 사용자 등록: 새로운 사용자를 데이터베이스에 저장하고, 비밀번호를 해싱하여 보안을 강화합니다.
  • 로그인: 사용자의 입력 정보를 검증하고, 유효한 경우 JWT를 생성하여 클라이언트에 전달합니다.
  • JWT 인증: 요청 헤더에 포함된 JWT를 검증하고, 유효한 경우 요청을 처리합니다.
  • 보호된 라우트: JWT 인증을 거쳐야만 접근할 수 있는 라우트를 정의합니다.

추가 고려 사항

  • CORS 설정: 다른 도메인에서 요청을 허용하기 위해 CORS 설정을 해야 합니다.
  • 에러 처리: 다양한 에러 상황에 대한 처리를 추가하여 안정적인 애플리케이션을 만들어야 합니다.
  • 토큰 유효 기간: JWT의 유효 기간을 적절하게 설정해야 합니다.
  • 토큰 갱신: 토큰이 만료되기 전에 갱신하는 기능을 구현할 수 있습니다.
  • 리프레시 토큰: 보안을 위해 리프레시 토큰을 사용하는 방식을 고려할 수 있습니다.
728x90

이 글에서는 Node.js, Express, JWT를 활용하여 간단한 로그인 애플리케이션을 구축하는 방법을 살펴보았습니다. JWT는 상태 비저장 인증 방식으로, 현대적인 웹 애플리케이션 개발에서 널리 사용되고 있습니다. 이 글을 통해 JWT의 기본적인 개념과 사용법을 이해하고, 실제 프로젝트에 적용할 수 있기를 바랍니다.

 

728x90
728x90