프로그래밍 언어/NODE JS

expression-session

· 코딩마이데이

세션 관리용 미들웨어입니다. 로그인 등의 이유로 세션을 구현하거나 특정 사용자를 위한 데이터를 임시적으로 저장해둘 때 매우 유용합니다. 세션은 사용자별로 req.session 객체 안에 유지됩니다.

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

 

express-session 1.5 버전 이전에는 내부적으로 cookie-parser를 사용하고 있어서 cookie-parser 미들웨어보다 뒤에 위치해야 했지만, 1.5 버전 이후부터는 사용하지 않게 되어 순서가 상관없어졌습니다. 그래도 현재 버전을 사용하고 있는지 모른다면 cookie-parser 미들웨어 뒤에 놓는 것이 안전합니다.

express-session은 인수로 세션에 대한 설정을 받습니다. resave는 요청이 올 때 세션에 수정 사항이 생기지 않도라도 세션을 다시 생기지 않더라도 처음부터 세션을 생성할지 결정하는 것입니다. 현재는 둘 다 필요 없으므로 false로 했습니다.

express-session은 세션 관리 클라이언트에 쿠키를 보냅니다. 안전하게 쿠키를 전송하려면 쿠키에 서명을 추기해야 하고, 쿠키를 서명하는 데 secret의 값이 필요합니다. cookie-parser의 secret과 같게 설정하는 것이 좋습니다. 세션 쿠키의 이름은 name 옵션으로 설정합니다. 기본 connect.sid입니다.

cookie 옵션은 세션 쿠키에 대한 설정입니다. maxAge, domain, path, expires, sameSite, httpOnly, secure등 일반적인 쿠키 옵션이 모두 제공합니다. 현재 httpOnly를 true로 설정해 클라이언트에서 쿠키가 확인하지 못했도록 했고, secure는 false로 해서 https가 아닌 환경에서도 사용할 수 있게 했습니다. 배포 시에는 https를 적용하고 secure도 true로 설정하는 것이 좋습니다.

예제 코드에는 나와 있지 않지만, store라는 옵션도 있습니다. 현재는 메모리에 세션을 저장하도록 되어 있습니다. 문제는 서버를 재시작하면 메모리에 초기화되어 세션이 모두 사라진다는 것입니다. 따라서 배포시에는 store에 데이터베이스를 연결하여 세션을 유지하는 것이 좋습니다. 보통 레디스가 자주 쓰입니다.

req.session.name = 'sally'; // 세션 등록
req.sessionID; // 세션 아이디 확인
req.session.destory(); // 세션 모두 제거

 

express-session으로 만들어진 req.session 객체에 값을 대입하거나 삭제해서 세션을 변경할 수 있습니다. 나중에 세션을 한 번에 삭제하려면 req.session.destory 메서드를 호출하면 됩니다.

현재 세션의 아이디나 req.sessionID로 확인할 수 있습니다. 세션을 강제로 저장하기 위해 req.session.save 메서드가 존재하지만, 일반적으로 요청이 끝날 때 자동으로 호출되므로 직접 save 메서드를 호출할 일은 거의 없습니다.

express-session에서 서명한 쿠키 앞에 s:이 붙습니다. 실제로는 encodeURIComponent 함수가 실행되어 s%3A가 됩니다.

s%3A의 뒷부분이 실제 암호화된 쿠키 내용입니다. 앞에 s%3A가 붙은 경우, 이 쿠키가 express-session 미들웨어에 의해 암호화된 것이라고 생각하면 됩니다.

'프로그래밍 언어 > NODE JS' 카테고리의 다른 글

multer  (0) 2025.06.30
미들웨어 특성 활용하기  (1) 2025.06.27
cookie-parser  (0) 2025.06.22
body-parser  (0) 2025.06.19
static  (0) 2025.06.16