안녕하세요.
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로 설정이 되어 있습니다.)
그리고 브라우저 새로고침을 하여도 로그아웃이 되지 않는이유도 브라우저에 쿠키값이 있기때문
에 새로고침을 하여도 로그아웃이 되지 않는다고 생각하시면 됩니다.