쿠키
HTTP 쿠키는 웹 쿠키, 브라우저 쿠키로도 불리는데 서버가 사용자의 웹 브라우저에 전송하는 작은 데이터 조각을 의미합니다. 루 몬텔루라는 웹 브라우저 개발자가 웹 사이트에 접속한 클라이언트를 확인하기 위해 만들었다. HTTP 통신은 stateless입니다. 그렇기 때문에 통신이 종료되면 서버는 클라이언트가 누구인지를 알 수 없습니다. 그래서 클라이언트를 확인하기 위해서는 쿠키라는 방식을 사용합니다. 쿠키는 주로 세션 관리( 서버에서 관리하는 로그인 등의 정보를 의미한다. ), 개인 설정유지, 사용자 트래킹( 사용자의 행동을 기록하고 분석하는 것 ) 용도로 사용됩니다.
Stateless
HTTP의 stateless는 서버 입장에서 클라이언트의 상태가 없다는 의미입니다. 동일한 클라이언트의 요청이라도 매번 각 요청은 독립적이라는 의미입니다. 예를 들어 호텔 손님이 입장했다가 외출했을 때 카운터에서는 손님들을 한명 한명 다 기억할수가 없다. 그렇기 때문에 호텔에서는 재입장하는 손님을 구분하기 위해 명부 작성 및 호텔 키를 제공합니다. 마찬가지로 서버도 이미 요청을 한 클라이언트를 기억하기 위해 세션 작성 및 쿠키를 클라이언트에게 줍니다.
쿠키의 특징
•
쿠키는 한개에 4KB 까지 저장 가능하며, 최대 300개 까지 저장할 수 있는 텍스트 파일이다.
•
쿠키는 클라이언트에 저장된다.
•
쿠키에는 이름, 값, 만료날짜, 경로 정보가 들어있다.
•
기본적으로 쿠키는 웹 브라우저가 종료되면 삭제된다. ( 만료날짜를 지정해 주면 만료일이 되야 삭제된다.)
•
웹 브라우저에 해당 서버의 쿠키 정보가 있으면 HTTP 요청 (HTTP 헤더의 Cookie)에 무조건 담아 보낸다.
쿠키의 작동 방식
쿠키도 결국 HTTP 통신에서 이루어지는 것이기 때문에 HTTP 의 응답과 요청에 따라 작동합니다. 요청을 받은 서버에서 쿠키를 클라이언트로 보내고 클라이언트는 쿠키를 받으면 도메인 서버 이름으로 정렬된 쿠키 디렉토리에 쿠키(정보)를 저장합니다. 이후 클라이언트가 동일한 서버로 HTTP 요청을 보내면 저장된 쿠키도 같이 전송되며, 만약 서버에서 쿠키에 업데이트된 내용이 있으면 응답할 때 다시 업데이트된 쿠키를 보내줍니다.
세션
세션(session)은 서버에 세션에 대한 정보를 저장해 놓고 세션 쿠키를 클라이언트에게 주어 서버가 클라이언트를 식별할 수 있도록 하는 방식자체를 의미합니다. 세션에 대한 정보는 세션 상태, 클라이언트 상태, 세션 데이터 등을 의미하며, 세션 쿠키는 고유한 세션 ID 값을 의미합니다.
세션의 특징
•
따로 용량의 제한이 없다. ( 서버의 능력에 따라 다를 수 있다. )
•
서버에 세션 객체를 생성하며 각 클라이언트 마다 고유한 세션 ID 값을 부여한다.
•
쿠키를 사용하여 세션 ID 값을 클라이언트에 보낸다.
•
웹 브라우저가 종료되면 세션 쿠키는 삭제된다.
세션 작동방식
세션의 작동방식을 보면 우선 클라이언트가 서버에 요청을 보내면 서버에서는 클라이언트가보낸 HTTP 메세지의 요청헤더의 쿠키에 세션 ID가 있는지 확인합니다. 만약 요청에 세션 ID가 없다면 서버에서는 세션 ID를 생성한 뒤 응답을 보낼 때 쿠키에 세션 ID를 담아 보냅니다. 클라이언트는 응답에서 받은 세션 쿠키에 세션 ID 를 저장해두고, 매번 해당 서버에 요청을 보낼 때마다 세션 쿠키를 함께 보내서 자신이 누구인지 인증합니다. 쿠키에 담긴 세션 ID는 브라우저가 종료되면 삭제됩니다.
쿠키와 세션의 관계
흔히 쿠키와 세션을 비교할 때 쿠키는 클라이언트에 정보를 저장하는 것이고, 세션은 서버에 정보를 저장하는 것이다 라고 비교합니다. 결국 세션은 쿠키를 이용하는 하나의 방식일 뿐입니다. 쿠키는 stateless 한 HTTP 통신에서 클라이언트에게 정보를 주어 해당 클라이언트를 식별하기 위해 만들어졌습니다. 클라이언트가 식별이 가능해야 서버는 특정 클라이언트와 계속해서 통신을 하고 있는지 확인이 가능하기 때문입니다.
하지만 클라이언트에 저장된다는 쿠키의 특징은 보안에 있어서는 치명적인 단점입니다. 예를 들어 로그인을 위해 사용자가 입력한 아이디와 비밀번호를 쿠키에 담아 클라이언트에 저장한 뒤 서버에서는 쿠키로 해당 사용자가 로그인한 사용자인지 확인한다고 생각해봅시다. 그러면 누군가 마음만 먹으면 쿠키를 확인해 클라이언트에 저장된 아이디와 비밀번호를 볼 수 있습니다.
그래서 세션이라는 개념을 통해 중요한 정보는 서버에서 관리하고 클라이언트에게는 세션 쿠키( 세션 ID )를 주어 식별이 가능하도록 한 것입니다.
결론적으로 서버 입장에서 클라이언트의 일관성을 위해 쿠키를 사용합니다. 세션에 클라이언트의 정보가 담긴 공간을 확보하고 값을 저장한 뒤, 그 공간을 나타내는 세션 ID를 쿠키에 담아 클라이언트에 보냅니다. 한번만 이 과정을 거치면 서버는 쿠키에 담긴 세션 ID를 통해 클라이언트가 누구인지 확인할 수 있습니다.