성장, 그리고 노력

부족하더라도 어제보다 더 잘해지자. 노력은 절대 배신하지 않는다.

네트워크

[HTTP] 캐시3 - 캐시 처리 단계

제이콥(JACOB) 2020. 1. 10. 09:26

실제 상용 프락시 캐시는 매우 복잡하지만, 일단 기본적인 HTTP GET 메시지 하나를 처리하는 절차를 알아보겠다.

 

캐시 처리 단계

1. 요청받기

캐시는 네트워크 커넥션에서 활동을 감지하고 도착한 요청 메시지를 읽는다. 고성능 캐시는 여러 개의 들어오는 커넥션들로부터 데이터를 동시에 읽어 들이고 메시지 전체가 도착하기 전에 트랜잭션 처리를 시작한다.

 

2. 파싱

캐시는 메시지를 파싱 하여 URL과 헤더들을 추출한다. 여기서 파서는 헤더 부분에 대해 대소문자나 날짜 형식의 차이와 같은 중요하지 않은 차이점이 모두 무시되도록 정규화할 책임을 갖고 있다. 

 

3. 검색

캐시는 로컬 복사본이 있는지 검사하고, 사본이 없다면 사본을 받아오며, 로컬에 저장한다.

 다시 말해 캐시는 URL을 알아내고 그에 해당하는 로컬 사본이 있는지 검사한다. 로컬 복사본은 메모리에 저장되어 있을 수도 있고, 아니면 디스크나 심지어 근처의 다른 컴퓨터에 있을 수도 있다. 전문적인 수준의 캐시는 객체를 로컬 캐시에서 가져올 수 있는지 판단하기 위해 빠른 알고리즘을 사용한다. 만약 문서를 로컬에서 가져올 수 없다면, 캐시는 상황이나 설정에 따라서 그것을 원 서버나 부모 프락시에서 가져오거나 혹은 실패를 반환한다. 

 캐시 된 객체는 서버 응답 본문과 원 서버 응답 헤더를 포함하고 있으므로, 캐시적중 동안 올바른 서버 헤더가 반환될 수 있다. 캐시된 객체는 또한 얼마나 오랫동안 캐시에 머무르고 있었는지를 알려주는 기록이나 얼마나 자주 사용되었는지 등에 대한 몇몇 메타데이터를 포함한다.

 

4. 신선도(Freshness) 검사

캐시는 캐시된 사본이 충분히 신선한지 검사하고, 신선하지 않다면 변경사항이 있는지 서버에게 확인한다.

HTTP는 캐시가 일정 기간 동안 서버 문서의 사본을 보유할 수 있도록 해준다. 이 기간 동안, 문서는 '신선'한 것으로 간주되고 캐시는 서버와의 접촉 없이 이 문서를 제공할 수 있다. 그러나 일단 캐시 된 사본을 신선도 한계를 넘을 정도로 너무 오래 갖고 있었다면 그 객체는 '신선하지 않은' 것으로 간주되며, 캐시는 그 문서를 제공하기 전에 문서에 어떤 변경이 있었는지 검사하기 위해 서버와 재검사를 해야한다. 

 HTTP의 신선도 검사 규칙은 매우 복잡하다. 이건 나중에 다시 한번 살펴보자.

 

5. 응답 생성

캐시는 새로운 헤더와 캐시된 본문으로 응답 메시지를 돌려준다. 

 우리는 캐시된 응답을 원 서버에서 온 것처럼 보이게 하고 싶기 때문에, 캐시는 캐시된 서버 응답 헤더를 토대로 응답 헤더를 생성한다. 이 기저 헤더들은 캐시에 의해 수정되고 늘어난다. 

 캐시는 클라이언트에 맞게 이 헤더를 조정해야 하는 책임이 있다. 만약 클라이언트가 HTTP/1.1 응답을 기대하는 상황이라면, 원 서버가 HTTP/1.0 응답 혹은 HTTP/0.9 응답을 반환했다면, 캐시는 반드시 적절하게 번역해야 한다. 캐시는 또한 신선도 정보를 삽입하며(Cache-Control, Age, Expires 헤더), 또한 요청이 프락시 캐시를 거쳐갔음을 알려주기 위해 Via 헤더를 포함시킨다. 

 다만, 캐시가 Date 헤더를 조정해서는 안된다. Date 헤더는 그 객체가 원 서버에서 최초로 생겨난 일시를 표현하는 것이다. 

 

6. 전송

캐시는 일단 응답 헤더가 준비되면, 네트워크를 통해 응답을 클라이언트에게 돌려준다. 모든 프락시 서버들과 마찬가지로, 프락시 캐시는 클라이언트와의 커넥션을 유지할 필요가 있다.                                                                                                                                           

7. 로깅 

선택적으로, 캐시는 로그파일에 트랜잭션에 대해 서술한 로그를 남긴다(캐시 적중, 부적중 통계 갱신 및 요청 종류, URL, 무슨 일이 일어났는지 등). 가장 많이 사용되는 캐시 로그 포맷은 스퀴드 로그 포맷(Squid log format)과 넷스케이프 확장 공용 로그 포맷(Netsape extended common log format) 등이 있으며, 대부분의 제품들은 커스텀 로그를 허용한다.

 

 

캐시 처리 플로 차트


기본적인 플로우만 알고, 신선도(Freshness) 유지 헤더나 알고리즘은 필요할 때 찾아보자.

반응형

'네트워크' 카테고리의 다른 글

[HTTP] 웹 로봇 2  (0) 2020.01.26
[HTTP] 웹 로봇 1  (0) 2020.01.12
[HTTP] 캐시2 - 토폴로지  (0) 2020.01.04
[HTTP] 캐시1 - 기본 개념  (0) 2020.01.04
[HTTP] Proxy (프락시)  (0) 2020.01.01