Mongo Store

0_CyberLover_0·2022년 4월 16일
0

Node.JS # 04

목록 보기
16/19

우선 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 입력해 준다.

그리고 나서 MongoStoreimport를 해준다.

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 databaseURL을 가지고 있는

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 middlewareoption 하나가 있는데 바로 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를 잊어 버리겠다는 거다.

sessioncookie등등이 있다. 이제는 코드를 저장하고 서버를 재시작해도 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\":trueuser 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!",
profile
꿈꾸는 개발자

0개의 댓글