express-session 정리(3)

김현진·2020년 8월 1일
0

안녕하세요.

express-session 정리(2)에 이어 추가적으로 정리를 해보겠습니다.

코드를 이용하여 실습을 해보겠습니다.

const express = require('express');
const cookieParser = require('cookie-parser');
const fs = require('fs');
const session = require('express-session');

const app = express();

app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(cookieParser('kim'));

app.use(
  session({
    secret: 'kim',
    resave: false, // resave는 요청이 왔을 때 세션에 수정 사항이 생기지 않더라도 세션을 다시 저장할지에 대한 설정
    saveUninitialized: false // saveUninitialized는 세션에 저장할 내역이 없더라도 세션을 저장할지에 대한 설정
  })
);

app.get('/', (req, res, next) => {
  console.log('req',req.cookies);
  
  res.cookie('cook', 'good', {
    maxAge: 60*60*1000, // 만료시간을 밀리초로 계산
    httpOnly: true,
  });
  res.end(fs.readFileSync('client/index.html')); // 이부분은 따로 생각 할 필요가 없습니다.
});


app.post('/login', (req, res, next) => {
  const { username } = req.body;

  req.session.userName = username;
  res.send(`${username} 님 안녕하세요`)
  res.end(fs.readFileSync('client/mypage.html')); // 이부분은 따로 생각 할 필요가 없습니다.
});

app.listen(8080, () => {
  console.log('연결')
});

기존 코드에 추가한 코드만 한번 알아보도록 하겠습니다.

app.post('/login', (req, res, next) => {
  const { username } = req.body; 

  req.session.userId = username;
  res.send(`${username} 님 안녕하세요`)
  res.end(fs.readFileSync('client/mypage.html'));
});

만약 클라이인트에서 '/login' post 요청을 보냈을때

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

위의 미들웨어를 장착했기 때문에 요청 온 본문 내용을 req.body를 통해서 확인을 할 수 있

습니다.

저같은 경우 req.body를 콘솔 창에 찍어보면 ({ username: 'babo', password: '1234'} )

=> 이 부분은 클라이언트 페이지에서 작성을 해줘야지 이런 양식으로 옵니다.

ES6문법을 const { username } = req.body;

사용 하여 선언과 동시에 변수에다가 값을 넣어버렸습니다.

username 변수에는 'babo'라는 값이 들어 가 있습니다.

express-session으로 만들어진 req.session 객체에 값을 넣을 수 있습니다.

req.session.userId = username // session 객체에 키값은 userId 값은 username 변수를 추가를 할 것이다.

express-session이 응답을 보낼때 헤더에다가 쿠키를 심어서 보내고 브라우저는 그 쿠키를

저장해두고 요청을 보낼 때 계속 재사용을 해서 이 쿠키값을 해석 한 뒤 사용자가 누군인지 알

아서 파악을 합니다.

req.session은 사용자마다 다르게 부여됩니다. 즉 req.session은 그 요청에 대해서만

유효하므로 userId가 여러 개가 될 일은 없습니다. req.session.id는 현재 요청을 보낸

사용자의 id 하나가 됩니다.

브라우저에서 오는 express-session이 쿠키값을 해독한뒤 memorystore에서

해당 사용자의 req.session에 값을 가지고 온다라고 생각하면 될 거 같습니다.

그리고 서버를 켠 후 쿠키값을 확인 시

쿠키값이 암호화 된 것을 확인을 할 수 있습니다. (express-session 서명값(secret)을

통해서 암호화를 시켰습니다. 착한모듈)

해커가 secret값을 해킹을 할 수 있으므로 secret값은 환경변수 설정 해주는 것이 좋습니다. (추가적으로 express-session에 name옵션을 주지 않았기 때문에 기본값인 connect.sid로 설정이 되어 있습니다.)

그리고 브라우저 새로고침을 하여도 로그아웃이 되지 않는이유도 브라우저에 쿠키값이 있기때문

에 새로고침을 하여도 로그아웃이 되지 않는다고 생각하시면 됩니다.

profile
기록의 중요성

0개의 댓글