안녕하세요
MongoDB - 세션방식 로그인 기능 구현 본문
세션방식을 통한 로그인 기능 구현
1. 세션 로그인이 뭐고 어떻게 동작하는 건가요?
회원가입을 하면 ID와 Password 를 DB에 저장합니다.
유저가 로그인을 하면 DB에 저장된 ID와 Password가 존재할 때 로그인을 시켜주는데
이 때 유니크한 session id를 만들어줍니다.
그리고 유저의 브라우저 쿠키에 session id 를 저장시킵니다.
유저가 로그인이 필요한 활동을 할 때 쿠키에 담겨져 있는 session id를 DB의 seesion id와 비교하여 통과시켜줍니다.
로그인하면 session id 발급, DB에 session id 저장 >
유저 브라우저 쿠키에 발급된 session id 저장 됨 >
로그인 필요 활동 시 브라우저 쿠키의 session id와 DB의 session id 대조
2. 세팅하기
라이브러리 3개 설치하기
npm install passport passport-local express-session
module 불러오고 middleware 세팅하기
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const session = require('express-session');
// '비밀코드'에는 아무런 비밀번호나 넣으면 됩니다.
app.use(session({secret : '비밀코드', resave : true, saveUninitialized: false}));
app.use(passport.initialize());
app.use(passport.session());
3. 로그인 form 만들기
<form action="/login" method="POST">
<input type="text" class="form-control" name="id" />
<input type="text" class="form-control" name="password" />
<button type="submit" class="btn btn-outline-secondary">Submit</button>
</form>
4. GET으로 페이지 만들기
app.get("/login", (요청, 응답) => {
응답.render("login.ejs");
});
5. POST로 로그인 성공/실패 시 수행할 동작 설정하기
app.post("/login", passport.authenticate("local", {
=> local 방식으로 하겠다. (그게 뭔지는 모름)
failureRedirect: "/fail",
=> 인증 실패 시 '/fail' 경로로 이동시키기
}),
(요청, 응답) => {
응답.redirect("/");
=> 인증 성공 시 '/' 경로로 이동시키기
}
);
6. id와 password를 검증하는 과정
passport.use(
new LocalStrategy(
{
// 유저가 form에 입력한 name 속성을 넣어주기
usernameField: "id",
passwordField: "password",
// 로그인 후 세션 저장여부
session: true,
// id, password 이외에 검증할 정보를 callback의 req에 담을지 여부(안써서 모름)
passReqToCallback: false,
},
// id, password 검증 과정. 서버에러 있니? id/password일치하니? 검증
function (입력한아이디, 입력한비번, done) {
db.collection("login").findOne({ id: 입력한아이디 }, function (에러, 결과) {
// done의 인자는 각각 (서버에러, 성공 시 유저DB데이터/실패 시 false넣기, 출력할 에러메시지)
if (에러) return done(에러);
if (!결과) return done(null, false, { message: "존재하지않는 아이디요" });
if (입력한비번 == 결과.password) {
return done(null, 결과);
} else {
return done(null, false, { message: "비번틀렸어요" });
}
});
}
)
);
7. 검증한 뒤 결과의 id를 가지고 세션을 만들고 쿠키로 보내기
if (입력한비번 == 결과.password) {
return done(null, 결과);
위의 결과가 user 인자로 들어가게 되고,
passport.serializeUser(function (user, done) {
done(null, user.id);
});
serializeUser 메서드가 유저의 id를 바탕으로 세션데이터를 만들고,
이를 쿠키로 만들어서 브라우저에 저장시킵니다.
'스터디 > 코딩애플' 카테고리의 다른 글
MongoDB - env 환경변수로 가변적 데이터나 숨길 데이터 다루기 (0) | 2023.01.05 |
---|---|
MongoDB - 로그인 한 유저만 접속 가능한 페이지 (0) | 2023.01.05 |
MongoDB - 수정하기 PUT요청 (updateOne) (0) | 2023.01.04 |
MongoDB - server에 css, 부트스트랩 약간, ejs로 html 조립식 (0) | 2023.01.04 |
MongoDB - 상세페이지 (0) | 2023.01.03 |