노래하듯 이야기하고, 춤추듯 정복하라.

Node.js에서 Session 다루기 본문

프로그래밍/node.js

Node.js에서 Session 다루기

hyeoke 2018. 1. 1. 19:04

#서두

안녕하세요 모닝버드입니다. 쿠키에 이어 세션에 대해 공부해 보았는데요. 쿠키와 세션을 간단하게나마 배우고 나니 정말 웹에서의 백엔드를 배우는 느낌이 듭니다.  


- 쿠키의 단점을 보완한 세션

Cookie(쿠키)를 생성하게 되면 기본적으로 실제 데이터를 사용자의 pc에 저장하게 됩니다. 데이터가 암호화가 되어있다 하더라도 사용자의 중요한 정보(예를 들면 비밀번호, 주민번호 등)가 pc에 저장되게 되면 탈취/해킹에 대한 위협요소들이 존재하게 되죠. 또한 저장되어 있는 정보들은 서버와 사용자 pc간의 이동이 발생합니다.


하지만 세션은 사용자의 pc에 데이터를 직접적으로 저장하지 않습니다. 실제 데이터는 서버에 보관해 두고 각각의 사용자(PC)들에대한 고유 id 값을 쿠키에 저장하여 기록합니다. 서버는 사용자의 ID값(Cookie에 저장되어 있는)을 비교 및 판단하여 어떤 사용자의 데이터인지와 그 사용자의 접속 여부를 판별할 수 있습니다.


세션의 장점을 정리해보자면 첫째, 각 사용자(PC)들에게 고유한 ID값을 부여함으로서 각 클라이언트에 맞는 서비스를 제공할 수 있습니다. 두 번째, 사용한 사용자의 정보들을 서버에만 저장하기 때문에 보안면에서 쿠키만을 사용하는 것보다 훨씬 우수합니다. 이러한 보안성으로 인해 로그인과 같은 사용자들의 중요 정보를 다루는 처리들은 주로 세션을 이용합니다. 반면에 세션의 단점은 데이터 처리를 위한 서버의 부하와 저장공간이 필요합니다. 


#node.js 프로젝트에서 session 사용하기

Express 엔진을 사용하는 node.js 프로젝트에서 세션을 사용하기 위해서는 별도의 모듈을 설치해야 합니다. 아래의 사진과 같이 커맨드창에서 프로젝트 폴더로 이동한 후 npm install express-session --save 라고 입력해 주시면됩니다.



아래는 express-session 모듈 사용을 위한 설정 코드 입니다. require을 통해 모듈을 임포트 합니다. 다음 app.use를 통해 세부사항을 설정합니다. 


 

#session 간단실습 - login 구현하기

아래는 개인적으로 강의를 들으면서 실습한 코드입니다. 실제에서 사용가능한 로그인 기능은 아닙니다. 세션의 원리를 정확히 파악하고 공부하기 위한 실습이라 세션에 집중해보았는데요, 인증 부분은 var 객체에 1회용 사용자 정보를 저장한 후 일치 여부를 판별하는 정도의 초간단 기능입니다.. ㅎ 


////////////////////////// setting //////////////////////////
// express engin
var express = require('express');
var app = express();

// web server
app.listen(4005, () => console.log('hello 4005 port, this is cookie test'));

// session & session-file-store
var session = require('express-session');
var MySQLStore = require('express-mysql-session')(session);
app.use(session({
  secret: 'asdf3234sdf@#%^@sdfa234ws3s3',
  resave: false,
  saveUninitialized: true,
  store: new MySQLStore({
    host: 'localhost',
    port: 3306,
    user: 'root',
    password: 'newlife4829',
    database: 'o2'
  })
}));

// pug engin
app.set('view engine', 'pug');
app.set('views', './views');
app.locals.pretty = true;

// static
app.use(express.static('static'));

//body-parser
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({extended: true}));
//////////////////////// end setting ////////////////////////

// login
app.get('/auth/login', (req, res) => {
  if(!req.session.displayName){
    res.render('login');
  } else {
    res.redirect('/welcome');
  }
});
app.post('/auth/login', (req, res) => {
  var user = {
    myid : 'junhyeok',
    mypw : '1111',
    displayName: 'Junhyeok'
  };
  var myid = req.body.myid;
  var mypw = req.body.mypw;
  if(myid===user.myid && mypw===user.mypw) {
    // displayName 세션 생성 - 로그인 여부 확인
    req.session.displayName = user.displayName;
    req.session.save(() => {
      res.redirect('/welcome');
    });

  } else {
    res.render('notlogin');
  }
});

// login welcome
app.get('/welcome', (req, res) => {
  if(req.session.displayName) {
    var dName = req.session.displayName;
    res.render('welcome', {dName: dName});
  } else {
    res.render('notwelcome')
  }
  //res.render('login-success');
});

// Logout
app.get('/auth/logout', (req, res) => {
  delete req.session.displayName;
  req.session.save(() => {
    res.redirect('/auth/login');
  });
});


/auth/login 라우터가 첫 번째 화면입니다. 애플리케이션을 실행하면 express-session 모듈에 의해 localhost의 고유한 id가 생성됩니다. 다음 입력한 데이터가 var 객체에 저장되어 있는 유저정보와 일치 할 시 아래의 사진처럼 req.session.displayName에 var 객체의 displayName을 저장하여 session 데이터에 displayName이 추가됩니다. 


/welcome 페이지에서는 displayName의 존재 여부를 확인하여 유저의 로그인 여부를 판별하여 페이지를 render합니다. 로그인을 한 후 애플리케이션을 재시작하여도 로그인 상태는 유지됩니다. 


* 꿀팁 req.session.save((() = {});

req.session.save 메서드 안에 콜백함수 사용하여 redirect 시키기

세션 저장/삭제 처리가 미처 완료되기도 전에 redirect가 실행 될 시 페이지가 정상적으로 작동하지 않을 수 있습니다. 그래서 안전하게 세션 처리에 대한 저장이 완료 된 후 콜백함수를 실행함으로 서 정상적으로 작동하는 페이지로 redirect 시킬 수 있도록 할 수 있습니다. - Egoing님 좋은 꿀팁들 감사합니다 (_--_)  



#express-mysql-session 사용하기

위 실습에서 session의 데이터를 영구히 사용하기 위해 세션 데이터를 따로 데이터베이스에 저장하였는데요. 이 때 사용한 DB는 mysql입니다. nodejs프로젝트에서 세션(Session)데이터를 mysql에 저장하기 위해서는 역시나 따로 모듈을 설치해 줘야합니다. npm install express-mysql-session --save 코드를 커맨드창에 입력하여 간단히 설치할 수 있습니다.


- express-mysql-session 설치 및 설정 방법

https://www.npmjs.com/package/express-mysql-session 



Comments