Node.js에서는 일반적으로 세션을 사용 및 관리하고 서버와 클라이언트 브라우저 간의 세션 상태를 저장하기 위해 express-session 패키지를 사용합니다. 그렇다면 사용자가 현재 페이지를 새로 고치거나 페이지의 버튼을 클릭할 때 세션 만료 시간을 어떻게 달성할 수 있을까요? ASP.NET의 세션 상태와 유사하게 페이지가 특정 기간 동안 활성 상태로 유지되는 한 세션은 만료되지 않습니다. 이 기능은 다음 코드를 통해 구현할 수 있습니다. Node.js 코드에 다음 미들웨어를 추가합니다.
// use this middleware to reset cookie expiration time // when user hit page every time app.use(function(req, res, next){ req.session._garbage = Date(); req.session.touch(); next(); });
이러한 방식으로 요청이 들어올 때마다 미들웨어는 원하는 효과를 얻기 위해 세션 만료 시간을 다시 수정합니다.
그런 다음 코드에 세션 사용을 추가합니다.
app.use(session({ secret: 'test', resave: false, saveUninitialized: true, cookie:{ maxAge: 1000*60*60 // default session expiration is set to 1 hour }, store: new MemcachedStore({ hosts: ['127.0.0.1:9000'], prefix: 'test_' }) }));
위 세션에서는 세션 저장 방식으로 memcached를 사용하고 있습니다. memcached 사용 방법은 Github https://github.com/balor/connect-memcached
에서 참고하실 수 있습니다.
물론 memoryStore, redis, mongoDB 등 다른 세션 저장 방법을 사용할 수도 있으며 사용 방법은 유사합니다.
Node.js 세션 저장의 여러 가지 방법에 대해 이야기하겠습니다
Node.js 세션 저장소에는 다음과 같이 성능 테스트를 위한 네 가지 선택적 방법이 있습니다.
Concurrency: 1 none 4484.86 [#/sec] memory 2144.15 [#/sec] redis 1891.96 [#/sec] mongo 710.85 [#/sec] Concurrency: 10 none 5737.21 [#/sec] memory 3336.45 [#/sec] redis 3164.84 [#/sec] mongo 1783.65 [#/sec] Concurrency: 100 none 5500.41 [#/sec] memory 3274.33 [#/sec] redis 3269.49 [#/sec] mongo 2416.72 [#/sec] Concurrency: 500 none 5008.14 [#/sec] memory 3137.93 [#/sec] redis 3122.37 [#/sec] mongo 2258.21 [#/sec]
비교를 보면 Redis 스토리지는 동시성이 많을수록 성능이 더 뛰어난 것으로 나타났습니다.
세션에서 사용하는 페이지는 매우 간단한 페이지입니다.
app.get("/", function(req,res){ if ( req.session && req.session.user_id){ req.session.no = req.session.user_id; } else { throw Error('error'); } res.send("No: " + req.session.no);});
Redis 스토어 구성:
app.use(express.session({ store: new RedisStore({ host: 'localhost', port: 6379, db: 2, }), secret: 'hello'}));
몽고 스토어 구성:
app.use(express.cookieParser());app.use(express.session({ store: new MongoStore({ url: 'mongodb://localhost/test-session' }), secret: 'hello'}));
mongodb 저장소를 사용할 때 모듈을 로드하는 것을 잊지 마세요: connect-mongo