세션 상태 패턴
이 장에서는 웹 애플리케이션의 세션 상태를 관리하는 여러 가지 패턴에 대해 설명합니다. 세션 상태 관리 방법은 클라이언트 측, 서버 측, 데이터베이스를 이용한 방법으로 크게 나뉩니다. 각각의 패턴은 특정 상황에서의 장단점이 있으며, 애플리케이션의 요구 사항에 따라 적절한 방법을 선택하는 것이 중요합니다.
Client Session State
Client Session State는 세션 상태를 클라이언트 측에 저장하는 방법입니다. 이 방법은 서버가 무상태(stateless)로 유지되도록 하여, 확장성과 유연성을 높이는 데 유리합니다.
작동 방식
Client Session State는 세션 식별자를 클라이언트에 저장하고, 각 요청 시 해당 세션 식별자와 함께 필요한 세션 데이터를 서버에 전달합니다. 이 방법에는 몇 가지 주요 구현 방식이 있습니다:
URL 파라미터: 세션 데이터를 URL 파라미터로 전달하는 방법입니다. 이 방법은 URL에 제한된 길이 때문에 데이터의 양이 많을 때는 사용하기 어려울 수 있습니다. 그러나 소량의 데이터를 다룰 때는 간단하고 효과적입니다. 이 방식은 주로 세션 ID를 전달하는 데 사용됩니다.
숨겨진 필드: HTML 폼의
<INPUT type="hidden">
필드를 이용하여 데이터를 숨겨 전달하는 방법입니다. 이 방법은 데이터가 화면에 보이지 않지만, 페이지 소스를 통해 누구나 볼 수 있으므로 민감한 데이터에 대한 보안 위험이 있습니다.쿠키: 세션 데이터를 쿠키에 저장하여 클라이언트와 서버 간에 데이터를 주고받는 방법입니다. 쿠키는 브라우저의 설정에 따라 비활성화될 수 있으며, 쿠키의 크기 제한이 있어 대량의 데이터를 저장하기 어렵습니다. 또한 쿠키는 도메인 간 공유가 불가능하므로, 도메인이 다른 사이트들 간에 데이터를 주고받을 수 없습니다.
장점과 단점
장점: Client Session State는 서버가 무상태로 유지될 수 있어 확장성이 뛰어나며, 서버 간 세션 공유 문제를 피할 수 있습니다.
단점: 보안 위험이 존재하며, 대량의 데이터를 처리하기에는 적합하지 않습니다. 클라이언트 측에서 데이터를 변경할 수 있으므로, 데이터의 신뢰성을 보장하기 어렵습니다.
Server Session State
Server Session State는 세션 상태를 서버 측에 저장하는 방법입니다. 이 방법은 클라이언트의 요청에 따라 서버가 세션 상태를 관리하며, 주로 서버의 메모리나 다른 저장소에 세션 데이터를 저장합니다.
작동 방식
Server Session State는 서버가 세션 객체를 메모리나 다른 저장소에 저장하고, 클라이언트는 세션 ID만을 전달하여 해당 세션 객체에 접근합니다. 서버는 세션 ID를 이용해 세션 데이터를 조회하고, 필요할 경우 데이터를 수정하거나 저장합니다.
HTTP 세션: 가장 간단한 방식으로, 세션 데이터를 웹 서버가 관리합니다. 대부분의 경우 서버 간 세션 공유가 어렵고, 서버 장애 시 세션 데이터가 유실될 수 있습니다.
Stateful Session Bean: EJB 서버를 이용한 방법으로, 세션 데이터를 상태를 가진 세션 빈(Stateful Session Bean)으로 관리합니다. EJB 컨테이너가 세션 데이터를 관리하므로, 프로그래밍이 간편해지지만, 서버 간 세션 데이터를 공유하기 어렵습니다.
장점과 단점
장점: Server Session State는 클라이언트 측에서 데이터가 노출될 위험이 없으며, 서버가 세션 데이터를 직접 관리하므로 보안이 강화됩니다.
단점: 서버에 부하가 증가하며, 클러스터링이나 장애 복구를 위해 추가적인 구현이 필요할 수 있습니다.
Database Session State
Database Session State는 세션 데이터를 데이터베이스에 저장하여 관리하는 방법입니다. 이 방법은 세션 데이터를 커밋된 데이터로 간주하며, 각 요청 시 서버가 데이터베이스에서 필요한 세션 데이터를 가져와 처리합니다.
작동 방식
세션 데이터 저장: 세션 데이터는 데이터베이스에 테이블 형태로 저장됩니다. 일반적으로 세션 ID를 기준으로 데이터를 조회하며, 세션 상태는 보통 다른 트랜잭션과 구분되어 저장됩니다.
Pending 데이터 처리: 데이터베이스에 세션 데이터를 저장할 때, 해당 데이터가 확정된 데이터인지, 임시 데이터인지를 구분해야 합니다. 이를 위해 Boolean
isPending
필드를 추가하거나, 세션 ID를 별도의 필드로 저장하여, 확정된 데이터와 임시 데이터를 구분합니다.데이터 정리: 세션이 종료되거나 사용자가 세션을 중단한 경우, 데이터베이스에 남아 있는 임시 데이터를 정리해야 합니다. 이를 위해 일정 시간마다 오래된 세션 데이터를 삭제하는 데몬(daemon)을 실행할 수 있습니다.
장점과 단점
장점: 데이터베이스에 저장된 세션 데이터는 서버 장애나 클러스터링 환경에서도 안정적으로 관리될 수 있습니다.
단점: 데이터베이스에서 데이터를 읽고 쓰는 시간이 추가적으로 필요하며, 대규모 트랜잭션 처리 시 성능 저하가 발생할 수 있습니다.
세 가지 패턴의 비교
Client Session State는 서버를 무상태로 유지할 수 있으나, 보안과 데이터 무결성에 취약할 수 있습니다.
Server Session State는 서버에서 직접 세션을 관리하여 보안과 데이터 무결성을 높일 수 있으나, 서버 부하와 클러스터링 문제를 고려해야 합니다.
Database Session State는 데이터베이스를 이용해 세션 상태를 관리하며, 장애 복구와 클러스터링에 유리하지만, 성능 문제가 발생할 수 있습니다.
애플리케이션의 요구 사항에 따라 이러한 패턴들을 적절히 조합하거나 선택하여 세션 상태를 관리하는 것이 중요합니다.
Last updated