Session Store

이재경·2022년 12월 28일
0

백엔드

목록 보기
6/7

1.session이란?

웹 서버가 클라이언트의 정보를 클라이언트별로 구분하여 서버에 저장하고
클라이언트 요청 시 Session ID를 사용하여 클라이언트의 정보를 다시 확인 하는 기술
*클라이언트가 정보를 저장하고, 요청시 정보를 보내는 Cookie와 대조됨

2.session 작동 방식

서버는 세션을 생성하여 세션의 구분자인 Session ID를 클라이언트에 전달
클라이언트는 요청 시 session id를 함께 요청에 담아서 전송
서버는 전달받은 session id로 해당하는 세션을 찾아 클라이언트 정보를 확인

3.Express.js의 session

express-session 패키지를 사용하여 간단하게 session 동작을 구현 할 수 있음
특별한 설정 없이, 자동으로 session 동작을 구현해 줌
->자동으로 session id를 클라이언트에 전달, session id로 클라이언트 정보 확인

4.Session Store를 사용하는 이유

express-session 패키지는 session을 기본적으로 메모리에 저장함
따라서 현재 구현된 어플리케이션을 종료 후 다시 실행하면, 모든 유저의 로그인이 해제됨
혹은 서버가 여러 대가 있을 경우, 서버간 세션 정보 공유할 수 없음

5.MongoDB를 Session Store로 사용하기

connect-mongo 패키지를 이용해, MongoDB를 session store로 사용할 수 있음
connect-mongo 패키지는 express-session 패키지의 옵션으로 전달 가능
자동으로 session 값이 변경될 때 update되고, session이 호출될때 find함

6.connect-mongo


connect-mongo 패키지를 사용해 express-session 설정 시 store 옵션에 전달하고, mongoUrl을 설정
세션데이터를 몽고디비에 저장하고 관리하는 기능을 자동으로 수행해 줌

*세션확인해보기(MongoDB Compass를 이용해 확인한 session)

7.Session Store 사용하기

app.js

const createError = require('http-errors');
const express = require('express');
const path = require('path');
const cookieParser = require('cookie-parser');
const logger = require('morgan');
const mongoose = require('mongoose');
const dayjs = require('dayjs');
const session = require('express-session');
const passport = require('passport'); 
const MongoStore=require('connect-mongo')
const loginRequired = require('./middlewares/login-required');

const indexRouter = require('./routes');
const postsRouter = require('./routes/posts');
const authRouter = require('./routes/auth');

require('./passport')();

mongoose.connect('mongodb://localhost:27017/simple-board');

mongoose.connection.on('connected', () => {
  console.log('MongoDB Connected');
});

const app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');
app.locals.formatDate = (date) => {
  return dayjs(date).format('YYYY-MM-DD HH:mm:ss');
}

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use(session({ 
  secret: 'elice', 
  resave: false, 
  saveUninitialized: true,
  // 세션 스토어 사용하기

store:MongoStore.create({
  mongoUrl: 'mongodb://localhost:27017/simple-board'
})

}));

app.use(passport.initialize());
app.use(passport.session());

app.use('/', indexRouter);
app.use('/posts', loginRequired, postsRouter);
app.use('/auth', authRouter);

// catch 404 and forward to error handler
app.use((req, res, next) => {
  next(createError(404));
});

// error handler
app.use((err, req, res, next) => {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;
profile
코딩으로 빛나게

0개의 댓글