express-session은 Express.js에서 세션 ( Session ) 기능을 쉽게 구현하기 위한 미들웨어다.
세션 ( Session )을 사용하기 위해서는 사용자 인증과 세션 스토리지를 통해 사용자 정보를 저장하고,
세션 정보가 담긴 쿠키를 사용자에게 발급하는 과정이 필요하다.
express-session은 이런 복잡한 과정을 생략해 간단하게 세션 기능을 구현할 수 있도록 도와주는 미들웨어다.
express-session 시작해보기
express-session은 세션 ID를 클라이언트에게 발급하고, 이 세션 ID를 통해 서버는 클라이언트의 상태를 추적할 수 있다.
즉, 클라이언트가 세션 ID를 발급받은 후에는 모든 서버 요청마다 세션 ID가 포함된 쿠키를 전달하게 되고, 이로 인해 서버는 클라이언트를 쉽게 식별할 수 있게 된다. ( Session 객체에 세션 ID를 저장하는 방법과 동일한 방법 )
예시를 통해 express-session의 동작 방식을 확인해보자
설치
# express, express-session를 설치합니다.
yarn add express express-session
app.js
// app.js
import express from 'express';
import expressSession from 'express-session';
const app = express();
const PORT = 3019;
app.use(express.json());
app.use(
expressSession({
secret: 'express-session-secret-key.', // 세션을 암호화하는 비밀 키를 설정
resave: false, // 클라이언트의 요청이 올 때마다 세션을 새롭게 저장할 지 설정, 변경사항이 없어도 다시 저장
saveUninitialized: false, // 세션이 초기화되지 않았을 때 세션을 저장할 지 설정
cookie: {
// 세션 쿠키 설정
maxAge: 1000 * 60 * 60 * 24, // 쿠키의 만료 기간을 1일로 설정합니다.
},
}),
);
app.listen(PORT, () => {
console.log(PORT, '포트로 서버가 열렸어요!');
});
express-session은 아래와 같이 전역 미들웨어로 등록된다.
app.use(
expressSession({
secret: 'express-session-secret-key.', // 세션을 암호화하는 비밀 키를 설정
resave: false, // 클라이언트의 요청이 올 때마다 세션을 새롭게 저장할 지 설정, 변경사항이 없어도 다시 저장
saveUninitialized: false, // 세션이 초기화되지 않았을 때 세션을 저장할 지 설정
cookie: {
// 세션 쿠키 설정
maxAge: 1000 * 60 * 60 * 24, // 쿠키의 만료 기간을 1일로 설정합니다.
},
}),
);
각각의 구성요소는 아래와 같은 내용을 담는다.
secret
- 세션 ID를 암호화하기 위한 비밀 키
- 클라이언트에게 발급할 세션 ID를 암호화하기 위한 비밀 키 정보
resave
- 클라이언트의 요청( Request )이 들어올 때마다 세션 정보를 다시 저장할 지 설정한다.
- 변경사항이 없더라도 true로 설정하면, 매번 새로운 세션에 저장된다.
saveUninitialized
- req.session에 아무런 정보가 저장이 되지 않아도 사용자에게 세션 ID를 발급할지 설정한다.
- true로 설정하면, 서버에 접속하는 모든 사용자에게 세션 ID가 발급된다.
cookie.maxAge
- 세션 ID가 저장된 클라이언트의 쿠키 만료 기간을 설정한다.
express-session 설정 정보
https://github.com/expressjs/session#options
GitHub - expressjs/session: Simple session middleware for Express
Simple session middleware for Express. Contribute to expressjs/session development by creating an account on GitHub.
github.com
express-session API 만들기
POST /sessions API를 호출했을 때 전달 받은 userId를 세션에 저장하고, GET /sessions API를 호출했을 때 클라이언트의 세션 정보를 출력하는 API를 구현해보자.
POST /sessions API 만들기
/** 세션 등록 API **/
app.post('/sessions', (req, res, next) => {
const { userId } = req.body;
// 클라이언트에게 전달받은 userId를 세션에 저장합니다.
req.session.userId = userId;
return res.status(200).json({ message: '세션을 설정했습니다.' });
});
- req-session은 클라이언트의 세션 정보를 관리하는 데 사용되는 객체다.
- 클라이언트의 요청이 들어오면, req.session.userId에 원하는 정보를 저장한다.
- userId 대신 다른 이름을 사용하려면 req.session.<원하는 프로퍼티 명>의 형식으로 사용하면 된다.
GET /sessions API 만들기
/** 세션 조회 API **/
app.get('/sessions', (req, res, next) => {
return res.status(200).json({
message: '세션을 조회했습니다.',
session: req.session.userId ?? null, // 세션에 저장된 usrId를 조회합니다.
});
});
- express-session은 클라이언트가 전달한 쿠키의 세션 ID를 바탕으로 req.session에서 정보를 조회한다.
- 만약, 클라이언트가 제공한 세션 ID에 일치하는 세션이 없을 경우, null을 반환한다.
express-session은 클라이언트의 요청 ( Request )에 req.session 정보를 저장할 수 있고, 이후 클라이언트 요청에서 세션에 저장된 정보를 req.session에서 참조해 사용할 수 있게 된다.
이 방식은 기존에 JWT를 이용한 쿠키를 클라이언트에게 전달하는 것보다 더욱 편리하게 구현할 수 있다는 점이 가장 큰 장점이다.
express-session의 정보는 서버가 종료되면 사라지는 가장 큰 문제가 존재한다. 이는 세션 정보가 인 메모리방식으로 저장되기 때문인데, 이로 인해 서버가 재시작 되거나 중지될 때 마다 모든 세션 정보가 사라지게 된다.
이런 상황을 방지하기 위해, Redis와 같은 캐시 메모리 데이터베이스를 이용해 세션 정보를 영구적으로 저장해 관리하기도 한다.
테스트해보기
1) Insomnia에서 Http Request를 생성하고, POST /sessions API를 호출
userId를 임의로 지정해 서버로 전달
세션을 설정했습니다라는 res를 받는다.
세션 ID가 저장된 connect.sid 이름을 가지는 Cookie를 전달받는다. ( 이 쿠키는 클라이언트의 세션 ID를 가지고 있다. )
2) Insomnia에서 Http Request를 생성하고, GET /sessions API를 호출
GET /sessions API를 호출한다.
세션 ID를 이용해 서버에 저장된 userId를 확인할 수 있다.
- GET /sessions API를 호출하면, "세션을 조회했습니다"라는 응답을 확인할 수 있다.
- 서버는 클라이언트가 전달한 connect.sid 쿠키에 저장된 세션 ID를 바탕으로 서버의 세션 정보를 조회하게 된다.
'Javascript' 카테고리의 다른 글
[Javscript][Node.js] Worker Thread (0) | 2024.11.28 |
---|---|
[Javscript] 호출 스케줄링 ( setTimeout, setInterval ) (0) | 2024.10.29 |
[Javascript] 로그 ( Log ), 에러 처리 ( Error Handling ) 미들웨어 (0) | 2024.09.11 |
[Javascript] delete 연산자 ( object 속성 값 삭제 ) (0) | 2024.09.10 |
[Javascript] .env ( 환경 변수 읽어 오기 ) (0) | 2024.09.09 |