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에 저장

이유? 서버 재시작 시 세션 날아가고, 메모리에 저장하면 확장성이 떨어지기 때문!