1일 1CS(Computer Science)

다중 서버 환경에서 세션 기반 인증 방식을 사용하는 경우 발생할 수 있는 문제점은 무엇인가요?

표자 2025. 5. 13. 09:03

다중 서버 환경에서 세션 기반 인증 방식을 사용하는 경우 발생할 수 있는 문제점은 무엇인가요?

백엔드와 관련된 질문이에요.

다중 서버 환경에서 세션 기반 인증 방식을 사용하는 경우에는 세션 불일치 문제가 발생할 수 있습니다. 만약 서버 A, B를 관리하고 있을 때, 로드밸런서는 사용자의 요청을 상황에 맞게 A, B 중 한 곳으로 전달합니다. 유효한 로그인 요청이 A 서버로 처음 도착하면 사용자에 대한 세션 정보는 A 서버에 저장됩니다. 이후에 해당 사용자의 또 다른 요청이 로드 밸런서에 도착했을 때, B 서버로 도착하게 되면 사용자의 세션 데이터가 존재하지 않기 때문에 요청이 제대로 처리되지 않습니다. 이를 세션 불일치 문제라고 합니다.

 

세션 불일치 문제는 어떻게 해결할 수 있나요? 🤔

세션 불일치 문제는 크게 3가지 방식으로 해결할 수 있습니다. 스티키 세션 방식, 세션 클러스터링 방식, 스토리지 분리 방식입니다.

각 방식에 대한 설명과 장단점을 말해주세요. 😀

스티키 세션 방식은 사용자 요청이 항상 사용자 세션 정보가 저장된 서버로 가도록 고정하는 방식입니다. 사용자 요청의 쿠키나 IP를 통해서 어느 서버로 고정 시킬지 결정합니다. 해당 방식은 단순하다는 장점이 존재합니다. 반면, 특정 서버에 트래픽이 집중될 수 있다는 문제점과 사용자의 세션 정보를 가지고 있는 서버가 다운되면 해당 서버에 고정된 사용자는 다시 로그인해야하는 문제점이 존재합니다.

 

세션 클러스터링 방식은 특정 서버에 사용자 세션 정보가 생성될 때, 다른 서버로 정보를 복제하는 방식입니다. 여러 서버에 세션 정보를 중복으로 저장하므로 스티키 세션의 트래픽 몰림 현상과 세션 정보 유실 문제를 해결한다는 장점이 있습니다. 반면, 세션 정보를 중복 저장한다는 점에서 메모리를 비효율적으로 사용하며, 세션 정보 복제 과정에서 발생하는 네트워크 트래픽 문제, 세션 정보 복제 지연으로 인한 일시적인 세션 정보 유실 문제가 발생할 수 있습니다.

 

스토리지 분리 방식 세션 정보를 저장하는 공간을 외부로 분리하는 방식입니다. 세션 클러스터링 방식, 스티키 세션 방식에서 발생하는 문제를 해결할 수 있습니다. 해당 방식은 스토리지에 대한 단일 장애 지점(Single Point Of Failure)이 문제가 될 수 있으며, 클러스터링과 같은 HA 구성으로 단일 장애 지점을 해소하여도 복제 지연으로 인한 일시적인 세션 정보 유실 문제는 발생할 수 있습니다. 또한, 외부 스토리지를 관리하기 위한 추가적인 리소스가 요구될 수 있습니다.

 

 


 

다중 서버 환경에서의 세션 기반 인증 문제와 해결책 🔐

문제: 세션 불일치 (Session Inconsistency) 😱

다중 서버 환경에서 세션 기반 인증을 사용할 때 발생하는 가장 큰 문제는 세션 불일치입니다.

왜 발생하나요? 🤔

  1. 사용자가 로그인 요청을 보냅니다.
  2. 로드밸런서가 이 요청을 서버 A로 전달합니다.
  3. 서버 A는 세션을 생성하고 세션 ID를 쿠키에 담아 사용자에게 응답합니다.
  4. 사용자가 다시 요청을 보내면 로드밸런서는 이번엔 서버 B로 전달합니다.
  5. 하지만 서버 B에는 해당 세션 정보가 없어 인증 실패! 😵

 

해결책 1: 스티키 세션 (Sticky Session) 📌

원리

특정 사용자의 모든 요청을 항상 동일한 서버로 보내는 방식입니다.

장점 👍

  • 구현이 단순하고 빠름
  • 추가 인프라 필요 없음

단점 👎

  • 특정 서버에 트래픽 집중 가능성
  • 서버 다운 시 해당 서버의 모든 세션 손실
  • 수평 확장성 제한

 

해결책 2: 세션 클러스터링 (Session Clustering) 🔄

원리

서버들이 서로 세션 정보를 실시간으로 공유하는 방식입니다.

장점 👍

  • 모든 서버가 세션 정보를 가짐
  • 서버 일부 다운되어도 서비스 지속 가능

단점 👎

  • 세션 복제 과정에서 네트워크 트래픽 발생
  • 메모리 사용량 증가
  • 복제 지연으로 일시적 불일치 가능성

 

해결책 3: 스토리지 분리 (Separate Storage) 💾

원리

세션 정보를 별도의 중앙 저장소(Redis, MongoDB 등)에 저장하는 방식입니다.

장점 👍

  • 서버 간 세션 데이터 일관성 유지
  • 서버 확장성 향상
  • 서버 다운되어도 세션 유지

단점 👎

  • 외부 의존성 추가
  • 스토리지 장애 시 전체 인증 시스템 영향
  • 네트워크 지연 발생 가능

 

추가 고려사항 🧐

보안 측면

  • 세션 ID 전송 시 항상 HTTPS 사용 권장
  • 세션 탈취 방지를 위한 추가 검증 필요 (IP 검사, 유저 에이전트 등)

성능 최적화

  • Redis 사용 시 세션 캐싱으로 성능 향상
  • 세션 데이터 최소화하여 전송 부하 감소

또 다른 대안: JWT (JSON Web Token) 🔑

세션 기반 대신 토큰 기반 인증을 사용하면 서버 상태 저장 이슈를 해결할 수 있습니다.

 
javascript
// Next.js에서 JWT 사용 예시
import jwt from 'jsonwebtoken';

export function createToken(user) {
  return jwt.sign(
    { id: user.id, role: user.role },
    process.env.JWT_SECRET,
    { expiresIn: '1d' }
  );
}
728x90