[Node JS] # Log in
User
1. 유효성 검사
- 중복되는 이메일이나 아이디 등의 에러 해결
- Unique로 설정할 필드에서 중복되는 문제 발생 시 DB에서 에러 발생
- 구현
if (password !== password2) {
return res.render("join", {
pageTitle,
errorMessage: "Password confirmation does not match",
});
}
const exists = await User.exists({ $or: [{ username }, { email }] });
if (exists) {
return res.render("join", {
pageTitle,
errorMessage: "This username/email is already taken.",
});
}
2. Status Codes
- 유효성 검사 후, 중복이나 잘못된 경우로 가입을 해도 크롬은 정상적 작동으로 인식
- Status code 때문인데, 별다른 요청이 없으면 node는 status code 200을 전달 (OK code)
- 여러가지 status code 참조
- https://ko.wikipedia.org/wiki/HTTP_%EC%83%81%ED%83%9C_%EC%BD%94%EB%93%9C
- 구현
res.status(400).render("404", { pageTitle: "Video not found." });
3. Login
- 사용자가 입력하는 패스워드와 DB에 저장된 해싱된 패스워드를 비교
- Bcypt를 이용하여 사용자가 입력한 패스워드를 해싱하여 비교
const ok = await bcrypt.compare(password, user.password);
if (!ok) {
return res.status(400).render("login", {
pageTitle,
errorMessage: "Wrong Password",
});
}
4. Session & Cookie
- 세션: 백엔드와 브라우저 간에 어떤 활동을 했는지 기억하는 것, history, memory
- Stateless: 무연결 상태, 한 번 연결되고 끝나는 것, 둘 사이에 state가 없음
- 세션이 없으면 로그인을 해도 그냥 홈으로 redirect 되고 끝남
- 그래서 유저가 누군지 알 수 있도록 유저가 로그인하면 텍스트를 같이 보냄
- 쿠키: 유저가 웹사이트에 접속할 때마다 브라우저가 자동으로 전송하는 텍스트
- 백엔드에서는 http request를 보내는 모든 유저를 세션에 담아 저장한다. (ex. 브라우저를 id로 저장하는 방식으로)
- 서버를 재시작할 때마다 세션은 초기화 됨
- 백엔드가 세션을 잊지 않도록 DB와 연동해야 함
- 서버 --- 세션 id -- 브라우저 --- 세션 id --- 쿠키 저장,
- 브라우저 --- 쿠키에 저장된 세션 id -- 서버: 브라우저가 보낸 id와 가진 세션 id 비교
- 세션을 이용한 유저 로그인 구현
req.session.loggedIn = true;
req.session.user = user;
- 로그인 유지
Server.js
app.use(
session({
secret: "Hello!",
resave: true,
saveUninitialized: true,
})
);
app.use(localsMiddleware);
Middlewares.js
export const localsMiddleware = (req, res, next) => {
console.log(req.session);
res.locals.loggedIn = Boolean(req.session.loggedIn);
res.locals.siteName = "Wetube";
console.log(res.locals);
next();
};
Author And Source
이 문제에 관하여([Node JS] # Log in), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@choiish98/Node-JS-Log-in
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
if (password !== password2) {
return res.render("join", {
pageTitle,
errorMessage: "Password confirmation does not match",
});
}
const exists = await User.exists({ $or: [{ username }, { email }] });
if (exists) {
return res.render("join", {
pageTitle,
errorMessage: "This username/email is already taken.",
});
}
res.status(400).render("404", { pageTitle: "Video not found." });
const ok = await bcrypt.compare(password, user.password);
if (!ok) {
return res.status(400).render("login", {
pageTitle,
errorMessage: "Wrong Password",
});
}
req.session.loggedIn = true;
req.session.user = user;
Server.js
app.use(
session({
secret: "Hello!",
resave: true,
saveUninitialized: true,
})
);
app.use(localsMiddleware);
Middlewares.js
export const localsMiddleware = (req, res, next) => {
console.log(req.session);
res.locals.loggedIn = Boolean(req.session.loggedIn);
res.locals.siteName = "Wetube";
console.log(res.locals);
next();
};
Author And Source
이 문제에 관하여([Node JS] # Log in), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@choiish98/Node-JS-Log-in저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)