Session 이란?

서버가 해당 서버에 접근하는 클라이언트를 식별하는 방법 중 하나

서버는 접근하는 클라이언트에게 response-header field인 set-cookie 값으로 클라이언트 식별자인 session-id를 발행한다.

HTTP Session 동작 순서

클라이언트가 서버로 http 요청을 할 때, 서버에서 request-header field인 cookie를 확인해 해당 session-id를 보내왔는지 확인한다.

만약 없다면 session-id를 생성해 클라이언트에게 response-header field에 set-cookie 값으로 session-id를 발행한다.

이 때 발행된 쿠키는 메모리(브라우저)에 저장되며, 세션 종료시 같이 종료된다.

Node js에서 Session 관리

Node.js에서는 express-session이라는 모듈을 사용한다.

npm install --save express-session

우선 간단한 예제를 보자. 아래 예제는 express-session 미들웨어를 추가하는 예제이다.

  • secret : 세션 식별자를 쿠키에 저장하기 전에 암호화하기 위해 필요한 옵션

  • resave : 요청이 왔을 때 세션을 수정하지 않고 세션을 다시 저장소에 저장 여부

  • saveUninitialized : 초기화 되지 않은 세션을 강제로 저장.

const express = require('express');
const app = express();
const session = require('express-session');
 
app.use(session({
    secret: 'mySecret',
    resave: false,
    saveUninitialized: true
    // cookie: {secure: true }
}));

위에서 말했듯이 session을 사용하게 되면 브라우저에 세션에서 할당되는 session-id 값을 지닌 쿠키가 생성된다.



처음에는 저장된 쿠키가 없지만 아래의 코드를 추가시켜 보자. express-session 미들웨어를 추가시켰고 해당 미들웨어에서 세션에 대한 정보를 req.session으로 받는다.

app.get('/login', (req, res) => {
  var session = req.session;
 
  session.userId = 'test';
  session.userPw = '1234';
 
  res.json(req.session);
});

http://localhost:3000/login 으로 접속하여 보자.

쿠키가 생성이 되었음을 확인할 수 있다. connect.sid라는 이름으로 value는 secret 값이 추가되어 암호화된 임의의 문자열로 저장이 되어있을 것이다.


아래 코드를 추가시키고 /home으로 접속하면 저장된 쿠키를 통해 저장된 세션으로부터 userId와 userPw를 가져올 수 있다.

app.get('/home', (req, res) => {
  var session = req.session;
 
  res.json({
    userId: session.userId,
    userPw: session.userPw
  })
});
 

쿠키를 삭제 하고 싶다면 아래의 코드를 참조하자.

app.get('/delete', (req, res) => {
  req.session.destroy(function(err) {
    if(err) {
      res.end(err);
    }
 
    res.json({
      message: "success delete"
    })
  })
});

이외에도 cookie의 maxAge 를 변경할 수도 있다.

app.get('/maxage', (req, res) => {
  var hour = 3600000;
 
  req.session.cookie.expires = new Date(Date.now() + hour);
  req.session.cookie.maxAge = hour;
  req.session.userId = "test3";
 
  res.json(req.session);
});

정리


express-session을 사용하면 session 기반 인증 서버를 구현할 수 있다.

추가적으로 express-session npm site 에 접속하면 각 옵션들에 대한 자세한 정보가 있으니 확인해보면 좋을 것 같다.

곧 포스팅할 passport 역시 session을 기반으로 하기 때문에 session, cookie에 대한 이해를 위해 추가적으로 검색을 해보는 것도 좋을 것 같다.

'Framework > Nodejs' 카테고리의 다른 글

error handler  (0) 2018.01.14
pm2에 대해 알아보자  (0) 2017.10.06
[마이크로서비스] 세네카와 익스프레스 연동  (0) 2017.10.02
[마이크로서비스] Seneca  (0) 2017.10.02
비동기와 CPU Bound  (0) 2017.09.04

+ Recent posts