세션의 동작요약
- 서버는 웹브라우저에게 세션값(sid)을 준다.
- 클라이언트는 서버에 접속할 때 자신이 가지고있는 sid를 서버에 전달한다.
- 서버는 클라이언트가 보내준 sid를 확인하고 해당유저를 식별한다.
이 세션을 서버에서 손쉽게 활용할수 있도록 도와주는게 express-session이다.
순서대로 살펴보자
서버 엔트리포인트에 해당내용을 적어둔다.
const session = require('express-session');
/*
* session(option)
* secret - session hijacking을 막기위해 hash값에 추가로 들어가는 값 (Salt와 비슷한 개념)
* resave - session을 언제나 저장할지 정하는 값
* saveUninitialize: true - 세션이 저장되기 전에 uninitialized 상태로 만들어 저장
*/
app.use(
session({
secret: '@codestates',
resave: false,
saveUninitialized: true
})
);
app.get('/', function(req, res){
sess = req.session; // 간단하게 접근가능하다.
});
app.get('/login', function(req, res){
sess = req.session;
sess.username = "benKim" // 아주간단하게 값을 넣어줄 수 있다.
});
req.session.destroy(function(err){
// cannot access session here
});
활용
module.exports = {
get: (req, res) => {
let sid = req.session.userId;
if (sid) {
console.log("hi");
users
.findOne({ where: { id: sid } })
.then((data) => res.status(200).send(data));
} else {
res.status(401).send("need user session");
}
},
};
module.exports = {
post: (req, res) => {
const { email } = req.body;
sess = req.session;
users.findOne({ where: { email } }).then((data) => {
if (data) {
sess.userId = data.id;
res.status(200).send({ id: sess.userId });
} else {
console.log("testest");
res.status(404).send("unvalid user");
}
});
},
};
module.exports = {
post: (req, res) => {
let sid = req.session;
console.log(sid);
if (sid.userId) {
req.session.destroy(function (err) {
if (err) {
console.log(err);
} else {
console.log("req.session", req.session);
res.redirect("/");
}
});
} else {
res.redirect("/");
}
},
};