서버 : 사용자가 인증에 성공했음을 알고 있어야 한다.
클라이언트 : 인증 성공을 증명할 수단을 가지고 있어야 한다.
세션 아이디가 담긴 쿠키는 클라이언트에저장되어 있고 서버는 세션을 저장하고 있기 때문에 로그아웃은 다음 두 가지의 작업을 수행해야 한다.
서버 : 세션 정보를 삭제해야 한다.
클라이언트 : 쿠키를 갱신해야 한다.
주의: 쿠키는 세션 아이디, 즉 인증 성공에 대한 증명을 갖고 있으므로, 탈취될 경우 서버는 해당 요청이 인증된 사용자의 요청이라고 판단하므로 공공장소에서 PC를 사용했을 시 로그아웃을 반드시 해야한다.
Node.js에는 이런 세션을 대신 관리해 주는 express-session 이라는 모듈이 존재한다. express-session은 세션을 위한 미들웨어로, express 서버에서 쉽게 세션을 위한 공간을 다룰 수 있도록 만들어 준다.
const express = require('express');
const session = require('express-session');
const app = express();
app.use(
session({
secret: '@jungho',
resave: false,
saveUninitialized: true,
cookie: {
domain: 'localhost',
path: '/',
maxAge: 24 * 6 * 60 * 10000,
sameSite: 'none',
httpOnly: false,
secure: true,
},
})
);
express-session을 사용해 위와 같이 세션의 옵션을 설정할 수 있다. 쿠키 옵션과 비슷해 보이지만, 세션의 경우 secret 옵션의 비밀키를 이용해 암호화해서 세션 아이디를 생성한다. 이 세션 아이디를 클라이언트 쿠키에 전송하게 된다.
쿠키로 전송된 세션 아이디는 이에 종속되는 고유한 세션 객체를 가지며 이는 서버에 저장된다. 이때 세션 객체는 유저별로 독립적으로 생성된 객체이므로 유저별로 각각 다른 데이터를 저장할 수 있다.
따라서 클라이언트에 유저의 개인정보를 담지 않고도 서버가 클라이언트의 세션 아이디를 이용해 유저의 인증여부를 판단할 수 있다.
세션 객체는 req.session
으로 접근할 수 있으며 앞서 말했듯 이를 통해 세션의 임의의 데이터를 저장하거나 불러올 수 있다.