쿠키


쿠키란 웹사이드의 정보를 브라우저 쪽에서 저장하는 작은 파일이다. 일반적으로 데이터베이스는 클라이언트가 데이터베이스 관리시스템에 SQL을 발행해서 데이터를 저장하지만, 쿠키의 경우는 거꾸로 서버가 클라이언트에 '이 파일을 보관해줘'라고 쿠기 저장을 지시한다. 쿠키도 HTTP 헤더를 기반으로 구현됐는데, 서버에서는 다음과 같이 응답 헤더를 보낸다.

Set-Cookie: LAST_ACCESS_DATE=Jul/31/2016

이름= 값 형식으로 회신했는데, 클라이언트는 이 값을 저장해둔다. 다음번에 방문할 때는 다음과 같은 형식으로 보낸다. 서버는 이 설정을 읽고 클라이언트가 마지막으로 액세스한 시간을 알 수 있다.

Cookie: LAST_ACCESS_DATA=Jul/31/2016

서버 프로그램이 볼 땐 마치 데이터베이스처럼 외부에 데이터를 저장해두고, 클라이언트가 액세스할 때마다 데이터를 로드하는 것과 같다. HTTP는 스테이트리스( 언제 누가 요청해도 요청이 같으면 결과가 같음)을 기본으로 개발됐지만, 쿠키를 이용하면 (중단 지점부터 작업을 재개하는 등) 서버가 상태를 유지하는 스테이트풀 처럼 보이게 서비스를 제공할 수 있다.

브라우저에서도 자바스크립트로 쿠키를 읽어내거나 서버에 보낼 쿠키를 설정할 수 있다.

쿠키의 잘못된 사용법


쿠키는 편리한 기능이나, 몇 가지 제약이 있어 적절하지 못한 사용법이 있다. 우선 영속성 문제가 있는데, 쿠키는 어떤 상황에서도 확실하게 저장되는 것은 아니다. 비밀 모드 혹은 브라우저의 보안 설정에 따라 세션이 끝나면 초기화 되거나 쿠키를 보관하라는 서버의 지시를 무시하기도 한다. 방문 기록 삭제나 개발자 도구등으로 삭제되는 경우도 있다. 다시 말해 서버가 쿠키를 데이터 베이스 대신으로 쓸수는 없다. 쿠키가 초기화 되면 저장된 데이터가 사라지기 때문이다. 때문에 사라지더라도 문제가 없는 정보나 서버 정보로 복원 가능한 자료를 저장할 때에만 쓰여야 한다. 다른 하나는 용량의 문제이다. 쿠키는 최대 크기는 4kb 사양으로 정해져 있어 더 보낼 수는 없다. 쿠키는 헤더로서 항상 통신에 부가되므로 통신량 증가는 요청과 응답 속도 모두에 영향을 미친다. 제한된 용량과 통신량 증가는 데이터베이스로 사용하는데 제약이 된다. 마지막으로 보안 문제이다. secure 속성을 부여하면 HTTPS 프로토콜로 암호화된 통신에서만 쿠키가 전송되나 HTTP 통신에서는 쿠키가 평문으로 전송된다. 매 요청시 쿠키가 송수신 되는데 보여선 곤란한 비밀번호 등이 포함되면 노출될 위험성이 있다. 암호화된다고 해도 사용자가 자유롭게 접근할 수 있는 것도 문제이다. 원리상 사용자가 쿠키를 수정할 수도 있으므로 시스템에서 필요한 ID나 수정되면 오작동으로 이어지는 민감한 정보를 넣는데도 적합하지 않다. 떄문에 정보를 넣을 때는 서명이나 암호화 처리가 필수이다.

쿠키에 제약을 주다


클라이언트는 서버가 보낸 쿠키를 로컬 스토리지에 저장하고, 같은 URL로 접속할 때 저장된 쿠키를 일고 요청 헤더에 넣는다. 쿠키는 특정 서비스를 이용하는 토큰으로 이용될 때가 많아 쿠키가 필요하지 않는 서버에 전송하는 것은 보안이 위험해질 뿐이다. 그러므로 쿠키 보낼 곳을 제어하거나 쿠키의 수명을 설정하는 등 쿠키를 제한하는 속성 몇 가지가 정의되어 있다. HTTP 클라이언트는 속성을 해석해 쿠키 전송을 제어할 책임이 있다.