웹 서버는 서로 다른 수천 개의 클라이언트들과 동시에 통신한다. 이 서버들은 익명의 클라이언트들로부터 받는 모든 요청을 처리하는 것뿐만 아니라 서버와 통신하고 있는 클라이언트를 추적해야 할 수도 있다.
HTTP는 익명으로 사용하며 상태가 없다. 즉, 연결 자체에 대한 정보를 가지지 않으며 매 요청은 일회성이고 독립적으로 처리된다. 웹 서버는 요청을 보낸 사용자를 식별하거나 방문자가 보낸 연속적인 요청을 추적하기 위해 쿠키와 세션을 이용한다.
쿠키는 사용자를 식별하고 세션을 유지하는 방식 중에서 현재까지 가장 널리 사용하는 방식이다. 쿠키의 기본적인 발상은 브라우저가 서버 관련 정보를 저장하고, 사용자가 해당 서버에 접근할 때마다 그 정보를 함께 전송하게 하는 것이다.
쿠키는 크게 세션 쿠키(session cookie)와 지속 쿠키(persistent cookie) 두 가지 타입으로 나눌 수 있다.
쿠키는 서버가 사용자에게 "안녕, 내 이름은.."라고 적어서 붙이는 스티커와 같다. 사용자가 웹 사이트에 방문하면, 웹 사이트는 서버가 사용자에게 붙인 모든 스티커를 읽을 수 있다.
처음에 사용자가 웹 사이트에 방문하면 웹 서버는 사용자에 대해 아무것도 모른다. 웹 서버는 사용자가 다시 돌아왔을 때 해당 사용자를 식별하기 위한 유일한 값을 쿠키에 할당한다. 쿠키는 <이름=값> 형태의 리스트를 가지고, 그 리스트는 'Set-Cookie'와 같은 HTTP 응답 헤더에 기술되어 사용자에게 전달한다.
예를 들어 그림 11-3b와 같이 서버는 id="34294"라는 쿠키를 사용자에게 할당한다. 서버는 이 쿠키 값으로 데이터베이스에서 사용자의 정보(구매 내용, 주소 정보 등)를 찾는 데 사용할 수 있다.
브라우저는 서버로 온 'Set-Cookie' 헤더에 있는 쿠키 콘텐츠를 브라우저 쿠키 데이터베이스에 저장한다. 사용자가 미래에 같은 사이트를 방문하면(그림 11-3c), 브라우저는 서버가 이 사용자에게 할당했던 쿠키를 Cookie 요청 헤더에 기술해 전송한다.
일정 시간 동안 같은 사용자로부터 들어오는 일련의 요구를 하나의 상태로 보고, 그 상태를 일정하게 유지시키는 기술이다. 여기서 일정 시간은, 웹 서버 접속부터 브라우저 종료 시점까지를 말한다.
세션 ID는 웹 브라우저당 1개씩 생성되어 웹 컨테이너에 저장된다. 서버에 저장되기 때문에 보안 상 쿠키보다 낫고 그 크기에 제한도 없다.
쿠키 | 세션 | |
---|---|---|
저장위치 | 클라이언트 | 서버 |
저장형식 | text | Object |
용량제한 | 도메인당 20개 | 제한 없음 |
만료 시점 | 쿠키 저장 시 설정 | 알 수 없음 |
여기서 세션의 만료 시점을 알 수 없는 이유는, 클라이언트가 로그아웃하거나 설정한 시간 동안 반응이 없을 경우 무효화되기 때문에 정확한 시점을 알 수 없기 때문이다.
단, 세션은 서버의 자원을 사용하기 때문에 그 양이 늘어나면 서버의 속도 저하를 불러일으킬 수 있다.