이번 글에서는 Node.js를 사용하여 간단한 사용자 인증 API를 만드는 미니 프로젝트를 진행해 보겠습니다. 사용자 인증은 웹 애플리케이션에서 가장 기본적이지만 중요한 기능 중 하나입니다. 이 프로젝트를 통해 JWT(JSON Web Token)를 활용한 인증 방식을 구현해볼 것입니다.

프로젝트 환경 설정

1. Node.js 설치

Node.js가 설치되어 있지 않다면 공식 웹사이트(https://nodejs.org/)에서 다운로드하여 설치합니다.

2. 프로젝트 초기화

프로젝트 디렉토리를 만들고, 해당 디렉토리로 이동한 후 npm init 명령어를 실행해 package.json 파일을 생성합니다.

mkdir user-auth-api
cd user-auth-api
npm init -y

3. 필요한 패키지 설치

사용할 패키지는 Express, JWT, bcrypt입니다. Express는 웹 프레임워크이고, JWT는 JSON 웹 토큰을 생성 및 검증하는 라이브러리입니다. bcrypt는 비밀번호 해시화를 위한 라이브러리입니다.

npm install express jsonwebtoken bcryptjs body-parser dotenv

4. 디렉토리 구조 설정

다음과 같은 파일 및 폴더 구조를 설정합니다.

user-auth-api/
├── .env
├── index.js
└── routes/
    └── auth.js

5. 환경 변수 설정

.env 파일에 비밀 키를 설정합니다. 이 키는 JWT 생성 시 사용됩니다.
JWT_SECRET=your_jwt_secret

6. 기본 서버 설정

index.js 파일을 열어 기본 Express 서버를 설정합니다.
const express = require('express');
const bodyParser = require('body-parser');
const authRoutes = require('./routes/auth');

const app = express();
const PORT = process.env.PORT || 3000;

app.use(bodyParser.json());
app.use('/api/auth', authRoutes);

app.listen(PORT, () => {
    console.log(서버가 http://localhost:${PORT}에서 실행 중입니다.);
});

7. 사용자 인증 라우트 만들기

routes/auth.js 파일을 열어 사용자 인증 관련 라우트를 추가합니다.
const express = require('express');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');

const router = express.Router();

let users = []; // 메모리에 사용자 정보를 저장 (실제 프로젝트에서는 데이터베이스 사용)

router.post('/register', async (req, res) => {
    const { username, password } = req.body;

    // 비밀번호 해시화
    const hashedPassword = await bcrypt.hash(password, 10);

    // 사용자 추가
    users.push({ username, password: hashedPassword });
    res.status(201).json({ message: '사용자가 등록되었습니다.' });
});

router.post('/login', async (req, res) => {
    const { username, password } = req.body;

    // 사용자 찾기
    const user = users.find(u => u.username === username);
    if (!user) {
        return res.status(404).json({ message: '사용자를 찾을 수 없습니다.' });
    }

    // 비밀번호 확인
    const isPasswordValid = await bcrypt.compare(password, user.password);
    if (!isPasswordValid) {
        return res.status(401).json({ message: '비밀번호가 잘못되었습니다.' });
    }

    // JWT 생성
    const token = jwt.sign({ username }, process.env.JWT_SECRET, { expiresIn: '1h' });
    res.json({ token });
});

module.exports = router;

8. API 테스트

이제 API를 테스트할 준비가 되었습니다. Postman과 같은 API 테스트 도구를 사용하여 다음과 같은 요청을 보낼 수 있습니다.

  1. 회원가입
  2. - URL: http://localhost:3000/api/auth/register - Method: POST - Body (JSON):

         {
             "username": "testuser",
             "password": "password123"
         }
  3. 로그인
- URL: http://localhost:3000/api/auth/login

- Method: POST - Body (JSON):

     {
         "username": "testuser",
         "password": "password123"
     }

로그인에 성공하면 JWT가 반환됩니다. 이 토큰은 이후 인증이 필요한 API 요청 시 사용됩니다.

마무리

이번 글에서는 Node.js를 활용한 간단한 사용자 인증 API를 설계하고 구현해보았습니다. JWT를 사용하여 안전하게 사용자 인증을 처리하는 방법을 배웠으며, 기본적인 회원가입과 로그인 기능을 구현했습니다. 이 프로젝트를 바탕으로 추가적으로 사용자 데이터베이스 연동, 비밀번호 찾기 기능, 권한 관리 등의 기능을 확장해 나갈 수 있습니다.