이번 글은 쿠키와 캐시에 관해 정리하도록 하겠습니다.
Index
- 쿠키 개념 & 사용법
- 캐시 개념 & Http 에서의 캐시 사용법
쿠키가 탄생하게 된 배경은 HTTP의 Stateless,Connectionless 한 특징 때문입니다.
HTTP는 통신을 진행하고 난 후, 연결을 끊기 때문에, 개념적으로 이어지는 행위라 할지라도, http connection 이 끊겼다 연결됬다 하기 때문에, 서버 입장에서는 Client가 누구인지 어떤 정보를 갖고있었는지 알지 못합니다.
이러한 상황을 해결하고자 나온 여러가지 기술 중 하나가 쿠키입니다.
위 상황의 가장 대표적인 예가 로그인 관련 예이다.
쿠키를 사용하여, 로그인 처리후 상태유지에 간단하게 설명해보겠습니다.
1. 로그인 페이지에서 아이디 / 비번 서버로 전송
2. 서버에서, 해당 유저 정보 확인 후 , set-cookie http header를 통해 sessionId 전달
3. 브라우저에서는, 쿠키를 매 요청시 자동으로 전달
4. 서버에서 받는 요청에서는, cookie에 저장된 sessionId를 통해 유저의 이어지는 행위에 대응이 가능
쿠키의 간단한 개념은 이렇고, 쿠키를 사용할 때, 쓰는 많은 옵션들을 알아보겠습니다.
위의 상황은 굉장히 간단하게 설명한것이고, 실제로 쿠키를 사용할 때에는 많은 제약조건을 붙여가며 사용해야 합니다.
서버에서 쿠키를 내릴 때 부터 알아보겠습니다.
set-cookie: sessionid={sessionId};expires={날짜};path={경로};domain={domain};Secure
이런식으로 사용하는데, 각 옵션들을 알아보겠습니다.
expires : 쿠키가 만료되는 날짜를 작성합니다.
ex) Set-Cookie: expires=Thu, 23-10-2023
max-age : value에 해당하는 값이 지나면 쿠키 삭제
ex) max-age=3600 ,3600초가 지나면 삭제됩니다.
Domain : 쿠기가 해당하는 도메인에만 생성하고, 이외의 도메인에서는 적용하지 않는다를 의미입니다.
(명시한 도메인 + 서브 도메인 포함)
Path : 해당 경로를 포함한 하위 경로 페이지만 쿠키에 접근 가능합니다.
(보통 루트로 지정합니다. path=/)
Secure : 쿠키가 https 인 경우에만 전송
HttpOnly : XSS 공격방지, 자바스크립트에서 쿠키 접근불가
SameSite : XSRF 공격방지, 요청 도메인과 쿠키에 설정된 도메인이 같은 경우에만 쿠키 전송
캐시의 개념을 이해하기 전에, 캐시의 하드웨어적 역할을 이야기 해보겠습니다.
하드웨어 관점에서 캐시란, 메모리보다 빠르고, Cpu보단 느린 cache를 메모리-캐시-CPU 위치시킴으로써, 데이터를 더 빨리 가져와 실행속도를 올리는 용도로 사용합니다.
(주로 제가 많이 사용하는 캐싱은 ,Server에서 Database에 Connection을 줄이기 위해서 사용합니다. Application 메모리에 데이터를 캐싱해두고, DB Connection을 최소화하고 Server에 들어온 요청에 응답합니다.)
그렇다면 Web 에서 캐시를 어떤방식으로 사용하는지 알아봅시다.
웹 브라우저에서는 캐시를 저장하는 브라우저 캐시가 존재합니다. 위의 설명한대로, 데이터들을 모아두고, 상황에 맞춰 새로 다운로드 받지 않고 기존에 존재하는 것을 통해 데이터를 나타냅니다.
이 때, 웹 브라우저 캐시에 있는 데이터가 최신 상태인지를 알 필요가 있습니다.
캐싱을 위해 확인하기 위해 사용되는 헤더들을 알아보겠습니다.
검증 헤더
- 캐시 데이터와 서버 데이터가 같은지 검증합니다.
- ex) Last-Modified, ETag
조건부 요청헤더
If-Modified-Since: Last-Modified와 같이 사용
해당하는 값 이래로 서버에서 데이터가 변경되었는지 확인하고, 변경되지 않았다면, 서버는, 304 not-modified를 내립니다.
ETAG, If-None-Match
캐시용 데이터에 임의의 고유한 버전 이름을 달아두거나 or 이름을 바꾸어서 Hash 생성합니다. (버전이 달라졋는지 확인한다고 생각하면 됩니다.)
ETAG를 사용하는 이유는, ETAG값을 통해서만, 값만 얻으면 되기 때문에 Client쪽에서, 캐시제어를 할 필요 없다는 장점이 있습니다.
캐싱과 관련되어 사용하는 헤더들을 알아봅시다.
Cache-Control: max-age
- 캐시 유효 시간을 의미합니다. 초 단위
Cache-Control: no-cache
- 데이터는 캐시해도 되지만, 원 서버에 검증하고 사용하라는 의미
Cache-Control: no-store
- 민감한 정보가 있으므로 캐싱하면 안된다는 의미
expires: Mon, 01 ~~
- 캐시 만료일을 정확한 날짜로 지정
간단하게 웹에서의 쿠키와 캐시에 대해 알아보았습니다. 추가적인 정보는 궁금할 때마다 찾아보는것으로 하겠습니다~