습관적으로 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
문서의 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.을 이용해보겠다. 실무에서는 파일에 세션을 저장하는 일은 잘 없다고 한다.
빠른 이용을 위해 위 페이지에 있는 예제 코드를 첨부한다.
var session = require('express-session');
var FileStore = require('session-file-store')(session);
var fileStoreOptions = {};
app.use(session({
store: new FileStore(fileStoreOptions),
secret: 'sdfgdlkfjngjk45er#@'
}));
위 예제를 적용하여 본 코드를 수정하면 메모리가 아니라 파일에서 세션 데이터를 관리하게 된다. 코드 실행 결과 디렉토리에 다음과 같은 파일가 폴더가 생성되었다.
세션을 mongodb에 저장하는 방식으로 코딩을 할 필요가 생겨서 이용해보았다.
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 }
}));
'Node, Nest, Deno > 🚀 Node.js (+ Express)' 카테고리의 다른 글
Express 백엔드 배포용 전환 (morgan, pm2, winston) (0) | 2020.04.04 |
---|---|
Express 개발 플로우 + 배포 알아보기 (0) | 2020.03.28 |
EJS 뷰 엔진 사용하기 (0) | 2020.03.12 |
PUG 뷰 엔진 마스터하기 (0) | 2020.03.12 |
404 NOT Found, Error 처리 미들웨어 (0) | 2020.03.12 |