[WEB] 세션, 쿠키, 캐시

Session and cookies are cached to store something

Posted by Sol on February 16, 2021 · 5 mins read

헷갈릴 수 있는 개념인 세션, 쿠키, 캐시를 정리해보고자 한다.

셋의 공통점은, 나중에 재활용할 가능성이 있는 특정 정보를 어딘가에 미리 저장해놓는다는 점이다.

따라서 우리가 주목해야 할 점은 세 개념의 차이점세 개념의 활용 용도가 될 것이다.


쿠키(Cookie)와 세션(Session)

캐시는 잠시 뒤로 빼두고, 쿠키와 세션부터 살펴보자.

쿠키와 세션은 왜 필요하며 어떨 때 사용할까?

그것은 Stateless, connectionless의 특징을 지니는 HTTP 프로토콜때문이다.

HTTP 프로토콜 상에서 서버는 그냥 data 전달자의 역할만 할 뿐,

클라이언트의 상태를 저장해놓지 않는다.

그러나 웹상에서 유저의 상태를 저장해놓아야 하는 경우가 발생한다. 로그인같은..

따라서 클라이언트는 로그인 정보와 같은 유지되어야 할 정보를 어딘가에 저장해놓아야 하는데,

저장할 수 있는 공간은 클라이언트의 브라우저 & 서버 의 두 가지 공간이다.

쿠키와 세션의 차이는 저장되는 정보의 위치라 할 수 있다.

  • 브라우저(사용자의 로컬)에 저장되면 쿠키
  • 서버에 저장되면 세션
  • 쿠키는 쇼핑몰 장바구니 정보, 자동로그인, “오늘 이 창을 더이상…“팝업 정보 저장
  • 세션은 로그인정보 저장


쿠키(Cookie)

쿠키의 생성과정을 살펴보자.

클라이언트 브라우저가 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로 제한된다고 한다.


세션(Session)

쿠키가 필요한 정보를 클라이언트 브라우저에 저장해놓는 기술이라면,

세션은 서버에 연결 상태를 유지시키는기술이다.

세션은 로그인, 로그아웃 기능을 구현할 때 처음 접했었는데, 그 당시엔 WAS니, stateless니 하는 개념에 대한 이해가 거의 없었던 시기라…이게 도대체 무슨소린가 했었다.

클라이언트의 Request를 서버가 받으면, 서버는 해당 클라이언트에게 고유의 id를 부여, 등록한다.

이후 클라이언트는 Request를 보낼 때 마다 서버에 저장된 본인의 id를 같이 보내면,

서버는 등록된 id를 가지고 데이터를 찾아서 읽는다.

세션은 쿠키와 달리 브라우저 종료 시 만료되어 사라진다.

따라서 세션으로 구현된 로그인은 브라우저를 껐다 키면 저절로 로그아웃된다.


세션과 쿠키의 장단점

  • 쿠키는 클라이언트 로컬에 저장되므로 보안에 취약하나, 세션은 서버에 저장되므로 상대적으로 보안성이 높다.
  • 세션은 서버에 저장되므로 리퀘스트가 많으면 서버에 오버헤드가 발생할 수 있으나, 쿠키는 로컬에 저장하기 때문에 가볍다.


캐시(Cache)

사실 캐시라는 말 자체가 ‘‘a hidden store of things, or the place where they are kept”,

즉 특정 정보를 어딘가에 보관하는 것을 뜻한다.

컴퓨터 구조에서도 캐시는 필요한 정보를 미리 저장해두었다가 cpu의 연산을 돕는 역할을 한다.

넓은 의미로 보면 정보를 저장하는 쿠키와 세션도 ‘캐싱’이라고 볼 수도 있을 거 같은데(내생각),

네트워크 세계에서의 캐시는 웹 리소스 파일들의 임시저장 공간이라고 정의되어진 것 같다.

캐시란, 이미지, 비디오, js, css 등 ‘재사용가능성이 높은 리소스들’을 클라이언트 로컬에 저장해놓았다가,

다음번 로딩때는 미리 저장해둔 캐시 데이터를 활용하여 렌더링 성능을 높이는 방법이다.

클라이언트 단에 저장된다는 점은 쿠키와 비슷하나, 그 목적이 다르다.

  • 쿠키는 클라이언트에 필요한 정보를 저장 - 상태정보(state) 저장 목적
  • 캐시는 사이트 리소스를 저장 - 렌더링 성능 향상 목적

컴퓨터 운영체제의 페이지 교체 알고리즘인 LRU Cache가 이 캐시 기법의 하나라고 할 수 있겠다.

(구현은 자료구조 포스팅에…)

자신이 필요한 정보가 캐시에 들어있는 것을 캐시 히트(hit), 그 반대를 캐시 미스(miss)라고 하며,

캐시 적중률을 높이기 위해 많은 알고리즘이 고안되었다(여기서 포스팅하지는 않겠다..).



참고 블로그