노마드/유튜브
ch7.5~ login, sessions&cookies, logged in user
hippo0207
2022. 8. 23. 16:02
1. login
- id확인
export const postLogin = async (req, res) => {
const { username, password } = req.body;
const pageTitle = "Login";
// check if account exists
const user = await User.findOne({ username });
if (!user) {
return res.status(400).render("login", {
pageTitle,
errorMessage: "An account with this username does not exists",
});
}
- 비번확인
}
// check if password correct
const ok = await bcrypt.compare(password, user.password);
if (!ok) {
return res.status(400).render("login", {
pageTitle,
errorMessage: "Wrong password",
});
}
return res.redirect("/");
};
- >> 쿠키 세션 사용하여 로그인유저 유지

2. sessions&cookies
- 세션 : 백엔드, 브라우저간의 활동을 기억함
- 브라우저, 백엔드 사이의 memory, history
- express-session install 필요
- use router전에 use session 넣어야함!@!@!
import session from "express-session";
app.use(
session({
secret: "Hello!",
resave: true,
saveUninitialized: true,
})
);
app.use("/", rootRouter);
app.use("/videos", videoRouter);
- 예 제
app.use((req, res, next) => {
req.sessionStore.all((error, sessions) => {
console.log(sessions);
next();
});
});
app.get("/add-one", (req, res, next) => {
req.session.potato += 1;
return res.send(`${req.session.id}\n${req.session.potato}`);
});
- req.session.potato >>처럼 항목 만들수있음
- 세션을 몽고디비와 연결
- 백엔드 세션 마다 id를 갖고있음> 브라우저에 id보냄 > 브라우저와 일치하는 세션이 뭔지 알수있음
- 백엔드에 요청할때마다 id를 보내야함
- 브라우저마다 id가 다름
- app접근때마다 session이 id만들어서 줌,
- postLogin 컨트롤러에 세션항목 추가
- 각 유저마다 다른 세션 가짐
- req.session.abcd = "abcd"; << session에 저장
req.session.loggedIn = true; << <<
req.session.user = user; << <<
return res.redirect("/");
};
=================
'iHmaFMabkWDEViM-Bvxh5NyzIH5t52Zg': {
cookie: { originalMaxAge: null, expires: null, httpOnly: true, path: '/' },
loggedIn: true,
user: {
_id: '63043fb590e1c94851f12e74',
email: 'joj1043@nate.com',
username: 'joj1043',
password: '$2b$05$wxgktXaauMCpAIMqn6Pe0.WntDkfj3kTm78R0F0ne28/cxWBEAM.C',
name: '동영상',
location: '톳고개로',
__v: 0
}
- req.session 에 정보저장했음 >> template와 공유하는 방법? 밑에서

3. logged in user
- server.js >> console.log(res) >> ~~~~, locals: [Object:null prototype]{} 나옴 >>
- pug template에서 이 locals에 접근가능함
- res.locals.sexy= "you" >>> pug에서 #{sexy} 로 global하게 사용가능함
- >> 이거전용으로 쓸 middlewares.js 생성 & server.js 의 session뒷부분에 app.use(localsMiddleware) 추가
export const localsMiddleware = (req, res, next) => { <<
console.log(req.session);
res.locals.siteName = "Wetube"; <<
next();
};
-----------------------
app.use(
session({ <<
secret: "Hello!",
resave: true,
saveUninitialized: true,
})
);
app.use(localsMiddleware); << <<
- >> userController에서 저장한 res.session.loggedIn >> locals에 저장하기
export const localsMiddleware = (req, res, next) => {
res.locals.loggedIn = Boolean(req.session.loggedIn); << << <<
res.locals.siteName = "Wetube";
res.locals.loggedInUser = req.session.user;
=================
[base.pug]
if loggedIn
li
a(href="/logout") Logout
li
a(href="/my-profile") #{loggedInUser.name} 의 Profile
else
li
a(href="/join") Join
li
a(href="/login") Login