본문으로 바로가기
 

Middleware

Quick npm i pug morgan helmet cookie-parser express-session connect-flash ejs npm i @babel/node @babel/preset-env @babel/core npm i -D nodemon 미들웨어는 req와 최종 res 사이에 존재하는 중간 단계로..

darrengwon.tistory.com

 

express-session

Simple session middleware for Express

www.npmjs.com

 

습관적으로 Express에서 설치하던 미들웨어 중 express-session을 살펴보도록하자

 

아래는 npm의 express-session 페이지 하단에 있는 예시를 수정한 것이다. 이를 통해 session을 이해하고, express에서 간단하게 활용해보자.

var express = require("express");
var parseurl = require("parseurl");
var session = require("express-session");

var app = express();

// middleware
// cookie에 secret값은 session과 동일한 것이 예측하기 쉽다.
app.use(cookieParser("sdfgdlkfjngjk45er#@")); 
app.use(
  session({
    secret: "sdfgdlkfjngjk45er#@",
    resave: false,
    saveUninitialized: true
    cookie: {
      httpOnly: true, // js 코드로 쿠키를 가져오지 못하게
      secure: false // https 에서만 가져오도록 할 것인가?
    }
  })
);

// router
app.get("/", (req, res, next) => {
  console.log(req.session);
  if (req.session.num === undefined) {
    req.session.num = 1;
  } else {
    req.session.num++;
  }
  res.send(`Hello Dormamu we meet ${req.session.num} times`);
});

// listen
app.listen(3000, (req, res) => {
  console.log(`success on : http://localhost:3000`);
});

 

우리가 일반적으로 middleware 단에서 app.use(session())으로 처리하고 아무 값도 주지 않은 것에 반해 여기서는 무언가 값을 주었다.

 

resave : 매번 세션 강제 저장 
saveUninitialized : 빈 값도 저장
cookie: 쿠키 설정

app.use(
  session({
    secret: "sdfgdlkfjngjk45er#@", // 암호화를 위한 keygen. 보통 env에 넣어서 전달한다.
    resave: false,
    saveUninitialized: false
    cookie: {
      httpOnly: true, // js 코드로 쿠키를 가져오지 못하게
      secure: false // https 에서만 가져오도록 할 것인가?
    }
  })
);

 

또, console.log(req.session)의 결과는 다음과 같다. 세션 미들웨어를 통과한 결과 req.session이 생긴 것이다.

Session {
  cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true }
}

 

새로 고침을 통해 Session 객체에 num을 주어 이를 브라우저 상에서 사용할 수도 있다. 그런데 이 Session이 저장되는 곳이 어딘가이다. npm의 express-session 문서에 따르면 The session store instance, defaults to a new MemoryStore instance.라고 한다. 결국 메모리에 저장하는 것이다. 따라서 node 서버를 끄게 되면 이 데이터는 날아가게 된다. 만약 세션 데이터를 초기화하지 않으려면 메모리가 아닌 다른 곳에 데이터를 저장해야 한다.

 

 

https://www.npmjs.com/package/express-session#compatible-session-stores

 

express-session

Simple session middleware for Express

www.npmjs.com

 

문서의 compatible-session-stores에서 안내해준대로 다른 세션 데이터 저장소를 마련해보자. 가장 인기있는 곳은 다음 두 곳이다. mongo DB와 redis. 일반적으로 DB에 저장하는 것이 일반적이다.

connect-mongo A MongoDB-based session store.

connect-redis A Redis-based session store.

 

여기에선 가볍고 별다른 추가 설치가 필요없는 session-file-store A file system-based session store.을 이용해보겠다. 실무에서는 파일에 세션을 저장하는 일은 잘 없다고 한다.

 

 

session-file-store

Session file store is a provision for storing session data in the session file

www.npmjs.com

 

빠른 이용을 위해 위 페이지에 있는 예제 코드를 첨부한다.

var session = require('express-session');
var FileStore = require('session-file-store')(session);
 
var fileStoreOptions = {};
 
app.use(session({
    store: new FileStore(fileStoreOptions),
    secret: 'sdfgdlkfjngjk45er#@'
}));

 

위 예제를 적용하여 본 코드를 수정하면 메모리가 아니라 파일에서 세션 데이터를 관리하게 된다. 코드 실행 결과 디렉토리에 다음과 같은 파일가 폴더가 생성되었다.

 

 

 

 


세션을 mongodb에 저장하는 방식으로 코딩을 할 필요가 생겨서 이용해보았다.

 

 

connect-mongo

MongoDB session store for Express and Connect

www.npmjs.com

 

 

npm i connect-mongo
import session from "express-session";
import mongoose from "mongoose";
const MongoStore = require('connect-mongo')(session);
 
app.use(session({
    secret: 'foo',
    store: new MongoStore({ mongooseConnection: mongoose.connection }
}));

 


darren, dev blog
블로그 이미지 DarrenKwonDev 님의 블로그
VISITOR 오늘 / 전체