본문 바로가기

Back End/Server

[Server] node.js 자동 로그인 구현 (Cookie + Session 활용)

[Server] node.js 자동 로그인 구현 (Cookie + Session 활용)


개요

  Cookie(쿠키)와 Session(세션)을 통해 자동로그인 로직을 구현해본다.

 

목차

 

소개

 1. app.js 설정 

 

app.js 설정

Client가 로그인 요청을 하면 Server는 요청한 Client와의 Session을 열어준다.

 

app.js

this.app.use(cookieParser()); //Cookie 값을 읽기 위한 setting
this.app.use( //session을 저장하기 위한 setting
  session({
  secret: process.env.SESSEONKEY,
  resave: false, //request 마다 session값이 변경이 없으면 resave 하지 않음.
  saveUninitialized: true, //초기화 되지 않은 session의 강제 저장 여부
  cookie: { secure: false, maxAge: 24 * 60 * 60 * 30 }, //보안: false, maxAge: 30일
  }),
);

 

 2. 자동 로그인 시 Cookie값 설정 및 Session값 설정 

 

Cookie 설정
let date = new Date();
date = date.toISOString().slice(0, 10);
res.cookie('omg_last_login', date, { //'omg_last_login'을 이름으로 하는 cookie 생성
  expires: new Date(Date.now() + 24 * 60 * 60), //유효기간: 1일
  httpOnly: true,
});

 

로그인 요청 (POST)
router.post('/login', function (req, res) {
  if (!req.body.keepLogIn) { //자동 로그인이 아니라면 session과 cookie 생성
    passport.authenticate('local-login', (err, user, message) => {
      if (!user) res.send(message);
      return req.login(user, loginError => {
        if (loginError) next(loginError);
        else {
          let date = new Date();
          date = date.toISOString().slice(0, 10);
          res.cookie('omg_last_login', date, {
            expires: new Date(Date.now() + 24 * 60 * 60),
            httpOnly: true,
          });
          res.send(baseResponse.SUCCESS);
        }
      });
    })(req, res, next);
  } else { //자동 로그인 시 session값만 생성
      passport.authenticate('local-login', (err, user, message) => {
        if (!user) res.send(message);
        return req.login(user, loginError => {
          if (loginError) next(loginError);
          else res.send(baseResponse.SUCCESS);
        });
      })(req, res, next);
    }
}

 

 3. 구현 Logic 

 

 

로그인 요청 (GET)
자동 로그인 요청시 일반 로그인 요청시
세션 값 생성 (유효기간 30일) 세션 값 생성 (유효기간 30일) + 쿠키 생성 (유효기간 1일)

cookie 정보에서 확인 할 수 있는 값들

로그인 페이지로 이동
'omg_last_login' 쿠키 값 존재 여부 확인session 값 확인
router.get('/login', function (req, res) {
  if (req.cookies.omg_last_login) {
    let date = new Date();
    date = date.toISOString().slice(0, 10);	 //ex)2022-02-10
    if (date == req.cookies.omg_last_login) { //omg_last_login 이 오늘인 경우
      if (req.user) res.redirect('/');        //session 값이 존재하는 경우
      else res.render('account/login.ejs');   //session 값이 존재하지 않는 경우
    } else { //omg_last_login cookie가 오늘 날짜가 아닌 경우 (로그인 시간 만료)
        if (req.user) { //로그인 시간이 만료되었으나 session 값이 남아 있는 경우
        req.logout();   //session 값 파기 후 login 페이지로 이동
        req.session.destroy(() => {
        req.session;
        });
      }
      res.render('account/login.ejs'); //로그인 시간도 만료되었고 session 값도 없으므로 login 페이지 이동
    }
  } else if (req.user) res.redirect('/'); //omg_last_login cookie가 없고 session값만 있는 경우 (=자동 로그인으로 로그인)
  else res.render('account/login.ejs'); //그 외의 경우는 로그인 시도가 없던 것이므로 로그인 페이지로 이동
},

 

❕ 조금 불필요한 자원들이 소모되도록 구현된 자동 로그인이라 조금 더 가다듬어서 활용 해야 할 것 같다.