ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 세션, 쿠키, 캐시
    2016. 5. 21. 16:51

    세션과 쿠키, 캐시의 정의에 대해 매번 햇갈려 정리합니다. 

    1. Stateless 프로토콜

    기본적인 HTTP통신의 원칙은 Stateless입니다. 클라이언트의 상태를 가지지 않는 서버 처리 방식을 말합니다. 다시 말해, 클라이언트와의 첫번째 통신에서 데이터를 받았다고 해도 두번째 통신에서 이 데이터를 계승하지 않는 처리 방식입니다. 하지만 실제 서비스에서는 이와 같은 기본 원칙보다 Stateful한 방식이 필요한 경우가 많습니다. 예를 들어, 상품을 선택하고, 구입을 하는 예를 생각해 봅니다. 상품 선택의 통신이 끝난후, 상품 구입의 리퀘스트가 서버로 보내지게 될 터인데, 여기서 만약 서버가 선택한 상품의 정보(상태)를 가지고 있지 않다면 유저는 상품을 구입 할 수가 없습니다. 따라서 웹 어플리케이션 개발자는 이런 HTTP의 stateless 특성 위에 stateful과 같은 시스템을 개발 할 필요가 생기게 됩니다. 

    Stateful을 가능하게 만든 방법으로 쿠키와 세션이 있습니다. 두개의 큰 차이는 상태정보를 어디에 저장하는지 입니다. 쿠키는 브라우저에 의해 클라이언트 측에 저장되고 세션은 서버 측에 저장됩니다.

    만약 세션을 사용하면 특정 클라이언트가 무엇을 요청하는지 저장되어 있어 요청에 대한 응답을 실행하지만 쿠키의 경우 서버는 특정 클라이언트가 무엇을 주문했는지 기억하지 않고 클라이언트가 저장되어 있는 이전 데이터를 불러와 반복적으로 서버에게 요청합니다.

    쿠키

    쿠키는 브라우저에 보존되고, 통신시에 HTTP 헤더에 저장되어지는 텍스트 파일입니다. 쿠키를 이용한 실제의 stateful 통신의 흐름은 다음과 같습니다.

    1. 최초 통신에서는 클라이언트가 서버의 쿠키를 가지고 있지 않은 상태에서 request한다.
    2. 서버는 request의 헤더에 쿠키가 포함되어 있지 않은것을 판단하고, 통신의 상태(유저ID, 패스워드, 조작상태, 방문횟수 등)을 저장한 쿠키를 response한다.
    3. 클라이언트의 브라우저가 받은 쿠키를 보존한다.
    4. 두 번째 연결에서 HTTP헤더에 쿠키를 싣어서 서버에 request한다.
    5. 서버는 받은 쿠키로부터 클라이언트를 판별한다.

    쿠키에는 다음과 같은 제약조건이 존재합니다.

    • 클라이언트는 총 300개의 쿠키를 저장할 수 있음
    • 하나의 도메인 당 20개의 쿠키를 가질 수 있음
    • 하나의 쿠키는 4096byte까지 저장 가능

    하나의 도메인에서 설정한 20개의 쿠키의 갯수가 20개가 넘으면 가장 적게 사용되는 쿠키부터 삭제됩니다.

    이러한 쿠키는 텍스트 형식으로 저장되며 쿠키가 사라지는 시점은 쿠키를 저장할 때 설정할 수 있고 만약 설정하지 않으면 해당 브라우저 종료시 삭제됩니다.

    또한 쿠키에는 단점이 존재하는데 사용자의 데이터가 컴퓨터에 저장된다는 보안적인 문제가 존재합니다. 또한 악성유저들은 이러한 정보를 악용하는 경우도 있습니다.


    세션

    세션은 클라이언트와 서버의 통신 상태를 가집니다. 세션을 이용한 다수의 HTTP통신을 하나의 묶음으로 “세션관리”라고 말합니다. 세션관리에서는 세션ID라는 것과 세션을 하나의 짝으로 취급하는데, 이때 세션ID만이 클라이언트에 보내집니다. 클라이언트에 세션ID를 전해주는 방법은 여러가지가 있으니 일반적으로 쿠키를 이용하는 경우가 많습니다. 클라이언트로부터 세션 ID를 받아 실제로 서버의 세션에 저장된 중요한 정보들과 관련을 짓기때문에 쿠키만을 이용한 방식보다 보안적인 측면에서 좋습니다.



    다수의 서버를 이용하는 경우에는 로그인한 시점에서 사용이 끝날때까지 한가지 서버만을 이용하게 하던지, 혹은 서버에 저장되는 세션정보를 전부 다 동기화를 해야합니다. 

    캐시

    Cache란 웹페이지 Resource 파일들 (오디오, 비디오, 이미지 등)의 임시 저장소로 다음에 같은 웹페이지 (또는 웹사이트) 접속 시 페이지 로딩 속도를 개선해주는 역할을 합니다. 

    댓글