헷갈릴 수 있는 개념인 세션, 쿠키, 캐시를 정리해보고자 한다.
셋의 공통점은, 나중에 재활용할 가능성이 있는 특정 정보를 어딘가에 미리 저장해놓는다는 점이다.
따라서 우리가 주목해야 할 점은 세 개념의 차이점 및 세 개념의 활용 용도가 될 것이다.
캐시는 잠시 뒤로 빼두고, 쿠키와 세션부터 살펴보자.
쿠키와 세션은 왜 필요하며 어떨 때 사용할까?
그것은 Stateless, connectionless의 특징을 지니는 HTTP 프로토콜때문이다.
HTTP 프로토콜 상에서 서버는 그냥 data 전달자의 역할만 할 뿐,
클라이언트의 상태를 저장해놓지 않는다.
그러나 웹상에서 유저의 상태를 저장해놓아야 하는 경우가 발생한다. 로그인같은..
따라서 클라이언트는 로그인 정보와 같은 유지되어야 할 정보를 어딘가에 저장해놓아야 하는데,
저장할 수 있는 공간은 클라이언트의 브라우저 & 서버 의 두 가지 공간이다.
쿠키와 세션의 차이는 저장되는 정보의 위치라 할 수 있다.
쿠키의 생성과정을 살펴보자.
클라이언트 브라우저가 HTTP 프로토콜로 최초로 서버에 Request를 보낸다.
이 시점에서는 아직 아무 쿠키도 전달받지 않았으므로 HTTP request 쿠키 헤더는 비어있다.
그리고 서버에서 response를 전송할 때,
응답 헤더에 Set-Cookie를 통해 Key-Value로 쿠키를 실어보낸다.
이 때, 헤더에 쿠키의 여러가지 정보를 함께 보낼 수 있는데, 그 정보란
유효기간(Expires), 도메인(Domain), 경로(Path), 보안(Secure) 등이다.
쿠키의 기본구조는 아래와 같다.
Set-Cookie: name=value; expires=[Date]; domain=[Domain]; path=[Path]; [secure]
Java로 쿠키를 생성, 세팅하는 코드는 아래와 같다.
String id = "myid";
HttpCookie cookie = new HttpCookie("userId", id); // 쿠키를 생성한다
cookie.setComment("This is a comment"); // 주석을 설정한다
cookie.setValue("id is myid"); // value를 설정한다.
cookie.setMaxAge(60 * 60 * 24 * 7); // 유효기간을 설정한다 - 7일의 경우
cookie.setDomain("www.naver.com"); // 도메인을 설정한다
cookie.setPath("/"); // 하위 경로를 설정한다 - 도메인의 하위 경로에서도 쿠키 사용 가능
cookie.setSecure(true); // 보안을 설정한다 - true시 SSL 통신시에만 쿠키를 전송하도록 함.
만약 setMaxAge - 유효기간을 설정하지 않으면 해당 쿠키는 세선 쿠키가 되어
클라이언트가 종료될 때 삭제된다.
쿠키가 클라이언트 브라우저에 전송되면 브라우저에 저장되고 (크롬 개발자모드에서 확인 가능)
그 다음 request부터는 헤더에 cookie를 담아서 서버에 전송한다.
따라서 서버는 다음 request부터 cookie 정보를 클라이언트로부터 받으므로 저장된 정보를 확인할 수 있다.
한 클라이언트는 300개까지 쿠키 저장이 가능하며,
하나의 도메인 당 20개의 쿠키만 가질 수 있으며,
한 쿠키의 용량은 4KB로 제한된다고 한다.
쿠키가 필요한 정보를 클라이언트 브라우저에 저장해놓는 기술이라면,
세션은 서버에 연결 상태를 유지시키는기술이다.
세션은 로그인, 로그아웃 기능을 구현할 때 처음 접했었는데, 그 당시엔 WAS니, stateless니 하는 개념에 대한 이해가 거의 없었던 시기라…이게 도대체 무슨소린가 했었다.
클라이언트의 Request를 서버가 받으면, 서버는 해당 클라이언트에게 고유의 id를 부여, 등록한다.
이후 클라이언트는 Request를 보낼 때 마다 서버에 저장된 본인의 id를 같이 보내면,
서버는 등록된 id를 가지고 데이터를 찾아서 읽는다.
세션은 쿠키와 달리 브라우저 종료 시 만료되어 사라진다.
따라서 세션으로 구현된 로그인은 브라우저를 껐다 키면 저절로 로그아웃된다.
사실 캐시라는 말 자체가 ‘‘a hidden store of things, or the place where they are kept”,
즉 특정 정보를 어딘가에 보관하는 것을 뜻한다.
컴퓨터 구조에서도 캐시는 필요한 정보를 미리 저장해두었다가 cpu의 연산을 돕는 역할을 한다.
넓은 의미로 보면 정보를 저장하는 쿠키와 세션도 ‘캐싱’이라고 볼 수도 있을 거 같은데(내생각),
네트워크 세계에서의 캐시는 웹 리소스 파일들의 임시저장 공간이라고 정의되어진 것 같다.
캐시란, 이미지, 비디오, js, css 등 ‘재사용가능성이 높은 리소스들’을 클라이언트 로컬에 저장해놓았다가,
다음번 로딩때는 미리 저장해둔 캐시 데이터를 활용하여 렌더링 성능을 높이는 방법이다.
클라이언트 단에 저장된다는 점은 쿠키와 비슷하나, 그 목적이 다르다.
컴퓨터 운영체제의 페이지 교체 알고리즘인 LRU Cache가 이 캐시 기법의 하나라고 할 수 있겠다.
(구현은 자료구조 포스팅에…)
자신이 필요한 정보가 캐시에 들어있는 것을 캐시 히트(hit), 그 반대를 캐시 미스(miss)라고 하며,
캐시 적중률을 높이기 위해 많은 알고리즘이 고안되었다(여기서 포스팅하지는 않겠다..).