[node, express] 세션 session

시작에 앞서 쿠키는 웹 브라우저에 저장되는 key = value 타입의 데이터이다 따라서 누구나 key에 따른 value를 알수 있기에 정보를 쉽게 탈취 당할 수 있으므로 중요 정보를 넣는 역할은 적절하지 않다

Session은 이러한 문제점을 고려 쿠키를 업그레이드 했다고 비유해도 무방하지 않다
왜나하면 쿠키와 달리 서버에 데이터를 저장하고 웹 브라우저는 session ID만을 가지고 있기에
비교적 안전하기 때문이다

세션의 동작을 간단하게 나누어 보면

  1. 서버는 웹 브라우저에게 세션 값을 보내준다 (sid 라고 하며, 아무런 의미도 없는 단순 식별자)
  2. 클라이언트가 접속할때 자신이 가지고 있는 sid를 서버에 전달
  3. 서버는 클라이언트가 보내준 sid를 가지고 해당 유저를 식별

대신 저장소를 사용하는 것이 아니기에 공식 사이트에서도 같이 사용할 패키지 등을 설명하고 있다

그중애서 mysql을 사용한다고 치자

(1) express-session 설정

var session = require('express-session');                      (1)
var MySQLStore = require('express-mysql-session')(session);    (2)
var options ={                                                 (3)
    host: 'localhost',
    port: 3306,
    user: '',
    password: '',
    database: ''
};
var sessionStore = new MySQLStore(options);                    (4)

app.use(session({                                              (5)
  secret:"asdfasffdas",
  resave:false,
  saveUninitialized:true,
  store: sessionStore                                          (6)
}))
  1. express-session 모듈을 로드합니다.

  2. express-mysql-session 모듈을 로드하되, 인자로 session을 넘겨줍니다.

  3. 데이터베이스에 접속하는 것이므로, host, port, user, password, database 정보를 객체로 저장해둡니다.

  4. 앞서 저장한 객체를 MySQLStore() 함수의 인자로 넘겨줍니다. 이 때 생성되는 객체를 sessionStore라는 변수에 저장합니다.

  5. session() 미들웨어를 설치합니다. secret은 keyboard cat으로 랜덤한 값을 입력해줍니다. secret 값은 공개되어서는 안됩니다. resave와 saveUninitialized는 세션을 다시 저장하냐, 초기화하냐 정도의 옵션인 것 같은데 저도 잘 모르겠습니다.. 보통 false와 true로 설정한다고 합니다.

  6. 저장소를 앞서 DB 연결로 생성된 sessionStore 객체로 지정합니다. (제가 지정한 DB에 session 테이블이 생성됨을 확인할 수 있습니다.)

(2) session 사용하기

app.get('/login', function(req,rsp){    
    var post = req.body;
    db.query('select member.id as id, password, author_id,name from member left join author on member.author_id = author.id where member.id=? and password=?',
    [post.id,post.password], function(err,result){
        if(err) throw err;
        if(result[0]!==undefined){
            req.session.uid = result[0].id;                            (1)
            req.session.author_id = result[0].author_id;
            req.session.isLogined = true;
            //세션 스토어가 이루어진 후 redirect를 해야함.
            req.session.save(function(){                               (2)
                rsp.redirect('/');
            });
        }
    });
}

DB에서 데이터를 읽고 사용자가 보낸 id,password와 일치하는지 확인하고 일치한다면 세션에 데이터를 기록하는 코드이다
(여기에는 hash없이 비밀번호를 저장하지만 원래는 그렇게 하면 안된다)

express-session을 사용하면 request.sesstion 객체가 생성됨 해당 객체에 property를 할당 함으로써 세션에 값을 줍니다

세션을 세션스토어에 저장이 끝나면 function() 이 실행 save() 부분이 없으면 session store에 저장하는 일보다 redirect가 먼저 실행되어 로그인 상태가 유지가 안되는 버그(?)가 발생할 수 있습니다.

(3) session 데이터 삭제하기

delete req.session.uid;
delete req.session.isLogined;
delete req.session.author_id;

req.session.save(function(){
    rsp.redirect('/');
});

이 방법은 session에 할당되었던 값을 지우는 방법입니다. 이 방법은 세션 자체를 삭제하는 것이 아니므로 DB에 세션값이 삭제되지 않습니다. 위의 코드와 마찬가지로 DB에 반영을 끝낸 후 redirect하는 것이 포인트입니다.

좋은 웹페이지 즐겨찾기