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
'Vue.js 를 배워보자' 카테고리의 다른 글
JavaScript의 this 키워드: 컨텍스트 이해하기 (0) | 2025.02.16 |
---|---|
Vue 3에서 Proxy 객체와 스프레드 연산자를 활용한 디버깅 (1) | 2025.02.15 |
Vue 3의 ref와 reactive: 깊이 있게 파헤치는 가이드 (예제와 함께) (0) | 2025.02.15 |
JavaScript Import 문법 심층 분석: Named Export vs. Default Export (0) | 2025.02.11 |
computed와 watch: 명확한 개념과 활용 예시 (0) | 2024.12.21 |