배경
로그인을 하거나, 브라우저에 아이디를 기억해 두거나, 광고 팝업에 대해서 보지 않음을 선택하거나 등등 클라이언트의 정보를 기억해야 하는 stateful한 서비스가 점점 늘어나고 있다.
하지만 HTTP의 특성상 기본적으로 connectionless, stateless한 특성을 갖고 있기 때문에 서버는 클라이언트의 정보를 기억할 수 없다.
이러한 HTTP의 약점을 극복하기 위에 쿠키와 세션이란 개념이 도입되었다.
쿠키
쿠키란 웹 서버가 브라우저에 지시하여 로컬컴퓨터 파일 또는 메모리에 저장하는 작은 데이터 파일이다.
쿠키에는 다음의 두 가지의 종류가 있다.
- Session-Cookie
메모리에 저장되며 브라우저 종료시 삭제된다. - Persistent-Cookie
디스크에 저장되며, 브라우저를 닫거나 컴퓨터를 재시작해도 남아닜다. - Secure-Cookie
HTTPS에서만 사용하며, 쿠키의 정보가 암호화 되어 전달된다. - Third-Party-Cookie
방문한 도메인과 다른 도메인의 쿠키다. 보통 광고를 통해 도메인에 접속을 할 때 어떠한 도메인에서 유입이 되었는지 확인하기 위해 사용한다.
쿠키의 구성 요소
쿠키는 다음과 같은 요소들로 구성되어있다.
- Name
쿠키의 이름 - Value
쿠키의 값 - Expires
만료일
쿠키에 만료일이 포함되어 있으면 영구적으로 간주한다.
Max-Age를 통해 지정된 만료일이 되면 디스크에서 쿠키를 제거한다. - Domain
쿠키가 사용되는 도메인 - Path
쿠키를 반환할 경로 - Secure
보안 연결 설정 - HttpOnly
Http외에 다른 통신 가능 설정
쿠키의 생성 과정
- 클라이언트가 서버에 요청한다.
- 서버는 쿠키를 만들어 Header에 포함시켜 응답한다.
- 클라이언트는 이를 브라우저에 기억해놓고 매 요청 때마다 Header에 포함시켜 요청한다.
다음과 같이 브라우저의 개발자 모드를 통해 쿠키를 확인할 수 있다.
쿠키의 단점
- 매 요청마다 헤더에 쿠키를 담아 보내야 하므로 상당한 트래픽이 발생한다.
- 결제 정보와 같은 중요한 정보를 쿠키에 담을 경우 도중에 유출될 수 있다.
세션
- Session Id를 식별자로 구별하여 데이터를 사용자의 브라우저에 쿠키형태가 아닌 접속한 서버 DB에 정보를 저장 합니다.
- 클라이언트는 HTTP Session Id를 쿠키로 메모리 저장된 형태로 가지고 있습니다. (위에서 언급한 Session Cookie)
- 따라서 브라우저 종료시 사라진다.
세션의 생성 과정
- 클라이언트가 서버에 요청한다.
- 서버는 해당 클라이언트에 고유햔 Session Id를 발급해 Header에 담아 응답한다.(이 때 클라이언트의 정보는 Session Id를 키로 갖고 서버에 저장이 된다.)
- 클라이언트는 브라우저 종료나 세션 만료시간까지 해당 Session Id를 Header에 담아 통신을 한다.
장점과 단점
이러한 세션의 특성으로 인해 서버에서 데이터를 용이하게 관리하고 헤더에 데이터를 담아 통신을 하진 않기에 안전하다는 장점이 있지만, 세션 저장장치가 부족할 경우나, load-balancing/시스템 효율성에서 다루기 어렵는 단점이 있다.
해결방법
- load-balancing의 문제는 세션 정보를 하나의 저장장치에 저장해 두거나
- 각각의 클라이언트를 다른 서버에 할당 시키는 방법으로 문제를 해결한다.
- 저장장치 문제인 경우 메모리 기반의 저장장치를 이용하여 해결할 수 있다.
하지만 클라이언트의 최대인원을 제한해야 한다.
캐시
세션과 쿠키 이외에도 웹 페이지의 정보를 저장할 수 있는데 바로 캐시이다. 세션/쿠키와 캐시는 존재 목적이 다르니 오해하지 말자.
캐시는 웹 페이지 요소를 저장하기 위한 임시 저장소이고,
쿠키/세션은 정보를 저장하기 위해 사용된다.
쿠키/세션은 사용자의 인증을 도와주는 반면 캐시의 역할은 다음과 같다.
- 웹페이지의 요소를 저장하기 위한 임시 저장소이다.
- 웹페이지를 빠르게 렌더링 하기 위한 목적으로 사용된다.
- 이미지, 비디오, 오디오, css, js파일 등 데이터나 값을 미리 복사해 놓는다.
- 저장 공간이 작고 비용이 비싼 대신 빠른 성능을 제공한다.
- 같은 웹 페이지에 접속할 때 사용자의 PC에서 로드하므로 서버를 거치지 않아도 된다.
- 이전에 사용된 데이터가 다시 사용될 가능성이 많으면 캐시 서버에 있는 데이터를 사용한다.