본문 바로가기
Server/Node.js

로그인 기능 만들기 Session (2) - 아이디 비밀번호 DB와 비교하고 세션 만들어주기

by print_soo 2023. 9. 6.

해당 글은 이전 글들의 작업을 이어서 진행되고 있는 글입니다.

 

 

1. 유저가 아이디를 로그인하면 서버에서 DB에 해당 id, pw가 있는지 확인한다.
2. 해당 id, pw가 있으면 DB에 세션데이터를 저장한다.
3. 유저 브라우저로 쿠키에 세션 아이디를 담아서 전달한다.
4. 마이페이지 같은 페이지로 이동 요청을 하면 쿠키로 세션 아이디를 DB로 담아서 보낸다.
5. DB에서는 해당 세션 아이디가 세션 데이터에 있는지 확인 후 마이페이지를 띄울지 말지를 응답한다. 

 

이번에는 1번 기능 심화와 2, 3번 기능을 만들어보려고 한다. 

 

 

1. 아이디와 비밀번호가 DB에 있는 데이터와 맞는지 비교하기

passport.use(new LocalStrategy({
    usernameField: 'id',
    passwordField: 'pw',
    session: true,
    passReqToCallback: false,
}, function (enteredID, enteredPW, done) {
    //console.log(입력한아이디, 입력한비번);
    db.collection('login').findOne({ id: enteredID }, function (error, result) {
        if (error) return done(error)

        if (!result) return done(null, false, { message: '존재하지 않는 아이디 입니다.' })
        if (enteredPW == result.pw) {
            return done(null, result)
        } else {
            return done(null, false, { message: '맞지 않는 비밀번호 입니다.' })
        }
    })
}));

 

위의 function 내부에 있는 코드를 해석하자면 아래와 같다. 

1. login 콜렉션에서 id: 입력한 id인 데이터를 찾는다. 
2. 결과가 없다면 실패 메세지를 띄운다.
3. 해당 데이터가 있고 입력한 비밀번호가 login 콜렉션에 있는지 확인한다.
4. 해당 비밀번호가 맞으면 결과를 반환하고, 없다면 실패 메세지를 띄운다. 

 

사실은 비밀번호 검증을 하기전 애초에 DB에 비밀번호를 저장할 떄 암호화해서 저장해주어야 하지만 그렇게하면 복잡해지기 때문에 생략하도록 한다.

 

 

참고로 done에 대해서 이야기하자면 아래와 같다.

done()에는 3개의 매개변수가 있는데 3개의 변수 역할은 done( 서버 에러, 성공 시 사용자 DB 데이터,  에러메시지)

만약 아이디와 비밀번호가 맞지 않으면 두번 째 매개변수에 false를 입력해야한다. 

 

 

2. 세션 데이터를 만들어 DB에 저장하고 세션 데이터에 포함된 세션 아이디를 발급해서 유저에게 쿠키로 만들어서 전달하기

 

세션 데이터를 만들고 세션 아이디를 만들어서 보내주는 것은 라이브러리의 도움을 받으면 간단해진다. 

passport.serializeUser(function (user, done) {
  done(null, user.id)
});

passport.deserializeUser(function (아이디, done) {
  done(null, {})
});

 

serializeUser 함수(로그인 성공 시 발동)

  • 유저의 id 데이터를 바탕으로 세션데이터를 만들어준다,
  • 세션데이터의 아이디를 쿠키로 만들어서 사용자의 브라우저로 보내줍니다. 

 

deserializeUser 함수(마이페이지 접속 시 발동)

  • 세션 데이터를 가진 유저를 DB에서 찾아준다.

 

 

3. 테스트 해보기

올바른 아이디와 비밀번호로 로그인을 하면 application에 보면 쿠키가 있는 확인할 수 있다.