본문 바로가기

Programming/Node.js

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

node js logo image

 

 

 

 

express-session은 세션 관리를 하는 미들웨어 입니다. 로그인 등의 이유로 세션을 구현하거나, 특정 사용자 데이터를 임시로 저장할 때 사용하죠. 세션은 사용자별로 req.session 객체에 유지됩니다. 

 

 

[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'), '번 포트에서 대기');
});

 

 

 

여기서 express-session 사용은 다음과 같이 합니다. 인수로 세션에 대한 설정을 받게 되지요.

 

* 참고로 1.5 버전 이전에는 cookie-parser 사용 때문에 express-session을 뒤에 놓아야 했습니다. 현재는 해결되었지만 일단 뒤에 놓는 것이 안전합니다. 

 

app.use(session({
    resave: false,
    saveUninitialized: false,
    secret: process.env.COOKIE_SECRET,
    cookie: {
        httpOnly: true,
        secure: false,
    },
    name: 'session-cookie',
}));

 

 

 

  • resave : 요청이 올 때, 세션에 수정 사항이 없어도 세션을 다시 저장할지 여부를 설정합니다. 
  • saveUninitialized : 세션에 저장할 내역이 없어도 처음부터 세션을 생성할 것인지 설정합니다.
  • cookie : 세션 쿠키에 대한 설정입니다. express-session은 세션 관리를 위해 클라이언트에 쿠키를 보냅니다(앞선 아티클에서 세션을 공부할 때 살펴본 세션 쿠키).안전한 쿠키 전송을 위해 서명을 추가하고, 여기에 secret 값이 사용됩니다. 참고로 이 경우 cookie-parser의 secret과 같이 설정하는 것을 추천합니다. 세션 쿠키의 이름은 name 옵션으로 설정합니다. 기본은 connect.sid입니다.

    > maxAge, domain, path, expires, sameSite, httpOnly, secure 등의 일반 쿠키 옵션을 모두 사용할 수 있습니다.
    > httpOnly : true를 사용해 클라에서 쿠키 확인을 방지 했습니다.
    > secure : false로 설정해 https가 아닌 환경에서도 사용할 수 있게 했습니다(라이브는 변경 필요).
  • store : 세션 저장을 위한 옵션입니다.