서버를 매번 새로 실행시킬때마다, 세션 정보를 잃게 되면 문제가 발생합니다.
기본적으로 세션 정보와 쿠키 정보는 메모리에 저장됩니다.
따라서 세션이 유지되기 위해서는 다른 방식이 필요합니다.
이번 글에서 MongoDB, 즉 데이터베이스를 사용해서 세션을 저장하는 방법을 알아보겠습니다.
1) 우선 connect-mongo를 다운로드 합니다.
그리고 이것으로 저장소를 생성할 것입니다.
2) 그리고 app.js로 이동해서 import MongoStore from "connect-mongo" 를 추가합니다.
3) 그리고 const CookieStore = MongoStore(session)와
app.use()에 store:new CookieStore()를 추가합니다.
4) 그리고 이제 CookieStore()와 MongoDB간의 연결을 만들어야 합니다.
import mongoose from "mongoose"를 통해서 mongoose를 불러오고,
new CookieStore({})에 mongooseConnection: mongoose.connection 을 추가합니다.
이렇게 하면 mongoose는 이 저장소를 MongoDB에 연결해줍니다.
이제 js파일을 수정하거나 서버가 재시작된다고 하더라도
우리는 쿠키를 계속 보존할 수 있고, 유저는 여전히 로그인 상태를 유지하게 됩니다.
5) 다음은 localhost:4000/join으로 이동해서 회원가입을 시도한 후
6) 로그인 된 상태에서 서버를 재실행해도, 여전히 로그인 된 상태가 유지됩니다.
7) 다음은 유저의 접근권에 제어를 주기 위해 2가지 미들웨어를 추가합니다.
바로 onlyPublic과 onlyPrivate입니다.
우선 onlyPublic을 다음과 같이 middlewares.js에 추가합니다.
이것의 의미는 user가 로그인 되어 있는 경우는 home으로 redirect하고,
그렇지 않은 경우만 next()로 이동하라는 의미입니다.
8) 이제 목표는 사용자가 로그인 상태라면, Join과 Login화면을 보지 않도록 하는 것입니다.
이것을 위해서 globalRouters.js로 이동해서
import { onlyPublic } from "../middlewares"; 를 추가하고
Join과 Login 라우터에 onlyPublic 을 추가해줍니다.
이를 통해 Join과 Login은 오직 로그아웃된 사용자만 이용 가능합니다.
req.user로 로그인된 사용자가 누구인지 알 수 있는 것은 Passport와 Session의 기능 때문입니다.
9) 이번에는 onlyPrivate입니다.
onlyPrivate의 목적은 로그인된 사용자만을 위한 기능을 구현하는 것입니다.
우선 다음과 같이 onlyPrivate 미들웨어를 구현합니다.
10) 그리고 userRouters.js 로 이동해서
import {onlyPrivate } from "../middlewares"; 와
onlyPrivate 을 추가해줍니다.
11) 또한 videoRouters.js 로 이동해서
onlyPrivate을 import하고,
getUpload, postUpload, getEditVideo, postEditVideo, deleteVideo 라우터에
onlyPrivate을 추가합니다.
이를 통해 오직 로그인된 사용자만이 업로드, 비디오 수정, 비디오 삭제를 할 수 있습니다.
이러한 것들이 사용자 보안의 기본이 되며,
앞으로 계속해서 사용자 보안을 알아보도록 하겠습니다.
"다음은 노마드코더(https://academy.nomadcoders.co/)의 [초급 풀스택] 유튜브 클론 코딩 강의를 참고하였습니다."