[Node.js] express-session 쿠키와 redis에 저장되는 세션 Id 차이
현재 마무리하고 있는 프로젝트에서는 NestJS, express-session, connect-redis, passport를 사용하여 인증을 처리하고 있다.
express-session은 세션을 생성하고 관리하며, passport는 인증을 처리하고 인증 정보를 세션에 저장한다.
express-session에서 세션을 생성할 때 발급해주는 쿠키는 기본적으로 이름이 'connect.sid'이다.
프론트엔드에서 세션 상태를 확인하는 API를 만들어달라고 해서 작성하던 도중,
request의 cookies에서 세션 ID를 추출해야겠다고 생각하였다.
원래 쿠키에서 세션 ID 추출하는 함수는 이런식으로 사용하고 있었다.
이게 connect.sid 쿠키의 값이라고 하면
s%3AtWwtNorRjA3u5-SVHMecRQblBvkaw6Ym.BCW2Dy6Ey9%2BsbKVi0%2BSGzyqWjZC63vJusERkwrs7iY
[ 's%3AtWwtNorRjA3u5-SVHMecRQblBvkaw6Ym', ' BCW2Dy6Ey9%2BsbKVi0%2BSGzyqWjZC63vJusERkwrs7iY']
이런 배열에서 0번째 인덱스에 있는 것에서 's:'을 빈문자열로 대체하는 로직이다.
생각해보니 이렇게 단순하게 적어놓으면 안 될 것 같았다.
우선 express-session이 쿠키를 발급해주고, connect-redis가 redis에 해당 세션을 저장한다.
어떤식으로 저장되는지 살펴보자.
Cookie | s%3AtWwtNorRjA3u5-SVHMecRQblBvkaw6Ym.BCW2Dy6Ey9%2BsbKVi0%2BSGzyqWjZC63vJusERkwrs7iY - '%3A'는 URL 인코딩된 문자로, : (콜론)을 의미함. ' - '.' 이후는 암호화 등을 나타냄. |
Redis | sess:tWwtNorRjA3u5-SVHMecRQblBvkaw6Ym |
extract-sessionId.util.ts
export function extractSessionIdFromCookie(cookie: string) {
// 쿠키가 없을 경우 null 반환
if (!cookie) {
return null;
}
let sessionId = null;
// 쿠키가 여러 개 있을 때
if (cookie.includes(';')) {
const cookieArray = cookie.split('; ').map((c) => c.trim());
const connectSidCookie = cookieArray.find((c) => c.startsWith('connect.sid='));
if (connectSidCookie) {
sessionId = connectSidCookie.split('=')[1];
}
} else {
// 쿠키가 connect.sid 1개만 있을 때
if (cookie.startsWith('connect.sid=')) {
sessionId = cookie.split('=')[1];
}
}
// s:gwfjJhtTypuHs2a38Rr일 경우
// → 's:' 제거 후 변환
if (cookie.startsWith('s:')) {
return cookie?.split('.')[0].replace(/^s:/, '');
}
const result = sessionId?.split('.')[0].replace(/^s:/, '') || null;
return result;
}
connect.sid 쿠키는 express-session이 발급해주는 것이고, 우리 서버에서 자체적으로 발급하는 쿠키가 있을 수 있어서 여러 개의 쿠키가 있을 경우도 고려하였다.
이렇게 수정하고 auth/session-status API를 완성하였다.