우선 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!",