Express-session

Express-session은 Express 프레임워크에서 세션을 관리하기 위해 사용하는 미들웨어다.

Express-session을 통해 로그인과 로그아웃을 구현해 보자.

 

Express에 적용

var session = require('express-session');

app.use(session({
 secret: '@#@$MYSIGN#@$#$',
 resave: false,
 saveUninitialized: true
}));

secret – 쿠키를 임의로 변조하는것을 방지하기 위한 값. 이 값을 통하여 세션을 암호화 하여 저장한다.

resave – 세션을 언제나 저장할 지 (변경되지 않아도) 정하는 값이다. express-session documentation에서는 이 값을 false 로 하는것을 권장하고 필요에 따라 true로 설정한다..

saveUninitialized – 세션이 저장되기 전에 uninitialized 상태로 미리 만들어서 저장한다.

 

세션 초기 설정 (initialization)

app.get('/', function(req, res){
    sess = req.session;
});

라우터 콜백함수 안에서 req.session으로 세션에 접근 할 수 있다.

 

세션 변수 설정

app.get('/login', function(req, res){
    sess = req.session;
    sess.username = "velopert"
});

따로 키를 추가해줄 필요 없이 sess.[키 이름]=값 으로 세션변수 설정이 가능하다.

 

세션 변수 사용

app.get('/', function(req, res){
    sess = req.session;
    console.log(sess.username);
});

세션 변수는 위와같이 하면 사용이 가능하다

 

세션 제거

req.session.destroy(function(err){
   // cannot access session here
});

세션을 제거할때는 destroy메소드를 사용한다.

destroy()의 콜백함수에서는 세션에 접근 할 수 없다.

이제 세션을 Rest API에 하나씩 적용해보자.

 

LOGIN API

    app.get('/login/:username/:password', function(req, res){
        var sess;
        sess = req.session;

        fs.readFile(__dirname + "/../data/user.json", "utf8", function(err, data){
            var users = JSON.parse(data);
            var username = req.params.username;
            var password = req.params.password;
            var result = {};
            if(!users[username]){
                // USERNAME NOT FOUND
                result["success"] = 0;
                result["error"] = "not found";
                res.json(result);
                return;
            }
            if(users[username]["password"] == password){
                result["success"] = 1;
                sess.username = username;
                sess.name = users[username]["name"];
                res.json(result);
            }else{
                result["success"] = 0;
                result["error"] = "incorrect";
                res.json(result);
            }
        })
    })

(router/main.js에 추가)

로그인에 성공했을때 세션에 username과 name을 저장하게 했다.

 

LOGOUT API

로그아웃을 위해서 router/main.js에 추가하자.

	app.get('/logout', function(req, res){
        sess = req.session;
        if(sess.username){
            req.session.destroy(function(err){
                if(err){
                    console.log(err);
                }else{
                    res.redirect('/');
                }
            })
        }else{
            res.redirect('/');
        }
    })

로그아웃하면 메인페이지로 redirect된다

 

메인페이지 수정

메인페이지에서 세션을 조회 할 수 있게 수정해주자

라우터 상단의 app.get('/'...)부분을 업데이트해주자

	app.get('/',function(req,res){
         var sess = req.session;


         res.render('index', {
             title: "MY HOMEPAGE",
             length: 5,
             name: sess.name,
             username: sess.username
         })
     });

세션 변수가 EJS 템플릿에 전달된다

이제 EJS 파일을 수정해주자

 

view/body.ejs

<h1>Loop it!</h1>
<ul>
    <% for(var i=0; i<length; i++){ %>
        <li>
            <%= "LOOP" + i %>
        </li>
    <% } %>
</ul>

<% if(username){ %>
    <h2>Welcome! <%= username %> (name: <%= name %>)</h2>
<% }else{ %>
    <h2> Please Login. </h2>
<% } %>

로그인 되어있는지 체크하고 로그인중이면 환연메시지를.

그렇지 않다면 로그인 하라는 메시지를 띄운다.

 

테스트

1. http://localhost:3000/ 접속

2. http://localhost:3000/user/pass 접속 (유저 데이터는 본인 데이터로 입력하면 된다)

3. http://localhost:3000/ 재접속

4. http://localhost:3000/logout 접속

 


WRITTEN BY
Clasha

,