블루 그린 배포 중 세션 유실이 발생하는 이유를 제대로 이해하고 알아보자

소프트웨어 개발과 운영의 세계에서 ‘배포’는 서비스의 새로운 버전을 사용자에게 전달하는 중요한 과정입니다. 이 과정에서 발생할 수 있는 잠재적인 문제를 최소화하기 위한 다양한 배포 전략 중 하나가 바로 ‘Blue-Green 배포’입니다. 하지만 이 효율적인 전략을 사용하는 중에도 사용자들이 갑자기 로그인 상태가 풀리거나 장바구니에 담아둔 상품이 사라지는 등의 ‘세션 유실’을 경험하는 경우가 종종 발생합니다. 이 글에서는 Blue-Green 배포 중 세션 유실이 왜 발생하는지, 그리고 이를 어떻게 방지할 수 있는지에 대한 실용적인 가이드를 제공합니다.

Blue Green 배포란 무엇이며 왜 중요할까요

Blue-Green 배포는 새로운 버전의 애플리케이션을 배포할 때 서비스 중단을 최소화하기 위한 전략입니다. 이 방식은 두 개의 동일한 프로덕션 환경을 유지합니다. 하나는 현재 사용자 트래픽을 처리하는 ‘Blue’ 환경이고, 다른 하나는 새로 배포될 애플리케이션 버전을 준비하는 ‘Green’ 환경입니다.

  • Blue 환경 현재 운영 중인 서비스입니다.
  • Green 환경 새로운 버전의 애플리케이션을 배포하고 테스트하는 환경입니다.

새로운 버전이 Green 환경에 성공적으로 배포되고 테스트를 마치면, 로드 밸런서나 라우터 설정을 변경하여 모든 사용자 트래픽을 Blue 환경에서 Green 환경으로 전환합니다. 이 과정은 거의 즉각적으로 이루어지므로 사용자 입장에서는 서비스 중단을 느끼지 못하게 됩니다. 만약 Green 환경에 문제가 발생하면, 다시 트래픽을 Blue 환경으로 되돌려(롤백) 서비스의 연속성을 보장할 수 있다는 강력한 장점이 있습니다.

세션 유실 왜 중요한 문제일까요

세션 유실은 사용자 경험에 치명적인 영향을 미칩니다. 사용자가 웹사이트나 애플리케이션을 이용하는 동안 로그인 상태, 장바구니 내용, 개인화된 설정, 페이지 탐색 기록 등 다양한 정보가 ‘세션’에 저장됩니다. 세션이 유실되면 사용자는 다음과 같은 불편함을 겪게 됩니다.

  • 갑자기 로그아웃되어 다시 로그인해야 합니다.
  • 장바구니에 담아둔 상품이 사라져 다시 담아야 합니다.
  • 진행 중이던 작업이나 입력 내용이 초기화됩니다.
  • 개인화된 설정이 기본값으로 돌아갑니다.

이러한 경험은 사용자에게 불편함을 넘어 불쾌감을 줄 수 있으며, 서비스에 대한 신뢰도를 떨어뜨리고 심지어 이탈로 이어질 수 있습니다. 특히 이커머스나 금융 서비스와 같이 사용자 세션이 비즈니스와 직결되는 경우, 세션 유실은 직접적인 매출 손실로 이어질 수 있는 심각한 문제입니다.

Blue Green 배포 중 세션 유실이 발생하는 근본적인 이유

Blue-Green 배포는 무중단 배포를 목표로 하지만, 애플리케이션의 ‘상태 관리’ 방식에 따라 세션 유실 문제가 발생할 수 있습니다. 근본적인 원인은 다음과 같습니다.

상태 유지 애플리케이션 Stateful Application의 문제

많은 웹 애플리케이션은 사용자별 ‘상태(State)’를 서버에 저장합니다. 이 상태 정보가 바로 ‘세션’입니다. 예를 들어, 사용자가 로그인하면 서버는 해당 사용자의 로그인 정보를 메모리나 로컬 파일에 저장하고, 이에 대한 고유한 세션 ID를 사용자에게 발급하여 쿠키 등으로 저장하게 합니다. 이후 사용자가 요청을 보낼 때마다 이 세션 ID를 함께 보내면 서버는 해당 ID에 매칭되는 세션 정보를 찾아 사용자를 식별하고 개인화된 서비스를 제공합니다.

문제는 Blue-Green 배포 시 발생합니다. 기존 트래픽을 처리하던 Blue 환경의 서버들은 각자 자신에게 접속했던 사용자들의 세션 정보를 자체적으로 보관하고 있습니다. 그런데 트래픽이 Green 환경으로 완전히 전환되면, 새로운 Green 환경의 서버들은 Blue 환경 서버들이 가지고 있던 세션 정보를 전혀 알지 못합니다. 따라서 Green 환경의 서버들은 사용자가 보내는 세션 ID를 인식하지 못하고, 사용자는 새로운 세션을 할당받거나 로그아웃 처리되는 것입니다.

세션 관리 방식의 종류와 Blue Green 배포에 미치는 영향

세션이 어떻게 관리되는지에 따라 Blue-Green 배포 시 세션 유실 위험이 크게 달라집니다.

인메모리 세션 관리 In-Memory Session Management

가장 흔하고 기본적인 세션 관리 방식입니다. 애플리케이션 서버의 메모리에 직접 세션 정보를 저장합니다. 개발이 쉽고 빠르다는 장점이 있지만, 서버가 재시작되거나 여러 대의 서버가 로드 밸런싱될 때 문제가 발생할 수 있습니다. Blue-Green 배포에서는 Blue 환경의 서버들이 다운되거나 트래픽에서 제외될 때, 해당 서버들이 가지고 있던 모든 인메모리 세션이 사라지게 됩니다. 이는 Blue-Green 배포 시 세션 유실의 가장 큰 원인입니다.

스티키 세션 Sticky Session

로드 밸런서가 특정 사용자의 요청을 항상 동일한 애플리케이션 서버로 보내도록 설정하는 방식입니다. 인메모리 세션 관리의 단점을 보완하기 위해 사용됩니다. 사용자가 처음 접속한 서버에 세션이 생성되면, 이후 모든 요청은 그 서버로만 전달되어 세션 유실을 방지합니다. 하지만 Blue-Green 배포 시에는 스티키 세션도 한계가 있습니다.

  • 환경 전환 시 문제 Blue 환경에서 Green 환경으로 트래픽을 전환하는 순간, 기존 Blue 환경의 서버들은 더 이상 트래픽을 받지 않게 됩니다. 스티키 세션이 설정되어 있더라도, 사용자의 요청이 더 이상 Blue 환경의 서버로 전달될 수 없으므로 세션 유실이 발생합니다.
  • 서버 장애 시 문제 특정 서버에 장애가 발생하여 해당 서버가 로드 밸런서에서 제외되면, 해당 서버에 연결되어 있던 모든 사용자들의 세션이 유실됩니다.
  • 확장성 한계 서버 간 부하 분산이 고르게 이루어지지 않을 수 있습니다.

중앙 집중식 세션 저장소 Centralized Session Store

세션 정보를 애플리케이션 서버의 메모리가 아닌 외부의 독립적인 저장소(예: Redis, Memcached, 데이터베이스)에 저장하는 방식입니다. 이 방식은 Blue-Green 배포에서 세션 유실을 방지하는 가장 효과적인 해결책입니다.

  • 공유 세션 Blue 환경과 Green 환경의 모든 애플리케이션 서버가 동일한 중앙 집중식 세션 저장소에 접근하여 세션 정보를 읽고 쓸 수 있습니다.
  • 환경 독립성 트래픽이 Blue에서 Green으로 전환되더라도, Green 환경의 서버들은 중앙 저장소에서 기존 Blue 환경에서 생성된 세션 정보를 가져올 수 있으므로 세션 유실이 발생하지 않습니다.
  • 확장성 및 복원력 세션 저장소 자체를 클러스터링하여 확장성과 고가용성을 확보할 수 있습니다.

실용적인 세션 유실 방지 전략

세션 유실을 방지하기 위한 가장 확실하고 실용적인 방법들을 소개합니다.

세션 외부화 Externalizing Sessions

가장 강력하고 권장되는 방법입니다. 세션 정보를 애플리케이션 서버의 로컬 메모리가 아닌 외부의 공유 가능한 저장소에 저장하는 것입니다.

  • Redis 인메모리 데이터 스토어로서 매우 빠르고 효율적으로 세션 정보를 저장하고 검색할 수 있습니다. 대규모 서비스에서도 안정적으로 세션을 관리할 수 있어 널리 사용됩니다.
  • 데이터베이스 관계형 데이터베이스(PostgreSQL, MySQL 등)나 NoSQL 데이터베이스(MongoDB 등)에 별도의 세션 테이블을 만들어 세션 정보를 저장할 수도 있습니다. Redis만큼 빠르지는 않지만, 데이터의 영속성이 중요하거나 기존 인프라를 활용하고 싶을 때 좋은 선택이 될 수 있습니다.

세션 외부화를 구현하면, Blue 환경에서 생성된 세션 정보가 외부 저장소에 있으므로, 트래픽이 Green 환경으로 전환되어도 Green 환경의 서버들이 이 외부 저장소에서 기존 세션 정보를 가져와 사용할 수 있습니다. 이는 Blue-Green 배포의 핵심적인 세션 문제 해결책입니다.

무상태 애플리케이션 설계 Stateless Application Design

궁극적으로는 애플리케이션 자체를 ‘무상태(Stateless)’로 설계하는 것이 가장 이상적입니다. 무상태 애플리케이션은 서버에 사용자별 상태 정보를 저장하지 않고, 필요한 모든 정보는 각 요청에 포함되어 전달되거나 클라이언트(브라우저)에 저장됩니다.

  • JWT JSON Web Token 사용자가 로그인하면 서버는 사용자 정보를 담은 JWT를 발급하고, 클라이언트는 이 토큰을 저장합니다. 이후 모든 요청에 이 JWT를 포함하여 보내면 서버는 토큰을 검증하여 사용자를 식별합니다. 서버는 별도의 세션 정보를 저장할 필요가 없습니다.
  • 클라이언트 사이드 저장소 로컬 스토리지(localStorage), 세션 스토리지(sessionStorage), 쿠키 등을 활용하여 사용자 상태를 클라이언트에 저장합니다. 민감한 정보는 서버에 저장하고, 비민감한 정보만 클라이언트에 저장하는 것이 일반적입니다.

무상태 애플리케이션은 서버 확장성이 매우 뛰어나고, Blue-Green 배포를 포함한 모든 종류의 배포 방식에서 세션 유실 문제가 발생하지 않는다는 큰 장점이 있습니다.

점진적인 트래픽 전환 Canary Release

Blue-Green 배포의 변형으로, 트래픽을 한 번에 전환하지 않고 점진적으로 전환하는 방식입니다. 예를 들어, 처음에 5%의 트래픽만 Green 환경으로 보내고, 문제가 없으면 20%, 50% 등으로 점차 늘려나가는 것입니다. 이 방식 자체로 세션 유실을 완전히 막지는 못하지만, 문제가 발생했을 때 영향을 받는 사용자 수를 최소화하고 빠르게 롤백할 수 있다는 장점이 있습니다.

애플리케이션의 우아한 종료 Graceful Shutdown

Blue 환경의 서버들을 즉시 종료하지 않고, 새로운 요청은 받지 않으면서 기존에 처리 중이던 요청들이 완료될 때까지 기다렸다가 종료하는 방식입니다. 이 과정에서 세션 정보를 외부 저장소에 저장하거나, 현재 처리 중인 사용자 세션에 대한 작업을 마무리할 시간을 벌 수 있습니다. 이는 세션 외부화와 함께 사용될 때 더욱 효과적입니다.

데이터베이스 스키마 변경 관리

세션 유실은 아니지만, Blue-Green 배포 시 함께 고려해야 할 중요한 요소입니다. 새로운 버전의 애플리케이션(Green)이 데이터베이스 스키마를 변경하는 경우, 트래픽 전환 시점에 기존 버전의 애플리케이션(Blue)과 새로운 버전의 애플리케이션(Green)이 동시에 동작하는 동안 데이터베이스 스키마 호환성 문제가 발생할 수 있습니다. 이를 방지하기 위해 다음과 같은 전략을 사용합니다.

  • 하위 호환성 유지 새로운 스키마 변경은 항상 이전 버전의 애플리케이션과 호환되도록 설계합니다. 예를 들어, 컬럼을 추가하거나 테이블을 변경할 때, 이전 버전 애플리케이션이 여전히 작동할 수 있도록 합니다.
    • 단계적 배포 스키마 변경을 여러 단계로 나누어 배포합니다. 첫째, 새로운 스키마를 추가하고, 둘째, 애플리케이션을 업데이트하여 새로운 스키마를 사용하도록 하고, 셋째, 이전 스키마를 제거합니다.

    흔한 오해와 사실 관계

    Blue-Green 배포와 세션 관리에 대한 몇 가지 오해를 풀어봅니다.

    오해 Blue Green 배포는 항상 세션 유실이 없습니다

    사실 Blue-Green 배포는 무중단 배포를 목표로 하지만, 애플리케이션이 세션 관리를 어떻게 하는지에 따라 세션 유실이 발생할 수 있습니다. 인메모리 세션을 사용하는 경우 거의 확실하게 세션 유실이 발생합니다. 세션 외부화나 무상태 설계가 전제되어야 세션 유실 없이 Blue-Green 배포를 성공적으로 수행할 수 있습니다.

    오해 스티키 세션이면 충분합니다

    사실 스티키 세션은 로드 밸런서 뒤에 여러 대의 서버가 있을 때 유용하지만, Blue-Green 배포처럼 환경 자체가 완전히 전환되는 경우에는 한계가 있습니다. Blue 환경의 서버들이 트래픽에서 제외되면, 스티키 세션이 아무리 잘 설정되어 있어도 해당 세션은 유실됩니다. 스티키 세션은 환경 전환이라는 근본적인 변화에 대한 해결책이 아닙니다.

    오해 세션 외부화는 너무 복잡하고 비쌉니다

    사실 초기 설정에 약간의 노력이 필요할 수 있지만, 현대의 클라우드 서비스나 오픈소스 도구(Redis 등)를 활용하면 비교적 쉽게 세션 외부화를 구현할 수 있습니다. 장기적으로는 세션 유실로 인한 비즈니스 손실이나 사용자 불만을 고려할 때 훨씬 비용 효율적인 방법입니다. 특히 클라우드 환경에서는 관리형 Redis 서비스 등을 통해 운영 부담을 크게 줄일 수 있습니다.

    전문가의 조언과 의견

    대부분의 전문가들은 Blue-Green 배포와 같은 고급 배포 전략을 사용할 때는 다음과 같은 사항을 강조합니다.

    • 초기 설계의 중요성 애플리케이션을 처음부터 무상태(Stateless)로 설계하거나, 최소한 세션 외부화를 염두에 두고 설계하는 것이 가장 중요합니다. 나중에 세션 관리 방식을 변경하는 것은 상당한 리팩토링이 필요할 수 있습니다.
    • 인프라와 애플리케이션의 조화 성공적인 Blue-Green 배포는 단순히 인프라 구성(로드 밸런서, 두 환경)만으로 이루어지지 않습니다. 애플리케이션 코드 레벨에서 세션 관리가 어떻게 이루어지는지 이해하고, 이에 맞춰 인프라와 애플리케이션을 함께 설계해야 합니다.
    • 테스트 또 테스트 새로운 배포 전략이나 세션 관리 방식을 도입했을 때는 반드시 철저한 테스트를 거쳐야 합니다. 실제 사용자 시나리오를 시뮬레이션하여 세션 유실이 발생하는지 확인하고, 문제가 발생했을 때 롤백이 원활하게 이루어지는지 검증해야 합니다.

    비용 효율적인 세션 유실 방지 방법

    세션 유실 방지 솔루션이 반드시 비싸거나 복잡할 필요는 없습니다.

    • 오픈소스 활용 Redis는 매우 강력하고 널리 사용되는 오픈소스 인메모리 데이터 스토어입니다. 자체 서버에 설치하여 사용하거나, 클라우드 환경에서 제공하는 관리형 서비스(AWS ElastiCache for Redis, Azure Cache for Redis, Google Cloud Memorystore for Redis 등)를 활용할 수 있습니다. 소규모 환경에서는 비교적 저렴한 비용으로 시작할 수 있습니다.
    • 기존 데이터베이스 활용 이미 사용 중인 관계형 데이터베이스(PostgreSQL, MySQL 등)에 세션 정보를 저장하는 테이블을 만들어 활용할 수도 있습니다. Redis만큼 빠르지는 않지만, 추가적인 인프라 구축 비용 없이 세션 외부화를 구현할 수 있는 방법입니다. 물론, 데이터베이스에 과도한 부하가 걸리지 않도록 설계하는 것이 중요합니다.
    • 클라우드 관리형 서비스 클라우드 제공업체들은 다양한 관리형 서비스를 제공합니다. 이러한 서비스는 초기 설정과 운영 부담을 크게 줄여주며, 사용량에 따라 비용을 지불하므로 초기 투자 비용을 절감할 수 있습니다. 서비스 규모가 커짐에 따라 쉽게 확장할 수 있다는 장점도 있습니다.

    가장 중요한 것은 세션 유실로 인해 발생할 수 있는 잠재적인 비즈니스 손실과 사용자 이탈 비용을 고려할 때, 세션 유실 방지 솔루션에 투자하는 것이 장기적으로는 훨씬 비용 효율적이라는 점입니다.

    자주 묻는 질문

    Q 모든 애플리케이션이 Blue Green 배포 시 세션 유실에 취약한가요

    A 아니요, 주로 사용자별 상태(세션)를 서버에 저장하는 ‘상태 유지(Stateful)’ 애플리케이션이 취약합니다. 로그인 정보, 장바구니, 개인화된 설정 등을 서버 메모리에 저장하는 방식이 여기에 해당합니다. 반면, 서버가 사용자 상태를 저장하지 않는 ‘무상태(Stateless)’ 애플리케이션은 세션 유실 문제가 발생하지 않습니다.

    Q 소규모 서비스에도 세션 외부화가 필요한가요

    A 네, 소규모 서비스라도 세션 외부화를 고려하는 것이 좋습니다. 처음에는 인메모리 세션으로 시작할 수 있지만, 서비스가 성장하여 로드 밸런서 뒤에 여러 서버를 두거나 Blue-Green 배포와 같은 고급 배포 전략을 도입할 계획이라면 세션 외부화는 필수적입니다. 미리 준비해두면 나중에 큰 리팩토링 없이도 확장이 용이합니다.

    Q Blue Green 배포 없이 세션 유실을 피할 수 있나요

    A 네, 세션 외부화나 무상태 애플리케이션 설계는 Blue-Green 배포와 관계없이 세션 유실을 방지하는 기본적인 방법입니다. 이러한 방식으로 세션을 관리하면 롤링 업데이트(Rolling Update)와 같은 다른 배포 방식에서도 세션 유실 없이 배포할 수 있습니다. 다만, Blue-Green 배포는 무중단 배포와 빠른 롤백이라는 추가적인 이점을 제공합니다.

    유용한 팁과 조언

    • 초기 설계 단계부터 고려하세요 애플리케이션 개발 초기 단계부터 세션 관리 전략을 명확히 하고, 가능한 한 무상태 설계를 지향하거나 세션 외부화를 염두에 두세요.
    • 철저한 테스트를 수행하세요 배포 전, 테스트 환경에서 Blue-Green 전환 시 세션 유실이 발생하는지 사용자 시나리오를 바탕으로 철저히 테스트하세요.
    • 모니터링을 강화하세요 배포 후에는 사용자 세션 관련 지표(로그인 실패율, 세션 만료 등)를 면밀히 모니터링하여 문제가 발생하면 즉시 감지하고 대응할 수 있도록 준비하세요.
    • 사용자 경험을 최우선으로 생각하세요 기술적인 복잡성 때문에 세션 유실을 간과하지 마세요. 사용자 경험은 서비스의 성공에 결정적인 요소입니다.
    • 점진적으로 개선하세요 한 번에 완벽한 솔루션을 구축하기 어렵다면, 단계적으로 세션 관리 방식을 개선해나가세요. 예를 들어, 먼저 Redis와 같은 중앙 집중식 세션 저장소를 도입하고, 점차적으로 애플리케이션을 무상태 지향으로 리팩토링하는 식입니다.

    댓글 남기기