ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 7장 express 를 활용한 session 처리
    MeanStack (deprecated) 2016. 6. 12. 00:08



    이번엔 빠르게 express 를 이용한 session 처리를 알아본다. 


    HTTP는 비연결 지향형 프로토콜이기 때문에 사용자가 요청한 웹 파일의 전송이 끝나면 연결이 끊겨 버린다. 

    이는 웹서버가 모든 HTTP 요청을 독립적으로 처리하는 것 이므로, 만약 session 정보가 없다면, 요청이 올 때마다 

    이전 요청에 대한 정보는 전혀 남아 있지 않기 때문에 , 어떠한 서비스에 로그인을 해서 해당 사용자의 정보를 

    정보를 유지하며 그에 맞는 서비스를 제공하기 위해서는 session 처리는 필수적인 요소이다. 


    session은 웹 서버에서 접속자들의 정보를 구별하는 식별키라고 보면 된다.  

    사용자가 웹 서버에 HTTP 프로토콜로 웹페이지를 요청 할 때 서버는 해당 접속자에 관한 식별키를 쿠키 형식으로 

    사용자의 컴퓨터에 발급하게 되고, 이는 사용자가 요청할 때 마다 쿠키의 식별키와 서버의 세션정보를 비교하여 

    접속자에 맞는 서비스를 제공하게 된다. 


    cookie 방식과 session 방식이 있는데 cookie 방식은 사용자의 모든 정보를 사용자의 컴퓨터에 저장하게 되고 , 

    session 방식은 사용자의 정보는 서버에 저장하고, 그 세션정보에 관한 식별키만 cookie 데이터로 사용자의

    컴퓨터에 저장하기 때문에 당연히 보안적인 측면에서는 session 방식이 훠얼씬 안전하다. 


    express 에서는 session 처리를 하기 위해 express-session 이라는 미들웨어가 존재한다. 

    당장 설치를 해보자. 이제 설치하는 법은 당연히 알고 있을 것 이라고 생각한다.  

    (모듈의 이름은 express-session 이다.)


    express-session 은 세션 식별자를 서명하기위해 , 쉽게 말하면 cookie 에 저장 할 식별키를 지정하기위한

    비밀 문자열을 사용한다. 이 비밀 문자열은 악성세션 위조를 방지하는 과정에 도움을 줄 것 이다.

    이 비밀문자열을 설정하기 위해 config/env 폴더의 developement.js 파일을 변경하자. 


    module.exports = {
        sessionSecret : 'thisissessionSecret'
    }
    



    다음과 같이 sessionSecret 에 비밀문자열을 설정한다. 

    본인은 위 스샷과 같이 설정하였다. 

    참고로 이는 예전에 했던 환경구성에서 처럼 development 즉 , 개발자 환경에서 접속하였을 때의 비밀 문자열

    이다. 추후 사용자 측의 환경을 구성하였을 때 사용자측의 비밀문자열 역시 설정 할 것이다. 


    이제 session-secret 을 express 환경에 넣기 위해 config 폴더의 express_config.js 파일을 수정하자. 


    var express = require('express'), morgan = require('morgan'), compress = require('compression'), bodyParser = require('body-parser'), methodOverride = require('method-override'), config = require('./config'), //New!! session = require('express-session') //New!! ; module.exports = function() { var app = express(); if(process.env.NODE_ENV === 'development') { app.use(morgan('dev')); }else if (process.env.NODE_ENV === 'production') { app.use(compress()); } app.use(bodyParser.urlencoded({ extended : true })); app.use(bodyParser.json()); app.use(methodOverride()); app.use(session({ // New!! start saveUninitialized : true, resave : true, secret : config.sessionSecret })); // end app.set('views', './app/views'); app.set('view engine', 'ejs'); require('../app/routes/index.server.routes.js')(app); app.use(express.static('./static')); return app; }


    먼저 sessionSercret을 추가한 development.js 파일을 불러오기 위해 ./config 를 require 시켰다. 

    (보면 어떤식으로 불러오는지 이해가 되어야 한다.  express_config.js  에서 config.js 를 불러오고 config.js 에서는 

    env 폴더의 development.js 를 불러오도록 되어있다. )

    그리고 session 설정을 위한 express-session 을 require 시킨다. 


    이제 app.use 를 사용하여 session 사용하기 위한 코드를 작성한다. 

    위 session 옵션중 secret 은 해딩 비밀키를 설정하고, (코드를 보면 알겠지만 아까 지정한 비밀키를 불러온다.)

    saveUninitialized 는 초기화되지 않은 세션정보도 저장되는지에 관한 옵션이다 

    resave 는 같은 세션정보라도 다시 저장할건지에 대한 옵션이다.  둘다 기본옵션이 true 이니 true 로 하자. 

    이 3가지 옵션은 꼭 들어가야 한다. 


    이제 session을 설정 하였으니 사용자의 접속정보를 추적하기 위해 app/controllers/ 폴더로 가서 

    index.server.controller.js 를 수정하자. 



    먼저 req.session.lastVisit 이 존재한다면 console 로 lastVisit 를 출력하도록 하였다. 

    이는 사용자가 접속 한 후 다시 접속한다면 그전 접속정보를 보여 줄 것이다. 

    그리고 lastVisit 에는 현재 시간을 지정하였다. 


    exports.render = function(req,res) {
        if(req.session.lastVisit) {
            console.log(req.session.lastVisit);
        }
        var time = new Date();
        req.session.lastVisit = time.getFullYear()+"-"+(time.getMonth()+1)+"-"+time.getDate()+" .. "
        +time.getHours()+"-"+time.getMinutes()+"-"+time.getSeconds();
    
        res.render('index', {title : 'First Title'});
    }
    

    이 코드는 현재의 시간을 보여주는 코드로서 이제 접속하면 사용자의 최종 접속시간이 나타 날 것 이다. 

    자 이제 서버를 키고 접속을 해보자. 

    한번 접속을 한 뒤 서버를 끄지 않고 다시 접속을 해보자.



    위 스샷 같이 세션에 저장된 사용자의 최종 접속시간이 나타날 것 이다.  

    이로써 express 에서 session 처리에 대해 알아 보았다.  


    다음 장에는 mongodb 를 알아보고 연결 해볼 것 이다. 


    (끝)



    (현재 프로젝트 구조) 

    댓글