Posts HTTP의 stateless한 특징과 쿠키, 세션
Post
Cancel

HTTP의 stateless한 특징과 쿠키, 세션

쿠키와 세션을 비교하며 특징을 외우기는 했지만, 정작 나오게된 배경에 대해서는 크게 생각해보지 않았던 것 같다.
이번 포스팅을 통해 쿠키, 세션이 나오게 된 배경인 HTTP의 무상태성과 쿠키, 세션의 특징에 대해 정리해보자.

HTTP의 특징 - Stateless


  • HTTP의 대표적인 특징 중 하나는 상태를 갖지 않는다(Stateless)는 것이다.
  • 그렇다면 ‘상태’란 무엇일까 ?
    • 몇 가지 자료를 찾아본 결과, ‘A는 B이다’ 처럼 ‘상태는 OO다’ 라고 딱 떨어지게 말하는 것은 어려운 것 같고,
      『The Definitive Guide to Linux Network Programming』 4장 에서는 상태를 다음과 같이 표현하고 있다.

      If a server maintains state, it means that the server maintains information about
      all of the current connections with its clients and the communications sent between them.

    • 즉, 상태란 ‘서버와 클라이언트 사이에 맺은 커넥션을 통해 서로간에 주고받는 모든 정보’ 라고 이해하면 될 것 같다.
    • ‘주고받는 정보’의 가장 대표적인 예로 사용자의 로그인 여부를 생각해 볼 수 있다. 이러한 하나의 데이터뿐 아니라,
      어떤 요청이 왔었는지 어떤 응답을 했었는지 또한 주고받는 정보가 될 수 있다.
  • 따라서 stateless 하다는 것은 이러한 정보를 서버측에서 유지(저장)하지 않는다는 것을 의미한다.
  • 상태를 갖지 않음으로써(정보를 저장하지 않음으로써) 얻는 장/단점
    • 장점
      • 서버 확장성이 좋다. 즉, 서버에서 클라이언트 요청에 대한 정보를 저장하고 있지 않기 때문에, 여러 대의 서버 중 어떤 서버로 요청을 해도 동일한 응답을 해줄 수 있다. 따라서 시스템 설계시, 상태 유지는 최소한으로만 사용하면서 설계하는 것이 좋다.
      • 서버의 리소스(CPU, 메모리 등)를 아낄 수 있다.
    • 단점
      • 반복되는 데이터 전송으로 인해, 네트워크 성능을 저하시킬 수 있다.

쿠키


  • 쿠키란 웹 브라우저가 (로컬 PC에)보관하는 데이터(key-value pair)이다.
  • 웹 서버와 웹 브라우저 양쪽에서 생성할 수 있다.
  • 동작 방식은 생성 → 저장 → 전송 단계로 구성된다.
  • 쿠키가 등장하게 된 배경 추측해보기
    • 처음에는 웹이 정보 공유의 목적으로 시작되었다고 들었다. 그렇다보니 html 문서 정도만 보여주면 됐을 것이므로 상태유지에 대한 필요성을 느낄 수 없었을 것 같다.
    • 하지만 웹을 통해 서비스를 제공하는 등, 기술과 요구사항이 발전함에 따라 상태를 저장하지 않고서는 극복할 수 없는 한계에 자연스럽게 도달한 것 같다.
  • 장점
    • 사용자 컴퓨터에 저장되기 때문에 서버 리소스에 부하를 주지 않는다.
    • 설정에 따라, 세션보다 훨씬 오래 지속될 수도 있다.
  • 단점
    • 쿠키는 일반 텍스트로 저장되고, 누구나 쿠키를 열거나 변조할 수 있기 때문에 보안 위험이 발생할 수 있다.
    • 쿠키를 수동으로 암호화 및 암호 해독할 수 있지만 암호화 및 암호 해독에 필요한 시간 때문에 추가 코딩이 필요하고 애플리케이션 성능에 영향을 줄 수 있다.
    • 쿠키 사이즈, 개수에 제한이 있다.
    • 사용자가 브라우저 설정에서 쿠키를 비활성화할 수 있다. 따라서, 그러한 가능성을 예측해서 코딩해야 한다.
    • 복잡한 데이터 구조는 저장할 수 없고 일반 텍스트(문자열)만 허용한다.

참고 : 2018년 기준 브라우저별 최대 쿠키 사이즈, 개수

Web BrowserMaximum cookiesMaximum size per cookie
크롬1804096 bytes
파이어폭스1504097 bytes
오페라1804096 bytes

세션


  • 세션이란 웹 컨테이너에 저장하는 상태 정보이다.
  • 웹 컨테이너는 기본적으로 한 웹 브라우저마다 한 세션을 생성한다.
  • 세션은 사용자가 애플리케이션에서 로그아웃하거나 웹 브라우저를 닫으면 종료된다.
  • 세션은 주로 쿠키와 함께 사용된다.
    • 서버가 클라이언트 ID(톰캣의 경우 JSESSIONID)를 어떤 방법으로 추적할 것인지 정의한 것을 ‘세션 트래킹 모드’라고 한다.
    • 트래킹 모드에는 쿠키 사용 모드, URL Rewriting 모드, SSL 모드 가 있는데 대부분 서버에서 쿠키 사용 모드를 기본값으로 하고 있고 이 모드 사용을 권장하고 있다.
    • 그래서 특별한 설정이 없으면 클라이언트를 구분하기 위해 쿠키를 활용한다.
  • 장점
    • 서버측 메모리의 한계까지 저장할 수 있다.
    • 서버에 저장되므로 쿠키보다 보안 측면에서 안전하다.
    • 데이터를 Hash Table에 저장 : 한번에 많은 정보를 하나의 세션 객체에 저장가능
  • 단점
    • 서버에 데이터를 저장하므로 사용자가 많아질수록 서버에 부하가 커진다.

더 공부해야할 부분


  • 웹, HTTP 전반에 대한 이해

참고 자료


This post is licensed under CC BY 4.0 by the author.