본문 바로가기

Back-end/JS

nodejs 세션,쿠키 및 인증

nodejs 세션을 통한 로그인/회원가입

가입설정

app.post('/auth/register', function(req, res){
  hasher({password:req.body.password}, function(err, pass, salt, hash){
    var user = {
      username:req.body.username,
      password:hash,
      salt:salt,
      displayName:req.body.displayName
    };
    users.push(user);
    req.session.displayName = req.body.displayName;
    req.session.save(function(){
      res.redirect('/welcome');
    });
  });
});

password 객체를 받아 salt(인코딩된 base64 문자열)을 생성하고 해당 문자열을 통하여
hash(암호화된 값)를 만들어낸다.

그 후 아래 메서드를 통해 세션을 할당하고 저장 한 후 콜백함수로 welcome페이지로 보낸다.
req.session.displayName = req.body.displayName;

requesst에서 session객체를 사용하려면

var session = require('express-session');
 
var FileStore = require('session-file-store')(session);
app.use(session({
  secret: '1234DSFs@adf1234!@#$asd',
  resave: false,
  saveUninitialized: true,
  store:new FileStore()
}));

위 코드를 통하여 미리 설정해주어야 한다

로그인

app.post('/auth/login', function(req, res){
 var uname = req.body.username;
 var pwd = req.body.password;
 for(var i=0; i<users.length; i++){
   var user = users[i];
   if(uname === user.username) {
     return hasher({password:pwd, salt:user.salt}, function(err, pass, salt, hash){
       if(hash === user.password){
         req.session.displayName = user.displayName;
         req.session.save(function(){
           res.redirect('/welcome');
         })
       } else {
         res.send('Who are you? <a href="/auth/login">login</a>');
       }
     });
   }
 }
 res.send('Who are you? 2<a href="/auth/login">login</a>');
});

아이디와 비밀번호를 받아 일치하는 회원이 있는지 찾아준다 (메모리에 저장한 데이터라 for을 이용)
패스워드에 salt값으로 암호환 된 내용과 사용자에게 받은 값을 salt값으로 암호화 한게
맞는지 확인한다.

로그아웃

app.get('/auth/logout', function(req, res){
  delete req.session.displayName;
  res.redirect('/welcome');
});

세션 삭제를 통한 로그아웃 구현

사용자페이지

app.get('/welcome', function(req, res){
  if(req.session.displayName) {
    res.send(`
      <h1>Hello, ${req.session.displayName}</h1>
      <a href="/auth/logout">logout</a>
    `);
  } else {
    res.send(`
      <h1>Welcome</h1>
      <ul>
        <li><a href="/auth/login">Login</a></li>
        <li><a href="/auth/register">Register</a></li>
      </ul>
    `);
  }
});

세션에 해당 사용자가 있을경우는 메세지를 보여주고 아닐 경우는
로그인 페이지 출력

passport.js

app.use(passport.initialize());
app.use(passport.session());

패스포트를 사용하기 위한 미들웨어

app.post(
  '/auth/login',
  passport.authenticate(
    'local',
    {
      successRedirect: '/welcome',
      failureRedirect: '/auth/login',
      failureFlash: false
    }
  )
);

login은 post 로 데이터를 받았을 경우 passport를 통해 검증을 하고
successRedirect는 성공하였을 경우의 링크 는 아닐경우의 링크를
출력한다.

passport.use(new LocalStrategy(
  function(username, password, done){
    var uname = username;
    var pwd = password;
    for(var i=0; i<users.length; i++){
      var user = users[i];
      if(uname === user.username) {
        return hasher({password:pwd, salt:user.salt}, function(err, pass, salt, hash){
          if(hash === user.password){
            console.log('LocalStrategy', user);
            done(null, user);
          } else {
            done(null, false);
          }
        });
      }
    }
    done(null, false);
  }
));

username과 password, 콜백함수를 전달받고
아이디와 패스워드를 통하여 검증을 한 후 콜백함수를 실행한다.
성공하였을 경우에는 데이터를 전달하고 그렇지 않았을 경우 false를 리턴

로그인에 성공을 하였을 경우 아래 메서드를 호출한다.

passport.serializeUser(function(user, done) {
  console.log('serializeUser', user);
  done(null, user.authId);
});

인증이 된 경우 페이지에 접근 시 마다 deserializeUser를 실행하게된다.

assport.deserializeUser(function(id, done) {
          User.findById(id, function(err, user) {
            done(err, user);
          });
        });

db에 계속 요청하기보다 reddis나 세션에 모든 데이터를 집어넣도록 하자.

쿠키

app.use(cookieParser());
 
app.get('/count', function(req,res){
 
  res.cookie('count', 1);
  res.send('count:'+req.cookies.count);
});
 

쿠키값 저장

res.clearCookie("key");

쿠키삭제

app.get('/count', function (req, res) {
 
    if (req.signedCookies.count) {
        var count = parseInt(req.signedCookies.count);
    } else {
        var count = 0;
    }
 
    res.cookie('count', count+1, {signed:true});
    res.send('count:' + req.cookies.count);
});
 
 

signedCookie를 활용한 쿠키 암호화