기술면접에서 접했던 질문 중 ‘캐시에 대해 설명해달라’는 내용이 있었는데, 너무 짧게 대답한 듯 하여 다시 공부하고자 포스팅을 작성하게 되었다.


참고로 캐시 개념은 쿠키, 세션과 많이 연관지어 설명이 되어있어서 캐시 뿐만 아니라 HTTP의 특성과, 쿠키, 세션도 캐시와 함께 알아보도록 하겠다.



1. HTTP의 특징

HTTP 프로토콜은 Stateless와 Connectionless라는 두 가지 특성을 가졌다.


(1) Stateless

  • 클라이언트의 상태 정보를 가지지 않는 처리 방식이다.
  • 클라이언트와 첫번째 통신에서 데이터를 주고 받았다 해도, 두번째 통신에서 이전 데이터를 유지하지 않는다.

(2) Connectionless

  • 클라이언트가 서버에 요청(request)을 했을 때, 그 요청에 맞는 응답(Response)를 보낸 후 연결을 끊는 처리 방식이다.
  • 다만, HTTP/1.1 버전에서 연결을 유지하고, 재활용하는 기능이 Default로 추가되었다(keep-alive 값으로 변경 가능하다).

하지만 실제로는 상태나 연결을 유지해 최종적으로는 데이터를 유지해야하는 경우가 많다.


예를 들어, 사이트 로그인 시, 상태를 유지하지 않게 되면 페이지를 이동할 때마다 로그인을 다시 하거나, 상품을 선택했지만 구매 페이지에서 선택한 상품의 정보가 없는 등의 상황이 발생할 수 있다.


이런 상황을 방지하기 위해(Stateful한 통신이 필요한 경우) 쿠키(Cookie)와 세션(Session)을 사용한다.



2. 쿠키(Cookie)와 세션(Session)이란?

(1) 쿠키(Cookie)

  • 사용자의 브라우저에 저장된다.
  • 통신 시 HTTP 헤더에 포함된다(텍스트 데이터 파일로 표현)
  • 이름, 값 만료기간(지정 가능), 경로 정보가 있고, 키와 값으로 구성된다.
  • 해당 사용자의 컴퓨터를 사용한다면 누구나 쿠키에 입력된 값을 쉽게 확인할 수 있다 → 보안성이 낮다
  • 사용 예: 자동 로그인 유지, 위시 리스트 저장, 팝업 보지 않기, 사용자 이전 스크롤링, 뷰 설정 값 등

쿠키 통신 절차

  1. 클라이언트 Request(쿠키값 X)
  2. 서버에서 클라이언트가 보낸 Request Header에 쿠키가 없음을 판별
  3. 서버에서 통신상태(UserID, Password, 조작상태, 방문횟수 등)를 저장한 쿠키를 Response
  4. 클라이언트의 브라우저가 받은 쿠키를 생성/보존
  5. 두번째 연결 시 HTTP header에 쿠키를 실어 서버에 request



(2) 세션(Session)

  • 서버에 저장되는 쿠키이다.
  • 클라이언트와 서버의 통신상태 등 주로 중요 데이터를 저장할 때 사용한다.
  • 브라우저를 종료할 때까지 유지된다.
  • 사용자 로컬이 아닌 서버에 직접 저장되어 세션 내 데이터를 탈취하기 어렵다 → 보안성이 비교적 높다
    • 세션 ID 보안 취약점(세션 해킹): 홈페이지 관리자의 세션 ID 탈취 → 쿠키 값을 관리자의 세션ID로 변경 → 관리자 권한으로 이용
    • 세션해킹 예방법: 세션 로그인 시 IP저장 → 페이지 이동시마다 현재 IP & 세션 IP/브라우저 정보(UserAgent)가 같은지 검사
  • 사용예: 로그인 정보 유지

세션 통신 절차

  1. 클라이언트가 서버에 접속 시 서버에서 세션 ID를 발급
  2. 서버에서는 클라이언트로 발급해준 세션 ID를 쿠키를 이용해 저장
  3. 클라이언트는 다시 페이지 접속 시 쿠키에 저장된 세션 ID를 서버에 전달
  4. 서버는 Request Header에 쿠키 정보(세션 ID)로 클라이언트 판별



3. 캐시(Cache)란?

  • 한 번 가져온 데이터를 램(RAM)과 같이 하드웨어에 임시로 저장해 비용과 시용을 절감하는 것.
  • 웹 사이트의 경우 사용자가 여러번 방문하는 웹사이트의 데이터를 받아온 다음 이를 사용자의 컴퓨터, 혹은 중간 서버에 저장해둔다.
  • 개시의 주된 목적은 스토리지 계층에 접근하지 않고, 데이터 검색 성능을 높이는 것.
  • 사용자 인증을 돕는 쿠키와는 다르게 캐시는 재사용될 가능성이 있거나 용량이 큰 리소스를 임시로 저장해 렌더링 속도를 높이는 데에 목적이 있다.
  • 캐시는 사용자가 수동으로 삭제해 주어야 한다.