현대의 웹 서비스는 대부분 로그인을 통해 마이페이지, 유료 서비스 등 개인만의 서비스를 이용한다. 웹 서버는 수많은 클라이언트와 HTTP 프로토콜을 사용해 통신한다. 손님 계정으로 로그인 했다면 손님이 이용할 수 있는 서비스를 제공하고, 관리자 계정으로 로그인 했다면 데이터베이스, 회원 관리 등의 관리자 페이지를 제공해야 한다.
그렇다면 웹 서버는 수많은 클라이언트를 어떻게 구별하고 서로 다른 결과를 반환해주는 걸까? HTTP 프로토콜로 웹 서버와 통신할 때에는 웹 서버에 명령을 내리기 위해 GET, POST와 같은 메소드와 자원의 위치를 가리키는 URL 등이 포함되어 있다. 이외에도 **헤더(Header)**를 통해서 웹 서버에게 요청을 보내고, 웹 서버는 헤더를 읽고 클라이언트에게 결과 값을 반환한다. 이때, 헤더에는 클라이언트의 정보와 요청의 내용을 구체화하는 등의 데이터가 포함되는데, 클라이언트의 인증 정보 또한 포함될 수 있다.
클라이언트의 IP 주소와 User-Agent는 매번 변경될 수 있는 고유하지 않은 정보일 뿐만 아니라, HTTP 프로토콜의 Connectionless와 Stateless 특징 때문에 웹 서버는 클라이언트를 기억할 수 없다. 아래 표에서 HTTP의 두 가지 특징에 대한 설명을 볼 수 있다.
| HTTP 프로토콜 특징 |
|---|
| • Connectionless: 하나의 요청에 하나의 응답을 한 후 연결을 종료하는 것을 의미한다. 특정 요청에 대한 연결은 이후의 요청과 이어지지 않고 새 요청이 있을 때 마다 항상 새로운 연결을 맺는다. |
| • Stateless: 통신이 끝난 후, 상태 정보를 저장하지 않는 것을 의미한다. 이전 연결에서 사용한 데이터를 다른 연결에서 요구할 수 없다. |
Connectionless, Stateless 특성을 갖는 HTTP에서 상태를 유지하기 위해 **쿠키(Cookie)**가 탄생했다. 쿠키는 Key와 Value로 이루어진 일종의 단위로, 서버가 클라이언트에게 쿠키를 발급하면, 클라이언트는 서버에 요청을 보낼 때 마다 쿠키를 같이 전송한다. 서버는 클라이언트의 요청에 포함된 쿠키를 확인해 클라이언트를 구분할 수 있다.
용도
일반적으로 쿠키는 클라이언트의 정보 기록과 상태 정보를 표현하는 용도로 사용한다.
정보 기록
웹 서비스 사용 시 종종 등장하는 팝업 창에 “다시 보지 않기”, “7일 간 표시하지 않기” 버튼이 있는 것을 확인할 수 있다. 웹 서버는 각 클라이언트의 팝업 옵션을 기억하기 위해 쿠키에 해당 정보를 기록하고, 쿠키를 통해 팝업 창 표시 여부를 판단한다. 과거에는 클라이언트의 정보를 저장하기 위해 쿠키가 종종 사용되었다. 쿠키는 서버와 통신할 때마다 전송되기 때문에 쿠키가 필요 없는 요청을 보낼 때 리소스 낭비가 발생할 수 있다. 최근에는 이러한 단점을 보완하기 위해 Modern Storage APIs를 통해 데이터를 저장하는 방식을 권장하고 있다.
상태 정보
많은 웹 사이트에서는 회원 가입과 로그인을 통해 개개인에게 맞춤형 서비스를 제공한다. 웹 서버에서는 수많은 클라이언트의 로그인 상태와 이용자를 구별해야 하는데, 이때 클라이언트를 식별할 수 있는 값을 쿠키에 저장해 사용한다.