이번 시간에는 쿠키(cookie)와 세션(session)에 대해서 살펴보도록 하겠습니다. 이 기술은 웹에서 로그인 상태를 유지하거나, 데이터를 저장하기 위하여 사용됩니다. :)

 

HTTP(Hypertext Transfer Protocol)에서 서버와 클라이언트 간의 통신은 아래 그림과 같이 요청과 응답으로 동작합니다.

 

 

위와 같은 형태는, 문서의 제공을 주 목적으로 하기 때문에, 서비스를 제공하기 위해서는 몇 가지 어려움이 존재합니다. 특히 서버의 입장에서 보면, 다음과 같은 어려운 점들이 있습니다. 주1)

 

첫째, 클라이언트와 서버간에 연결이 유지되지 않는다는 점입니다. 클라이언트는 자기 필요할 때만 페이지를 요청하고, 서버에게 데이터를 받고 접속을 끊어 버리게 됩니다. 서버의 입장에서 보면, 능동적으로 무언가를 할 수도 없고, 클라이언트는 자기 필요한 말만 하고 접속을 끊어버리기 때문에, 서비스를 제공하기가 참 난감합니다.

 

둘째, 클라이언트가 데이터를 요청할 때에, 서버는 클라이언트가 누가 누구인지 구별할 수가 없다는 것입니다. 아래 그림의 예를 보겠습니다. (서버가 클라이언트로부터 받는 메시지는 아래 그림 중 파란색의 메시지입니다)

 

 

서버의 입장에서 보면 요청 메시지(Request: 위의 GET이라고 쓰여진 부분)가 다 똑같이 생긴 터로, 서버는 누가 삼순이인지 누가 영심인지 알아볼 수가 없습니다. 그렇다면 우리가 사용하는 웹 서비스들은 어떤 방법으로 삼순이와 영심이를 구별할까요? 주2)

 

가장 간단한 방법은 두 사람에게 고유한 번호를 부여하는 것입니다. 학교에서 학생들에게 학번을 부여해서, 학생들을 구별하는 것과 같이, 서버도 클라이언트들에게 고유한 번호를 부여해서, 클라이언트들을 구별할 수 있습니다.

 

예를 들면, 아래의 그림과 같이 삼순이가 접속해서 로그인 했을 때, 서버는 삼순이에게 임의의 고유한 ID (예: 1번)을 부여할 수 있습니다.

 

 

삼순이는 이후의 모든 요청 메시지에 "Cookie: SESSIONID=1" 이라는 이름표를 붙여서, 자신의 아이디를 증명합니다. 즉, 삼순이의 모든 요청 메시지는 자신의 임시 ID (1번) 와 함께 전달되기 때문에, 서버는 이 값을 통해 삼순이를 구별할 수 있습니다.

 

동일하게, 영심이도 아래와 같이 서버로부터 아이디를 부여 받을 수 있습니다.

 

 

이와 같은 방법으로 서버는 삼순이와 영심이를 구별할 수 있습니다. 즉, 각 사용자를 구별하여 서비스를 제공할 수 있고. 또한 이를 응용하여, 각 사용자에게 부여된 ID를 통해 서버에 필요한 데이터들을 저장할 수도 있습니다. 세션(session)은 이 논리적 연결을 의미합니다. 주3)

 

보통의 경우는 서버는 삼순이가 로그인 하는 순간 세션을 생성하고, 일정기간동안 사용하지 않거나, 브라우저를 닫거나, 로그아웃 하는 순간 세션을 종료하게 됩니다. 또한, 삼순이가 로그아웃 했다가 다시 로그인하게 되면 새로운 세션 (예: 3번)을 새로 생성 및 할당하게 됩니다. 주4)

 

쿠키(Cookie)

 

세션의 목적과 유사하게, 쿠키의 목적은 제한된 상황에서 웹 서비스를 제공하기 위하여 사용됩니다. 다음과 같은 상황에서 서버가 장바구니 데이터를 어떻게 처리할 수 있을지 생각해봅시다.

 

영심이는 웹 서핑 중에 장바구니에 고기를 넣었습니다.

 

서버는 영심이의 장바구니에 고기가 있다는 것을 어떻게 기억할 수 있을까요? 물론, 세션을 사용하여도 됩니다. 세션을 사용하면 서버는 각 사용자를 구별할 수 있기 때문에, 영심이의 장바구니 내용을 기억할 수 있습니다. 그러나, 서버는 영심이의 장바구니 내용을 길게(2012년 10월 13일까지) 저장하고 싶고, 서버가 이 내용을 수고스럽게 기억하고 싶지는 않은 상황을 생각해봅시다. 이런 상황에서 쿠키는 유용합니다.

 

쿠키는 저장해야 할 데이터들을, 서버가 클라이언트에게 위임하는 방식입니다. 서버는 클라이언트에게 "(1) 네가 기억하고 있다가, 알려줘" 라고 명령한 후, (2) 클라이언트로부터 내용을 전달받게 됩니다. 기본 원리는 아래와 같습니다.

 

 

실제의 메시지는 아래와 같습니다.

 

 

메시지의 의미는 다음과 같습니다.

 

(1) 서버는 Set-Cookie라는 메시지를 통해 클라이언트에게 "cart=meat"라는 내용을 2013년 10월 13일까지 기억하도록 명령합니다. (Set-Cookie: cart=meat, 13 Oct 2013 00:00:00 GMT;)

(2) 이 메시지를 받은 클라이언트는 이후의 모든 요청 메시지에, 서버가 기억하라고 시킨 "cart=meat" 메시지를 함께 붙여서 보내게 됩니다. (Cookie: cart=meat)

 

쿠키는 텍스트로 된 간단한 내용(예: 장바구니)을 저장하기 위하여 주로 사용되며, 여러 목적에 맞게 응용이 가능합니다. 실제로, 우리가 살펴본 세션 또한 내부적으로는 쿠키를 응용한 방법입니다. (위의 세션 예제 메시지를 보시면 쿠키 메시지를 확인할 수 있습니다.)

 

여기까지 읽으시면서 어떤 분들은 서버가 시키는 대로 클라이언트가 무조건 쿠키를 생성 하면, 뭔가 문제가 생기지 않을까 하는 의문이 생기셨을 것입니다. 맞습니다. 그래서, 각 브라우저들은 검증되지 않은 사이트에 들어갈 때마다 '쿠키를 사용할까요?'라고 한번씩 더 물어보게 됩니다. 또한, 브라우저에서 쿠키 값들을 종종 지워주는 이유도 이러한 부작용을 방지하기 위해서입니다. 그러나, 쿠키는 브라우저 내부에서만 작동되기 때문에, 내 컴퓨터를 해롭게 하더라도, 쿠키 파일이 무겁게 쌓이거나, 브라우저가 엄청 느려지거나 정도의 소소한(?) 해악 정도만 끼칠 수 있기 때문에, 크게 걱정하실 필요는 없습니다. ;;;

 

주1) 이를 전문용어로는 stateless라고 합니다. 각 연결(Request/Response)이 각각 독립적으로 동작한다는 뜻입니다.

주2) 각 클라이언트의 구별을 위하여, 대부분의 웹 서버(JSP, PHP, ASP)는, 오늘 설명한 세션의 방식을 사용하지만, 기술적으로 클라이언트의 IP를 이용해서 각각을 구별하는 것도 가능합니다. [1]

주3) HTTP에서는 세션을 웹에서의 데이터 저장공간과 동일해서 보는 경우도 있지만, 세션의 정의는 다음과 같습니다.

(1) 망 환경에서 사용자 간 또는 컴퓨터 간의 대화를 위한 논리적 연결.

(2) 프로세스들 사이에 통신을 수행하기 위해서 메시지 교환을 통해 서로를 인식한 이후부터 통신을 마칠 때까지의 기간

[출처: 네이버 검색, 정보통신용어사전]

주4) 세션을 유지한다 라는 것은 '서버 자원을 사용한다' 라는 것과 동일 의미이기 때문에. 상황에 맞는 관리가 필요합니다. 서버는 각 정책을 만들어서 세션을 유지합니다

참고사이트:

[1] WIKI, Cookie, http://en.wikipedia.org/wiki/HTTP_cookie

[2] WIKI, Session, http://en.wikipedia.org/wiki/Session_%28computer_science%29

[3] WIKI, STATELESS, http://en.wikipedia.org/wiki/Stateless_protocol

Posted by kkckc
,