일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- CSS
- 중간이들
- 엘리스sw트랙
- 프로그래머스
- nestjs
- 파이썬
- 99클럽
- 유노코딩
- TiL
- redis
- 자격증
- 개발자취업
- 항해99
- 꿀단집
- HTML
- Python
- 방송대
- Cookie
- 데이터베이스시스템
- JavaScript
- 코딩테스트준비
- mongoDB
- 파이썬프로그래밍기초
- SQL
- aws
- Git
- 코드잇
- 코딩테스트
- node.js
- 방송대컴퓨터과학과
- Today
- Total
배꼽파지 않도록 잘 개발해요
[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를 완성하였다.
'BackEnd > Node.js' 카테고리의 다른 글
[Node.js] 서버에서 로그아웃시 HttpOnly 쿠키 브라우저에서 삭제하는 방법 (0) | 2024.10.24 |
---|---|
[Node.js] Request 객체의 IP Address 확인 (0) | 2024.08.26 |