Node.js · 2025-12-27

Node.js에서 세션 관리와 Redis 세션 저장소 구현

Server 환경에서 안정적인 세션 관리를 위해 Node.js와 Redis를 연동하는 설정과 구현 방법을 초보자도 이해하기 쉽게 정리한 실무 중심 설명

작성일 : 2025-12-27 ㆍ 작성자 : 관리자
post
목차

개요

웹 애플리케이션에서 세션은 로그인 상태, 장바구니 등 상태를 유지하는 핵심 요소다. 기본 메모리 저장은 단일 프로세스에서는 동작하지만 확장성과 신뢰성에서 한계가 있다. Redis를 세션 저장소로 사용하면 속도와 확장성, 세션 지속성 면에서 이점을 얻을 수 있다. 이 글은 Node.js 세션 Redis 사용법을 중심으로 express-session Redis 설정과 Node 세션 저장소 구현을 단계별로 설명한다.

세션의 기본 개념

세션과 쿠키의 차이

쿠키는 클라이언트에 저장되는 작은 데이터다. 세션은 서버에 저장되는 상태 정보다. 쿠키에는 세션 식별자만 담고, 실제 데이터는 서버나 외부 저장소에 둔다. 이렇게 하면 민감 정보를 안전하게 관리할 수 있다.

왜 Redis를 사용하는가?

  • 메모리 기반으로 빠른 읽기/쓰기 성능 제공
  • TTL(만료시간) 설정으로 세션 자동 만료 가능
  • 클러스터 환경에서 세션을 공유해 수평 확장 가능
  • 복제와 지속성 설정으로 장애 복구 지원

express-session으로 시작하기

express-session은 Node.js에서 가장 널리 쓰이는 세션 미들웨어다. 기본적으로 메모리 저장을 제공하지만, 운영 환경에서는 외부 저장소가 필요하다. 설치와 간단 설정 예시는 다음과 같다.

npm install express express-session
const express = require('express');
const session = require('express-session');

const app = express();

app.use(session({
  secret: 'your-secret',
  resave: false,
  saveUninitialized: false,
  cookie: { maxAge: 1000 * 60 * 60 }
}));

app.get('/', (req, res) => {
  req.session.views = (req.session.views || 0) + 1;
  res.send(`Views: ${req.session.views}`);
});

app.listen(3000);

위 코드는 학습용이다. 운영 환경에서는 세션 저장소를 Redis 같은 외부 저장소로 교체해야 한다.

express-session Redis 설정

Redis와 통합하려면 connect-redis 같은 스토어 어댑터를 사용한다. 최신 Redis 클라이언트(redis v4 또는 ioredis)를 함께 쓰는 것이 일반적이다. 아래 예시는 redis와 connect-redis를 사용하는 방법이다.

npm install redis connect-redis express-session
const session = require('express-session');
const RedisStore = require('connect-redis')(session);
const { createClient } = require('redis');

const redisClient = createClient({ url: 'redis://localhost:6379' });
redisClient.connect().catch(console.error);

app.use(session({
  store: new RedisStore({ client: redisClient }),
  secret: 'your-secret',
  resave: false,
  saveUninitialized: false,
  cookie: { secure: false, httpOnly: true, maxAge: 1000 * 60 * 60 }
}));

주의할 점은 cookie.secure이다. HTTPS 환경에서는 true로 설정해야 한다. 또한 secret은 충분히 복잡하고 안전하게 관리한다.

Node 세션 저장소 구현 패턴

기본 패턴

세션 저장소를 직접 구현할 필요는 거의 없다. 보통 다음 패턴을 따른다.

  • 세션 ID는 서버가 생성해 쿠키에 전달
  • 세션 데이터는 Redis에 저장(키: session:)
  • 요청 시 Redis에서 세션 조회 후 req.session에 바인딩

커스텀 접근이 필요한 경우

특정 요구사항으로 세션 저장 방식을 커스터마이징해야 할 때가 있다. 예를 들어 세션 데이터 크기를 제한하거나, 민감 데이터는 별도 암호화해서 저장하는 방식이다. 간단한 Redis 읽기/쓰기 예시는 다음과 같다.

const { createClient } = require('redis');
const redis = createClient({ url: 'redis://localhost:6379' });
redis.connect();

async function saveSession(sid, data, ttl = 3600) {
  await redis.setEx(`sess:${sid}`, ttl, JSON.stringify(data));
}

async function loadSession(sid) {
  const raw = await redis.get(`sess:${sid}`);
  return raw ? JSON.parse(raw) : null;
}

이 방식을 쓰면 express-session 대신 필요한 형태로 세션을 제어할 수 있다. 다만 직접 구현하면 재시도 로직과 에러 처리를 신경 써야 한다.

운영에서 고려할 점

  • 세션 크기 최소화: Redis 메모리 사용량과 네트워크 비용 절감
  • TTL 설정: 세션 만료 정책을 일관되게 유지
  • 세션 무효화: 로그아웃 시 세션을 명시적으로 삭제
  • 보안 설정: cookie.httpOnly, secure, sameSite 사용
  • Redis 모니터링: 메모리, 연결수, 레이턴시 점검
  • 데이터 복제·백업: 장애 대비 복제와 스냅샷 고려

마이그레이션 팁

  • 단계적으로 적용: 먼저 비중이 낮은 서비스에서 테스트
  • 세션 키 네이밍 규칙 도입: 충돌 방지와 관리 편의성 확보
  • 성능 테스트: 동시접속 시 Redis 반응 속도와 네트워크 부하 확인

결론

Node.js에서 세션을 안정적으로 관리하려면 Redis를 검토하는 것이 합리적이다. express-session Redis 설정은 표준적이고 구현도 간단하다. 운영 환경에서는 보안과 성능, 모니터링을 함께 고려해야 한다. 이 글을 통해 Node.js 세션 Redis 사용법과 Node 세션 저장소 구현의 핵심을 이해하고 안전하게 적용할 수 있다.

Node.js 세션 Redis 사용법 express-session Redis 설정 Node 세션 저장소 구현 connect-redis Redis 세션 세션 관리 session store Node.js 세션