우선 Note 를 보면 session data 가 쿠키 안에 저장 되지 않는다고 적혀있다.
https://www.npmjs.com/package/express-session
Note Session data is not saved in the cookie itself, just the session ID. Session data is stored server-side.
session ID만 저장 된다고 되어 있다. session data는 서버쪽에 저장된다.
여기 한가지 더 알아야 할게 생겼다. session id는 쿠키에 저장하지만 데이터 자체는
서버에 저장되는거다.
Warning The default server-side session storage, MemoryStore, is purposely not designed for a production environment. It will leak memory under most conditions, does not scale past a single process, and is meant for debugging and developing.
그리고 다른 주의 사항으로 서버에 저장되는 default session storage는
MemoryStore이고 실제 사용하기 위해 있는건 아니다.
그래서 session store를 사용해야 한다. 세션을 database에 저장해야 하는거다.
compatible session stores를 클릭 해보면 많은 옵션이 나오는데
https://www.npmjs.com/package/express-session#compatible-session-stores
다양한 database가 있고 이걸 이용해서 세션을 저장 할수 있다.
그중에서 mongo를 한번 살펴 본다.
★ connect-mongo A MongoDB-based session store.
클릭해 보면
https://www.npmjs.com/package/connect-mongo
connect-mongo는 세션을 MongoDB에 저장 한다. 그래서 만약에 서버가 재시작 하더라도
세션은 database에 저장되어 있끼 때문에 누군가 로그인 되어 있어도 잊어버리지 않을거다.
일단
connect-mongo를 설치한다.
vsc터미널에서 npm i connect-mongo 입력해 준다.
그리고 나서 MongoStore를 import를 해준다.
const session = require('express-session');
const MongoStore = require('connect-mongo');
app.use(session({
secret: 'foo',
store: MongoStore.create(options)
}));
그리고 이것처럼 사용하면 끝이다.
MongoStore.create(options)
}));
물론 몇가지 options을 만들어야 하지만 나중에 해줄거다.
server.js에서
import MongoStore from "connect-mongo";
그리고 MongoStore.create을 해야하는데 Mongo database의 URL을 가지고 있는
configuration object를 만들어야 한다.
app.use(session({
store: MongoStore.create({ mongoUrl: 'mongodb://localhost/test-app' })
}));
근데 이미 알고 있다. 왜냐하면 이미 해본적이 있다.
db.js에서
import mongoose from "mongoose";
mongoose.connect("mongodb://127.0.0.1:27017/wetube", {
useNewUrlParser: true,
useUnifiedTopology: true,
});
URL을 붙여 넣어주면 된다.
그리고 여길 보면 session middleware는 option 하나가 있는데 바로 store이다.
app.use(session({
store: MongoStore.create({ mongoUrl: 'mongodb://localhost/test-app' })
}));
다시 말해 default로 설정된 것과는 다른 store를 설정 할수 있다는 거다.
그래서 server.js에서
app.use(
session({
secret: "Hello!",
resave: true,
saveUninitialized: true,
store: MongoStore.create({ mongoUrl: "mongodb://127.0.0.1:27017/wetube" }),
})
);
MongoStore.create({}) options을 보낼건데 필요한 단 한가지 option은
사용할 MongoDB로의 url이다. 일단 지금은 복붙할건데 db url을 복붙하는게 별로 좋지는 않다.
그래서 이 부분은 다음 파트에서 수정할거다. 왜냐하면 여기있는 secret숨겨야 한다.
mongoUrl이라 적고 /를 붙인 다음에 똑같은 database를 넣어 준다.
node로 가보면 에러가 없다. 하지만 세션들은 MongoDB database에 저장 되어있다.
그러면 MongoDB database로 가본다. show dbs 입력 해주면
admin 0.000GB
config 0.000GB
local 0.000GB
wetube 0.000GB
use wetube 입력해주고
switched to db wetube
show collections입력해주면
sessions
users
videos
sessions이 생겼다. 그리고 db.sessions.find()를 입력하면 현재는 아무것도 안나온다.
왜냐하면 sessions는 존재하지 않는다. 이제 sessions을 만들어 준다.
세션은 브라우저가 백엔드를 방문할때 만들어지는 거다. 그것만 있으면 세션을 만들 수 있다.
http://localhost:4000/ 에서 새로고침을 해본다.
그리고 다시 db.sessions.find() 입력 해주면
{ "_id" : "TTjJn-LH58wP-4hIiqxP3aVekD0sDFqQ", "expires" : ISODate("2022-04-30T11:02:36.717Z"), "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"}}" }
세션이 만들어 졌다. id를 가지고 있고 expiration date(만료기한) 도 있고
이 날짜 이후로는 현재 user를 잊어 버리겠다는 거다.
session과 cookie등등이 있다. 이제는 코드를 저장하고 서버를 재시작해도 DB에 기억되어 있을거다.
기억되고 있는지 확인해보고 위해서 로그인해보면 잘 되고 session database도 확인해 보면
{ "_id" : "TTjJn-LH58wP-4hIiqxP3aVekD0sDFqQ", "expires" : ISODate("2022-04-30T11:02:36.717Z"), "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"}}" }
> db.sessions.find()
{ "_id" : "TTjJn-LH58wP-4hIiqxP3aVekD0sDFqQ", "expires" : ISODate("2022-04-30T11:08:31.637Z"), "session" : "{\"cookie\":{\"originalMaxAge\":null,\"expires\":null,\"httpOnly\":true,\"path\":\"/\"},\"loggedIn\":true,\"user\":{\"_id\":\"625942ace3564e09811a5f21\",\"email\":\"pkpanda@naver.com\",\"username\":\"Cyber Lover\",\"password\":\"$2b$05$WMO/VH/yctvvPJST0SyLq.QRQfSNeLJ5zAJPFfRMwLgg5ZFq1KtBm\",\"name\":\"Mercury\",\"location\":\"NYC\",\"__v\":0}}" }
보다시피 세션이 같은 id를 가지고 있고 "loggedIn\":true와 user object가 있다.
그러면 백엔드를 껐다가 다시 켜본다. 그리고 새로고침을 할건데 계속 로그인 되어있나 확인한다.
로그인 되어있고 백엔드가 죽었었고 새로고침을 했는데도 계속 로그인 되어있다.
왜냐하면 더 이상 로그인 정보가 서버에 없다. 이 정보는 MongoDB에 있다.
이제 해야 할건 이 storage를 쓰는 것뿐이다.
store: MongoStore.create({ mongoUrl: "mongodb://127.0.0.1:27017/wetube" }),
이 부분을 지우면 세션이 서버의 메모리에 저장된다. 그러면 서버를 재시작 할때마다
메모리가 지워지기 때문에 세션들을 database에 저장 하도록 만든거다.
그래서 서버가 20번이나 재시작 되더라도 database에는 누가 로그인 되어 있는지 데이터가 있을거다.
다음 파트에서는 뭔가 수정을 해보고 세션의 문제점을 알아본다.
그리고 URL부분도 수정 해볼거다. 왜냐하면 URL을 복사해서 똑같이 사용하는건 좋지 않다.
그리고 이 secret은 말그대로 비밀이어야 한다.
app.use(
session({
secret: "Hello!",