• [nodejs] redis session 저장소 관리 :: 마이구미
    Nodejs 2017. 1. 8. 14:54

    이번 글은 redis 서버를 통한 세션 관리를 다뤄본다.

    nodejs의 express 프레임워크를 사용하여 예제를 진행한다.


    현재 NoSQL의 일종으로 redis는 많은 목적으로 활용되고 있다.

    redis란 무엇인가? 위키의 정의를 보자.


    레디스(Redis)는 오픈 소스이며 네트워크화, 인메모리 데이터베이스, 선택적 영구성 키-값 데이터 저장소이다. 레디스의 개발은 2013년 5월부터 Pivotal의 지원을 받고 있으며, 그 전에는 VMWare의 지원을 받았다. DB-Engines.com의 월간 랭킹에 따르면, 레디스는 가장 인기 있는 키-값 저장소이다.

    * 인메모리 데이터베이스(In-Memory Cache) - I/O 성능을 위해 데이터를 메모리에 적재하는 데이터베이스


    redis를 들어봤다면 "빨라. mysql 쓰는 거보다 10배이상 빨라." 라는 말을 들어봤을 것이다.

    redis가 빠른 이유는 아래와 같다.

    1. I/O 성능 개선을 위해 디스크가 아닌 I/O가 가장 빠른 메모리에 저장함으로써 빠르다.

    2. 단순한 구조의 key-value 방식으로써 빠른 속도를 지원한다.

    * 메모리와 디스크 개념 차이


    이번 글에서는 로그인/로그아웃과 관련되어 redis를 활용한다.

    redis를 사용한다면 세션을 보다 효율적으로 관리할 수 있다.

    기존의 세션값을 redis서버로 분리되어진다.

    이로써 여러개의 서버를 사용할 경우 세션값을 하나의 redis 서버로 통합하여 관리할 수 있다.


    그렇다면 이제 실습을 통해 확인해보자.


    npm install express-session // 세션

    npm install connect-redis // 레디스

    위와 같이 필요한 패키지를 설치한다.

    기본적으로 레디스 저장소를 생성하는 방법은 아래와 같다.


    app.js

    var redis = require('./redis.js');


    app.use(session({

        store: new RedisStore({

            client: redis,

            host: 'localhost',

            port: 6379,

            prefix : "session:",

            db : 0,

            saveUninitialized: false,

            resave: false

        }),

        secret: {keyboard cat},

        cookie: { maxAge: 2592000000 }

    }));

    redis.js

    var redis = require('redis');


    var redisClient = redis.createClient({port},{host});


    redisClient.auth({password}, function (err) {

        if (err) throw err;

    });


    redisClient.on('error', function(err) {

        console.log('Redis error: ' + err);

    });


    module.exports = redisClient;

    레디스를 사용할 때 연동이 안되면 레디스가 연결이 안됐을 가능성이 가장 크므로 error를 통해 확인해보면 된다.



    자세한 사항은 문서를 확인하자. npmjs 문서 페이지


    레디스가 연동되었다고 한다면, 다음을 진행해보자.

    로그인 시 세션을 저장.

    - 로그아웃 시 세션을 삭제.

    - 로그인이 되어있으면 특정 페이지 이동. 그렇지 않다면 HOME 페이지 이동.


    기본적으로 세션을 접근하는 방식은 아래와 같다.

    req.session.{key} = value;


    req.session.key = '123'; // 'key' 라는 key에 '123' value 삽입.

    req.session.uid = 'ABCD';// 'uid' 라는 key에 'ABCD' value 삽입.


    req.session.destroy(); // 레디스 서버에 저장된 세션 삭제.

    app.js

    app.get('/',function(req,res){ // 세션값이 있으면 if(req.session.key) { res.redirect('/admin'); } else { // 없으면 홈으로 이동 res.render('index.html'); } });


    app.post('/login',function(req,res){ // 로그인 시 key값을 email로 session 저장 req.session.key=req.body.email; res.end('done'); });


    app.get('/logout',function(req,res){ // 로그아웃 시 세션 삭제 req.session.destroy(function(err){ if(err){ console.log(err); } else { res.redirect('/'); } }); });


    세션이 저장된다면 redis 명령어를 통해 세션을 확인할 수 있다.

    keys * // 모든 key 검색

    get {key} // key에 대한 value 검색


    레디스 세션 확인


    세션의 상태를 위와 같이 확인할 수 있다.

    다양한 목적으로 사용되고 있는 redis이지만, 이 글에서는 간단하게 로그인/로그아웃 관련해서 다뤄보았다.

    기존의 방식처럼 db에 계속해서 요청을 날려 확인하는 것보다, redis 서버에 요청함으로써 DB 부하를 감소할 수 있을뿐만 아니라, 세션을 보다 안정적이고, 효율적으로 관리할 수 있게 된다.

    db를 사용해야한다하더라도, 우선 redis를 먼저 거치게 한다면 보다 효율적이다.

    이렇게 redis를 추가하는 것이 부담스러운 게 아니라, 훨씬 효율적인 프로세스가 된다.

    아래 이미지를 본다면, 이해가 빠를 것이다. (Cache 서버 == Redis 서버)


    redis 장점



    passport를 활용한 sns 로그인들을 통해 redis 관리하면 효율적인 프로세스가 된다.

    자세한 것은 Github 소스를 통해 확인해보길 바란다.


    Github redis session example

    https://github.com/hotehrud/bootstrap1


    Github redis session + passport example

    https://github.com/hotehrud/router_mvc



    댓글 0

Designed by Tistory.