MySQL로 사용자 정보를 관리하는 실제 서비스 형태의 로그인 예제
- express: 웹 서버
- express-session: 세션 유지
- body-parser: form 데이터 읽기
- mysql2: MySQL 클라이언트
1. 패키지 설치
npm install express express-session body-parser mysql2
2. MySQL 설정 (DB와 테이블 만들기)
- mysql 서버를 별도 설치후에
- test DB 생성, user 테이블에 계정 'admin', 비밀번호 '1234' 생성하기
-- MySQL 콘솔에서 실행
CREATE DATABASE test;
USE login_app;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL
);
-- 기본 사용자 추가
INSERT INTO users (username, password) VALUES ('admin', '1234');
3. 프로젝트 구조
express-login-mysql/
├── index.js
4. 전체 코드 (index.js)
const express = require('express');
const bodyParser = require('body-parser');
const session = require('express-session');
const mysql = require('mysql2');
const app = express();
const PORT = 3000;
// MySQL 연결 설정
const db = mysql.createConnection({
host: 'localhost',
user: 'root', // ← MySQL 사용자 계정
password: '', // ← 비밀번호 (있으면 입력)
database: 'login_app'
});
db.connect(err => {
if (err) throw err;
console.log('MySQL 연결 완료');
});
// 미들웨어
app.use(bodyParser.urlencoded({ extended: true }));
app.use(session({
secret: 'mysqlLoginSecret',
resave: false,
saveUninitialized: true
}));
// 로그인 폼
app.get('/login', (req, res) => {
if (req.session.user) return res.redirect('/mypage');
res.send(`
<h2>로그인</h2>
<form method="post" action="/login">
<input type="text" name="username" placeholder="아이디" required />
<input type="password" name="password" placeholder="비밀번호" required />
<button type="submit">로그인</button>
</form>
`);
});
// 로그인 처리
app.post('/login', (req, res) => {
const { username, password } = req.body;
const sql = 'SELECT * FROM users WHERE username = ? AND password = ?';
db.query(sql, [username, password], (err, results) => {
if (err) return res.send('DB 오류');
if (results.length > 0) {
const user = results[0];
req.session.user = { id: user.id, username: user.username };
res.redirect('/mypage');
} else {
res.send('<h3>❌ 로그인 실패! 아이디 또는 비밀번호 오류</h3>');
}
});
});
// 마이페이지
app.get('/mypage', (req, res) => {
if (!req.session.user) return res.redirect('/login');
res.send(`
<h2>마이페이지</h2>
<p>${req.session.user.username}님, 환영합니다</p>
<a href="/logout">로그아웃</a>
`);
});
// 로그아웃
app.get('/logout', (req, res) => {
req.session.destroy(() => {
res.redirect('/login');
});
});
// 서버 시작
app.listen(PORT, () => {
console.log(`서버 실행 중: http://localhost:${PORT}`);
});
코드 실행
- cmd창에서 node index.js
- 브라우저에서 "localhost:3000/login" 페이지 접속
- 'admin', '1234'으로 접속시 아래 페이지가 보이면 성공 ^^
보안 주의사항
- 현재는 비밀번호 평문 저장 중! 꼭 bcrypt로 암호화하세요!
- SQL Injection 방지를 위해 Prepared Statement를 사용했어요 (?).
- express-session은 기본 메모리 저장소를 사용 중 — Redis 등으로 교체 권장
'IT속으로' 카테고리의 다른 글
Uptime Kuma – 무료이면서 강력한 서버 모니터링 도구 (0) | 2025.04.06 |
---|---|
Node.js + MySQL + bcrypt로 회원가입 & 로그인 만들기 (0) | 2025.04.06 |
Node.js + Express + SQLite로 로그인 기능 만들기 (0) | 2025.04.06 |
Node.js Express + JSON 파일을 활용한 로그인 기능 (0) | 2025.04.06 |
node.js Express + Session 으로 로그인 상태 유지하기 (0) | 2025.04.06 |
댓글