이번 글에서는 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 테스트 도구를 사용하여 다음과 같은 요청을 보낼 수 있습니다.
- 회원가입
- 로그인
- URL: http://localhost:3000/api/auth/register
- Method: POST
- Body (JSON):
{
"username": "testuser",
"password": "password123"
}
http://localhost:3000/api/auth/login
- Method: POST
- Body (JSON):
{
"username": "testuser",
"password": "password123"
}
로그인에 성공하면 JWT가 반환됩니다. 이 토큰은 이후 인증이 필요한 API 요청 시 사용됩니다.
마무리
이번 글에서는 Node.js를 활용한 간단한 사용자 인증 API를 설계하고 구현해보았습니다. JWT를 사용하여 안전하게 사용자 인증을 처리하는 방법을 배웠으며, 기본적인 회원가입과 로그인 기능을 구현했습니다. 이 프로젝트를 바탕으로 추가적으로 사용자 데이터베이스 연동, 비밀번호 찾기 기능, 권한 관리 등의 기능을 확장해 나갈 수 있습니다.