IT속으로
node.js Express + Session 으로 로그인 상태 유지하기
더월드
2025. 4. 6. 16:10
로그인 성공 후, 다른 페이지에서도 로그인 상태를 유지하자!
앞서 만든 로그인 기능에 **세션(session)**을 더해보겠습니다. 로그인한 사용자가 다른 페이지로 이동해도 로그인 상태가 유지되는 구조예요.
1. 패키지 설치
npm install express body-parser
npm install express-session
2. 세션 기반 로그인 서버 코드 (index.js)
const express = require('express');
const bodyParser = require('body-parser');
const session = require('express-session');
const app = express();
const PORT = 3000;
// 미들웨어 설정
app.use(bodyParser.urlencoded({ extended: true }));
app.use(session({
secret: 'mySecretKey123', // 세션 암호화 키 (랜덤 문자열)
resave: false,
saveUninitialized: true
}));
// 로그인 폼 페이지
app.get('/login', (req, res) => {
// 이미 로그인 되어 있으면 마이페이지로 리디렉션
if (req.session.user) {
return res.redirect('/mypage');
}
res.send(`
<h2>로그인</h2>
<form action="/login" method="post">
<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 USER_ID = 'admin';
const USER_PW = '1234';
if (username === USER_ID && password === USER_PW) {
req.session.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');
});
});
// 404 처리
app.use((req, res) => {
res.status(404).send('페이지를 찾을 수 없습니다.');
});
// 서버 시작
app.listen(PORT, () => {
console.log(`🚀 서버 실행 중: http://localhost:${PORT}`);
});
3. 동작 흐름
1). /login에서 로그인 시도
2). 성공 시 req.session.user에 사용자 정보 저장
3). /mypage 접근 시 세션이 없으면 로그인 페이지로 리디렉션
4). /logout으로 세션 삭제 → 로그인 페이지로 이동
4. 코드 실행
node index.js
5. 세션 저장소에 대해
지금은 기본 메모리 방식(MemoryStore)을 사용했지만, 실제 서비스에서는 다음과 같은 외부 저장소를 사용해요:
- connect-redis: Redis에 세션 저장
- connect-mongo: MongoDB에 세션 저장
- express-mysql-session: MySQL에 저장
이유? 서버 재시작 시 세션 날아가고, 메모리에 저장하면 확장성이 떨어지기 때문!