Express Session & Auth

Jangmyun·2024년 7월 22일

예제 코드 및 분석

var express = require("express");
var parseurl = require("parseurl");
var session = require("express-session");
// express-session 미들웨어를 module로 설치

var app = express();

// session의 동작 옵션 설정
app.use(
  session({
    secret: "keyboard cat",
    resave: false,
    saveUninitialized: true,
  })
);

app.get("/", function (req, res, next) {
  console.log(req.session);
  if (req.session.num === undefined) {
    req.session.num = 1;
  } else {
    req.session.num = req.session.num + 1;
  }
  res.send(`Views : ${req.session.num}`);
});

app.listen(3001, function () {
  console.log("Example code running on port 3001");
});

session 객체에 num이 없다면 1로 초기화 해주고 num 있으면 기존값 += 1 해주는 간단한 기능 구현

근데 session store의 인스턴스 저장소 기본값은 Memory라서 서버끄면 휘발됨



session store의 다변화

앞서 구현한 기능은 휘발성인데 공식문서(Compatible Session Stores)를 참조해보면 session 을 저장할 저장소 옵션이 많이 있다. MySQL을 사용할 예정이다.

const express = require('express');
const session = require('express-session');
const MySQLStore = require('express-mysql-session')(session);
const mysql = require('mysql2');

const app = express();
const port = 3000;

// MySQL 데이터베이스 연결 설정
const options = {
  host: 'localhost',
  port: 3306,
  user: 'root',
  password: 'password',
  database: 'session_test'
};

// MySQL 세션 저장소 생성
const connection = mysql.createConnection(options); // or mysql.createPool(options);
const sessionStore = new MySQLStore({}/* session store options */, connection);

// 세션 미들웨어 설정
app.use(session({
  key: 'session_cookie_name',
  secret: 'your_secret_key',
  store: sessionStore,
  resave: false,
  saveUninitialized: false
}));

// 기본 라우트 설정
app.get('/', (req, res) => {
  if (req.session.views) {
    req.session.views++;
    res.send(`You visited this page ${req.session.views} times`);
  } else {
    req.session.views = 1;
    res.send('Welcome to the session demo. Refresh the page!');
  }
});

// 서버 시작
app.listen(port, () => {
  console.log(`Server is running on http://localhost:${port}`);
});

서버 실행 시 MySQL에서 sessions 테이블 생성 확인

이제 데이터가 휘발되지 않는다.

0개의 댓글