본문 바로가기

Programming/Node.js

7. 익스프레스 (1) - 미들웨어 [8] : express-session 2

node js logo image

 

 

 

 

[app.js]

 

const express =require('express');
const morgan = require('morgan');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const dotenv = require('dotenv');
const path = require('path');

dotenv.config();
const app = express();
app.set('port', process.env.PORT || 3000);

app.use(morgan('dev'));
app.use('/', express.static(path.join(__dirname, 'public')));
app.use(express.json());
app.use(express.urlencoded( {extended: false} ));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(session({
    resave: false,
    saveUninitialized: false,
    secret: process.env.COOKIE_SECRET,
    cookie: {
        httpOnly: true,
        secure: false,
    },
    name: 'session-cookie',
}));

app.use((req, res, next) => {
    console.log('모든 요청에 실행됨');
    next();
});

app.get('/', (req, res, next) => {
    console.log('GET / 요청에서만 실행됨');
    next();
}, (req, res) => {
    throw new Error('에러는 에러 처리용 미들웨어로 전달');
});

app.use((err, req, res, next) => {
    console.error(err);
    res.status(500).send(err.message);
});

app.listen(app.get('port'), () => {
    console.log(app.get('port'), '번 포트에서 대기');
});

 

 

앞선 아티클에서 예제에는 없지만 store라는 옵션이 있다고 설명했습니다. 현재는 메모리 상에 세션을 저장하는 상태인데, 이는 서버를 재시작할 경우 메모리가 초기화 되고 세션이 모두 사라진다는 것을 의미합니다. 그래서 실제 라이브 배포 진행 시에는 store에 데이터베이스를 연결하여 세션을 유지하는 것을 권합니다. 이 경우 주로 Redis를 사용하며, 이는 추후 별도로 살펴볼 예정입니다. 

 

 

 


 

 

 

express-session으로 만들어진 req.session 객체에 값을 대입하거나, 삭제함으로써 세션을 변경할 수도 있습니다. 

 

req.session.name = 'johndoe';	// 세션 등록
req.sessionID;	// 세션 아이디 확인
req.session,destroy();	// 세션 모두 제거하기

 

 

세션을 한번에 삭제하려면 req.session.destroy 메서드를 호출합니다. 현재 세션의 아이디는 req.sessionID(or req.session.id)로 확인이 가능하죠. 세션 강제 저장은 req.session.save 메서드로 가능하짐나, 대부분 요청이 끝날 때 자동 호출 되므로 직접 호출하는 경우는 거의 없습니다. 

 

참고로 로그인 할 경우 세션 쿠키의 모양은 조금 독특합니다. 나중에 구현 할 때 살펴보겠지만 미리 예습하는 셈 알아보면 express-session에서 서명한 쿠키 앞에는 s:가 붙습니다. 실제로는 encodeURIComponent 함수가 실행되어 s%3A가 됩니다. 

 

크롬 개발자 도구의 Cookies에서 살펴볼 경우 Name connect.sid의 Value가 s%3AyULCXBpr274m8Fbikjid....이런 형태가 되는데 s%3A의 뒷부분이 실제 암호화된 쿠키 내용입니다. 이렇게 s%3A가 붙은 경우, 이 쿠키가 express-session 미들웨어에 의해 암호화 된 경우 입니다.