지적과 댓글은 언제나 환영합니다!
시작에 앞서
이야기를 하기 전, 탄생 배경에 대해 알고가면 더욱 좋다.
HTTP 프로토콜은 비연결성(Connectionless)
, 무상태성(Stateless)
을 가지기 때문에
클라이언트가 누구인지 저장하지 않는다.
때문에 매 요청마다 사용자, 권한 등을 확인해야 한다.
이러한 특성을 보완하기 위해서 쿠키, 캐시와 같은 개념이 등장헀다.
쿠키(Cookie)
쿠키는 사용자의 브라우저에 저장
되고, HTTP 헤더에 포함
되는 텍스트 데이터 파일
이다.
쿠키는 아래와 같이 1개의 데이터쌍
과 4개의 속성
으로 구성되어 있다.
Set-Cookie: name=value; expires=[Date]; domain=[Domain]; path=[Path]; [Secure]
expires
: 쿠키의 유효기간, 유효기간이 지나면 파일이 남더라도 브라우저에서 읽을 수 없다.domain
: 쿠키를 전송할 도메인, 하나의 도메인 당 20개의 값만 가질 수 있다.path
= 쿠키를 전송할 경로, 경로를/
로 설정하면 모든페이지에서,/example
로 설정하면 그 페이지 이하의 페이지에서 읽을 수 있다.secure
: 쿠키를 전송할 보안 전송 방법, 그러나 쿠키는 위험하지 않은 데이터를 전달하기 때문에 잘 사용하지 않는다.
그렇다면 쿠키는 언제 생성될까?
답은 클라이언트가 페이지에 접속할 때, 서버에서 HTTP 헤더에 쿠키를 포함시켜 응답한다.
클라이언트 측에서는 만료기간까지 보관하고 있다가, 같은 요청이 발생하면 쿠키를 함께 서버에 보낸다. 만약, 변경이 필요하다면 쿠키를 업데이트하여 응답한다.
쿠키의 예시
장바구니
팝업 다시보지 않기
ID/PW 기억하기
세션(Session)
왜 쿠키 다음에 세션을 소개할까?
그 이유는 바로 세션이 서버에 저장되는 쿠키
이기 때문이다.
세션은 클라이언트가 브라우저를 종료할 때까지 유지
된다.
그렇기 때문에 클라이언트를 구별하기 위한 고유 세션 ID를 부여
한다.
또한, 클라이언트가 일정시간 응답이 없다면 유지되지 않도록 할 수 있다.
서버에 직접 저장
되므로 보안성이 높다.
하지만 서버의 메모리에 영향을 주기 때문에 성능 저하의 요인
이 될 수 있다.
그렇다면 세션은 언제 생성될까?
세션은 클라이언트가 서버에 접속할 때, 서버는 고유 세션 ID를 발급하고 저장한다.
클라이언트는 서버에 요청할 때, 이 세션 ID를 같이 전달한다.
전달받은 세션은 별다른 작업을 요구하지 않지만, 클라이언트의 정보를 담고 있다.
세션의 예시
로그아웃 전까지 로그인 유지
캐시(Cache)
캐시는 쿠키, 세션과는 역할이 조금 다르다.
캐시는 이미지, 오디오, 소스코드, CSS 등 접근 비용이 비싼 데이터를 저장
해두었다가, 동일한 요청이 있을 때 재요청하지 않고 데이터를 제공
할 수 있게 하는 임시 저장소
이다.
로고나 버튼이미지, 검색창 같이 다시 사용될 가능성이 높은 요소
를 캐시로 저장하면 서버의 부하(Load), 대역폭의 부담을 줄이고, 최종적으로 사용자에게 전달하는 속도를 높일 수 있다.
다시 사용될 가능성이 높은 요소를 선정했기 때문에 항상 캐시가 사용되지 않는다. 따라서 리소스 요청이 이전에 왔던 것과 같은 게 있다면, 캐시 적중(Cache Hit)
, 웹서버로 처음 요청된 리소스라면, 캐시 부적중(Cache Miss)
라고 한다.
한편, 한번 캐시에 저장되면 서버에서 변경해도, 사용자는 변경되지 않은 것처럼 보일 수 있다.
로고나 이미지가 바뀐것을 어떻게 알 수 있을까?
그렇다면 캐시는 언제 생성될까?
캐시는 아래 7단계를 거쳐 생성된다.
요청받기
> 파싱
> 검색
> 신선도검사
> 응답생성
> 전송
> 로깅
요청받기
: 클라이언트에서 네트워크 연결이 시작되면 요청 데이터를 읽어들인다.파싱
: 요청 메시지를 캐싱 소프트웨어를 이용해 헤더 부분을 자료구조에 담는다(ex. dictionary)검색
: 요청 URL에 해당하는 로컬 사본을 검색한다. 사본의 위치는 메모리, 디스크, 로컬 컴퓨터 등 다양한 위치가 될 수 있다.신선도 검사
: 캐시가 적중(Hit)한 경우, 신선도 검사 알고리즘을 통해 캐시가 유효한지 검사한다.
$충분히_신선한가 = $나이 < $신선도_수명
- $나이 : 서버가 문서를 보낸 후(혹은 서버가 마지막으로 재검사한 후) 그 문서가 나이를 먹은 시간의 총합이다.
- $신선도_수명 : 서버와 클라이언트의 제약조건에 의존한다. 일반적으로 서버는 얼마나 자주 발행되었는지에 대한 정보를, 클라이언트는 최신 콘텐츠에 대한 요구를 제약조건으로 설정한다.
응답 생성
: 캐시가 신선하다면, 캐시의 오래된 헤더에신선도 정보(Cache-Control, Age, Expires 헤더)를 삽입
한다. Date 헤더는 최초 생성 정보이기 때문에 수정하면 안된다.전송
:로깅
: 캐시 전송 후 캐시 Hit, Miss에 대한 통계를 작성하고, 로그 파일에 요청 종류, URL, 작업 내용을 기록한다.
마무리
자, 이제 쿠키, 세션, 캐시에 대해 설명할 수 있는가?
쿠키와 세션, 캐시 모두 적절히 사용하면 약이 되지만, 과하게 의존한다면 독이 될 수 있다.
출처
'Do you know?' 카테고리의 다른 글
아시나요? 의존성 주입(DI, Dependency Injection) (0) | 2023.01.18 |
---|---|
아시나요? TDD, Clean Code (0) | 2023.01.18 |
아시나요? REST, REST API, RESTful API (0) | 2023.01.18 |
아시나요? 프로세스(Process)와 쓰레드(Thread) (0) | 2023.01.18 |
아시나요? IoC & DIP (0) | 2023.01.18 |