[유튜브 클론코딩] 6.5 MongoStore and Middlewares

2021. 3. 11. 18:00Projects/유튜브 클론코딩

728x90
반응형

6.5 MongoStore and Middlewares

서버가 재시작되어도 로그인이 유지되도록 하기

js 파일을 수정해서 서버가 재시작된다고 하더라도 쿠키를 계속 보존하고 여전히 로그인 상태를 유지하게 할 수 있는 것을 할 것이다.

--> 원래는 그냥 아무것도 설정하지 않아서 메모리를 사용해서 저장을 했었기 때문에 데이터베이스를 사용해서 세션을 저장하도록 하면 된다.

 

mongoDB, 즉 데이터베이스를 사용해서 세션을 저장하도록 하기

connect-mongo(mongo와 연결하기)를 써서, session에게 데이터를 MongoStore라는 저장소에 저장하라고 알려주어야 한다.

 

connect-mongo설치 및 설정

설치 : npm install connect-mongo

 

**현재 connect-mongo 버전이 달라져서 쓰는 방법이 바뀌었다고 한다

import express from "express";

import morgan from "morgan";

import helmet from "helmet";

import cookieParser from "cookie-parser";

import bodyParser from "body-parser";

import passport from "passport";

import session from "express-session";

import userRouter from "./routers/userRouter";

import videoRouter from "./routers/videoRouter";

import globalRouter from "./routers/globalRouter";

import routes from "./routes";

import { localsMiddleware } from './middlewares';

import "./passport";

 

const app = express();

 

const MongoStore = require("connect-mongo").default;

 

app.use(helmet());

app.use(function(req, res, next) {

    res.setHeader("Content-Security-Policy", "script-src 'self' https://archive.org");

    return next();

    });

app.set("view engine", "pug");

app.use("/uploads", express.static("uploads"));

app.use("/static", express.static("static"));

app.use(cookieParser());

app.use(bodyParser.json());

app.use(bodyParser.urlencoded({extended: true}));

app.use(morgan("dev"));

app.use(session({

    secret: process.env.COOKIE_SECRET,

    resave: true,

    saveUninitialized: false,

    store: MongoStore.create({mongoUrl: process.env.MONGO_URL})

}));

app.use(passport.initialize());

app.use(passport.session());

app.use(localsMiddleware);

app.use(routes.home, globalRouter);

app.use(routes.users, userRouter);

app.use(routes.videos,videoRouter);

 

export default app;

↑app.js

다음과 같이 코드 부분을 추가하면 된다.

 

이제 서버를 다시 시작하여도 로그인상태가 유지된다.

 

route들의 출입을 통제하는 미들웨어 만들기

우리가 아직 하지 않은 것이 있다.

route들의 출입을 통제하는 것이다.

무슨 말이냐면, 이미 로그인이 된 사용자는 Join 화면으로는 접근하지 못하게 하고 그런 것 말이다. 그걸 미들웨어로 만들겠다.

 

1) onlyPublic 미들웨어

export const onlyPublic = (req,res,next) => {

    if(req.user){

        res.redirect(routes.home);

    }else{

        next();

    }

}

↑ middlewares.js

먼저, req.user가 존재하는지를 체크할 것이다.

만약 req.user가 존재하면(즉, 사용자가 로그인 된 상태라면) 그 이후의 controller에는 접근하지 못하게 하려고 한다.

 

globalRouter.get(routes.join, onlyPublic, getJoin);

globalRouter.post(routes.join, onlyPublic, postJoin, postLogin);

globalRouter.get(routes.login, onlyPublic, getLogin);

globalRouter.post(routes.login, onlyPublic, postLogin);

↑ globalRouter.js

globalRouter에서 join과 login은 로그인이 되지 않은 사용자에게만 접속할 수 있도록 해야 하므로 이렇게 미들웨어를 넣어준다.

 

2) onlyPrivate 미들웨어

반대로 userRouter에 있는 editProfile, changePassword는 오직 사용자 전용이어야만 한다.

 

export const onlyPrivate = (req,res,next) => {

    if(req.user){

        next();

    }else{

        res.redirect(routes.home);

    }

}

↑ middlewares.js

 

userRouter.get(routes.editProfile, onlyPrivate, editProfile);

userRouter.get(routes.changePassword, onlyPrivate, changePassword);

↑ userRouter.js

 

나머지도 수정해주기

//upload

videoRouter.get(routes.upload, onlyPrivate, getUpload);

videoRouter.post(routes.upload, onlyPrivate, uploadVideo, postUpload);

//video detail

videoRouter.get(routes.videoDetail(), videoDetail);

//edit video

videoRouter.get(routes.editVideo(), onlyPrivate, getEditVideo);

videoRouter.post(routes.editVideo(), onlyPrivate, postEditVideo);

//delete video

videoRouter.get(routes.deleteVideo(), onlyPrivate, deleteVideo);

↑ userRouter.js

 

728x90
반응형