
다중 WAS 환경을 고려하지 못한 세션 기반 설계의 위험성과 해결책
SSG닷컴의 신규 멤버십 오픈 직후 발생한 실제 장애 사례를 통해, 분산 시스템에서 Spring FlashAttribute가 일으킬 수 있는 문제를 심도 있게 다룹니다. 이론적으로 완벽해 보이는 PRG 패턴이 실제 운영 인프라와 만났을 때 어떤 예외 상황을 만드는지, 그리고 이를 해결하기 위한 단순화의 미학을 공유합니다.
Spring MVC 환경에서 리다이렉트와 함께 데이터를 전달해야 하는 백엔드 개발자라면 반드시 읽어보시기 바랍니다. 특히 L4/L7 로드 밸런서 뒤에 여러 대의 서버를 운영 중인 분산 시스템 환경에 큰 도움이 됩니다.
다중 WAS로 구성된 운영 환경에서 SSG7CLUB 가입 프로세스 중 데이터가 유실되어 랜덤하게 에러가 발생하는 장애가 발생했습니다. 로컬과 단일 WAS인 스테이징 환경에서는 정상 작동했으나, 리다이렉트 과정에서 요청이 다른 서버로 배분될 때 데이터가 사라지는 것이 핵심 문제였습니다.
Spring의 FlashAttribute를 제거하고 세션 의존성을 없애기 위해 구조를 단순화했습니다. 리다이렉트 대신 게이트 페이지에서 직접 데이터를 렌더링한 후, 클라이언트 측에서 즉시 다음 단계로 자동 전송(Auto-submit)하는 방식을 도입하여 서버 상태와 무관하게 동작하도록 수정했습니다.
분산 서버 환경에서도 가입 프로세스가 100% 안정적으로 작동하게 되었으며, 불필요한 세션 관리와 리다이렉트 로직을 제거하여 코드의 복잡성을 낮추고 장애 포인트를 원천 차단했습니다.
Trade-off
보안과 사용자 경험을 위해 URL 파라미터를 숨기고 PRG 패턴을 유지하려 했으나, 다중 WAS 환경에서의 세션 정합성 비용을 고려하여 가장 단순하고 확실한 폼 전송 방식으로 선회하며 기술적 세련미보다 운영 안정성을 우선시했습니다.
Spring MVC에서 한 요청에서 다른 요청(주로 리다이렉트)으로 속성을 전달하기 위해 사용하는 객체로, 내부적으로 HTTP 세션에 임시 저장됩니다.
네트워크 트래픽을 여러 대의 서버로 분산시켜 부하를 조절하고 가용성을 높이는 기술입니다.
Post-Redirect-Get의 약자로, POST 요청 후 GET으로 리다이렉트하여 브라우저 새로고침 시 발생할 수 있는 중복 제출을 방지하는 패턴입니다.