HTTP는 상태 비저장(stateless) 프로토콜입니다. 즉, 클라이언트가 웹 페이지를 요청할 때마다 웹 서버에 새로운 연결을 열고, 서버는 이전 클라이언트 요청에 대한 어떠한 기록도 자동으로 보관하지 않습니다.
그렇다면 로그인 상태나 장바구니처럼 사용자 정보를 여러 요청에 걸쳐 유지해야 하는 경우에는 어떻게 해야 할까요? 이번 글에서는 웹 클라이언트와 웹 서버 간의 세션을 유지하는 대표적인 방법들을 살펴보겠습니다.
웹 클라이언트와 서버 간 세션 유지 방법
1. 쿠키(Cookies)
웹 서버는 각 웹 클라이언트에게 고유한 세션 ID를 쿠키 형태로 부여할 수 있습니다. 이후 클라이언트가 보내는 요청마다 수신된 쿠키를 기반으로 해당 클라이언트를 식별할 수 있습니다.
다만 이 방식은 모든 브라우저가 쿠키를 지원하는 것은 아니라는 점에서 한계가 있습니다. 사용자가 브라우저 설정에서 쿠키를 차단할 수도 있기 때문에, 쿠키만으로 세션을 관리하는 것은 권장되지 않습니다.
2. 숨겨진 폼 필드(Hidden Form Fields)
웹 서버는 고유한 세션 ID를 담은 숨겨진 HTML 폼 필드를 다음과 같이 전송할 수 있습니다.
<input type = "hidden" name = "sessionid" value = "12345">
이렇게 하면 폼이 제출될 때 지정된 이름과 값이 자동으로 GET 또는 POST 데이터에 포함됩니다. 웹 브라우저가 요청을 다시 보낼 때마다 session_id 값을 활용하여 서로 다른 브라우저를 추적할 수 있습니다.
세션을 추적하는 효과적인 방법이지만, 일반 하이퍼텍스트 링크(<A HREF...>)를 클릭하는 행위는 폼 제출로 이어지지 않습니다. 따라서 숨겨진 폼 필드 역시 범용적인 세션 추적 방식으로는 한계가 있습니다.
3. URL 재작성(URL Rewriting)
모든 URL 끝에 추가 데이터를 덧붙이는 방식입니다. 이 데이터가 세션을 식별하며, 서버는 해당 세션 식별자를 자신이 저장해 둔 세션 정보와 연결합니다.
예를 들어 https://example.com/file.htm;sessionid=12345와 같이 sessionid=12345라는 세션 식별자를 URL에 붙이면, 웹 서버는 이 값을 참조하여 클라이언트를 식별할 수 있습니다.
URL 재작성은 쿠키를 지원하지 않는 브라우저에서도 동작하기 때문에 세션 유지에 더 유리한 방식입니다. 단점은 페이지가 단순한 정적 HTML 페이지일지라도 모든 URL을 동적으로 생성하여 세션 ID를 할당해야 한다는 점입니다.
마무리
정리하면, 상태 비저장 특성을 가진 HTTP 환경에서 세션을 유지하는 방법은 크게 쿠키, 숨겨진 폼 필드, URL 재작성 세 가지가 있습니다. 각 방식은 지원 범위와 구현 복잡도에서 장단점이 있으므로, 서비스의 요구 사항에 맞게 적절히 조합하여 사용하는 것이 좋습니다.