2024년 12월 9일 월요일
Google에서 캐시를 사용할 수 있도록 허용해 주세요.
지난 몇 년간 인터넷이 성장함에 따라 Google에서 실행한 크롤링 양도 증가했습니다. Google의 크롤링 인프라는 휴리스틱 캐싱 메커니즘을 지원합니다. 사실항상 지원해 왔지요. 한편, 로컬 캐시에서 반환할 수 있는 요청 수가 줄어들었습니다. 10년 전에는 총 가져오기 중 약 0.026% 정도를 캐싱할 수 있었지만(그닥 인상적인 수치는 아닙니다) 지금은 0.017%까지 감소했습니다.
캐싱은 왜 중요할까요?
캐싱은 인터넷이라는 거대한 퍼즐에서 중요한 부분이 되는 한 조각입니다. 캐싱을 사용하면 재방문 시 페이지가 매우 빠르게 로드되고, 컴퓨팅 리소스와 자연 리소스가 절약됩니다. 그리고 클라이언트와 서버 모두에서 비용이 많이 드는 대역폭도 크게 절약됩니다.
특히 개별 URL 아래에 거의 변경되지 않는 콘텐츠가 있는 대규모 사이트라면, 로컬 캐싱을 허용하면 사이트가 더 효율적으로 크롤링될 수 있습니다. Google의 크롤링 인프라는 HTTP 캐싱 표준에 정의된 휴리스틱 HTTP 캐싱을 지원합니다. 특히 ETag
응답 및 If-None-Match
요청 헤더, Last-Modified
응답 및 If-Modified-Since
요청 헤더를 통해 이러한 캐싱을 지원합니다.
ETag
를 사용하면 오류와 실수가 발생할 가능성이 적으므로 이 방법을 사용하는 것이 적극 권장됩니다. Last-Modified
값과 달리 값이 구조화되지 않습니다. 가능하다면 둘 다 설정해 보세요. 인터넷이 여러분께 감사할 겁니다. 아마도요.
어떤 사항이 있을 때 클라이언트가 캐시를 새로고침해야 하는지는 개발자의 결정에 달렸습니다. 콘텐츠가 크게 변경되었다면 캐시를 새로고침하는 것이 좋습니다. 그러나 페이지 하단의 저작권 날짜만 업데이트했다면 새로고침이 큰 의미가 없습니다.
ETag
및 If-None-Match
Google의 크롤러는 HTTP 캐싱 표준에 정의된 대로 ETag
기반 조건부 요청을 지원합니다.
즉, Google 크롤러에 캐싱 환경설정을 알리려면 Etag
값을 액세스된 URL에서 호스팅되는 콘텐츠 표현에서만 고유하게 사용되는 임의의 ASCII 문자열(일반적으로 콘텐츠 또는 버전 번호의 해시이지만 π의 일부일 수도 있음)로 설정하세요.
예를 들어 동일한 URL(예: 모바일 버전 및 데스크톱 버전) 아래에 동일한 콘텐츠의 여러 가지 버전을 호스팅한다면, 각 버전별로 고유한 ETag
값이 있을 수 있습니다.
캐싱을 지원하는 Google 크롤러는 해당 URL의 이전 크롤링에 대해 반환된 ETag
값을 If-None-Match header
에 전송합니다. 크롤러에서 전송한 ETag
값이 서버에서 생성한 현재 값과 일치하면 서버는 HTTP 본문이 없는 HTTP 304
(수정되지 않음) 상태 코드를 반환해야 합니다. 이 마지막 부분(HTTP 본문 없음)은 다음과 같은 몇 가지 이유로 중요한 부분입니다.
- 서버가 실제로 콘텐츠를 생성하는 데 컴퓨팅 리소스를 소비하지 않아도 되므로 비용을 절약할 수 있습니다.
- 서버가 HTTP 본문을 전송할 필요가 없으므로 비용을 절약할 수 있습니다.
사용자의 브라우저나 Googlebot과 같은 클라이언트 측에서는 해당 URL 아래의 콘텐츠는 클라이언트의 내부 캐시에서 검색됩니다. 이 작업은 데이터 전송 절차가 없어서 매우 빠르게 이루어지므로 사용자가 만족할 뿐만 아니라 일부 리소스를 절약할 수도 있습니다.
Last-Modified
및 If-Modified-Since
ETag
와 마찬가지로 Google 크롤러는 HTTP 캐싱 표준에 정의된 대로 Last-Modified based
조건부 요청도 지원합니다. 이는 의미론적 관점에서 ETag
와 동일하게 작동합니다. 식별자는 리소스를 캐시할 수 있는지 여부를 결정하는 데 사용되며 클라이언트 측에서 ETag
와 동일한 이점을 제공합니다.
그러나 Last-Modified
를 캐싱 디렉티브로 사용하는 경우 몇 가지 권장사항이 있습니다.
-
Last-Modified
헤더의 날짜는 HTTP 표준에 따라 형식이 지정되어야 합니다. 파싱 문제를 방지하려면 '평일, DD Mon YYYY HH:MM:SS 시간대'와 같은 날짜 형식을 사용하는 것이 좋습니다. 예를 들면 'Fri, 4 Sep 1998 19:15:56 GMT'처럼 설정할 수 있습니다. -
필수는 아니지만 크롤러가 특정 URL을 다시 크롤링할 시기를 결정하는 데 도움이 되도록
Cache-Control
헤더의max-age
필드를 설정하는 것도 고려해 보세요.max-age
필드의 값을 콘텐츠가 변경되지 않을 것으로 예상되는 초 수로 설정합니다. 예를 들면Cache-Control: max-age=94043
처럼 설정할 수 있습니다.
예
저와 비슷한 분이시라면 휴리스틱 캐싱이 작동하는 방식을 이해하기가 쉽지는 않으실 겁니다. 하지만 요청 및 응답 체인의 예시를 보면 도움이 됩니다. 다음은 작동 방식을 시각화하기 위한 두 개의 체인(ETag
/If-None-Match
용 체인 1개, Last-Modified
/If-Modified-Since
용 체인 1개)입니다.
ETag /If-None-Match |
Last-Modified /If-Modified-Since |
|
---|---|---|
크롤링에 대한 서버의 응답: 크롤러가 사전 조건 헤더 필드 ETag 및 Last-Modified 를 저장할 수 있는 응답입니다.
|
HTTP/1.1 200 OK Content-Type: text/plain Date: Fri, 4 Sep 1998 19:15:50 GMT ETag: "34aa387-d-1568eb00" ... |
HTTP/1.1 200 OK Content-Type: text/plain Date: Fri, 4 Sep 1998 19:15:50 GMT Last-Modified: Fri, 4 Sep 1998 19:15:56 GMT Cache-Control: max-age=94043 ... |
후속 크롤러 조건부 요청: 조건부 요청은 이전 요청에서 저장된 전제 조건 헤더 값을 기반으로 합니다. 값은 If-None-Match 및 If-Modified-Since 요청 헤더에서 유효성 검사를 위해 서버로 다시 전송됩니다.
|
GET /hello.world HTTP/1.1 Host: www.example.com Accept-Language: en, hu User-Agent: Googlebot/2.1 (+http://www.google.com/bot.html) If-None-Match: "34aa387-d-1568eb00" ... |
GET /hello.world HTTP/1.1 Host: www.example.com Accept-Language: en, hu User-Agent: Googlebot/2.1 (+http://www.google.com/bot.html) If-Modified-Since: Fri, 4 Sep 1998 19:15:56 GMT ... |
조건부 요청에 대한 서버 응답: 크롤러에서 전송한 사전 조건 헤더 값은 서버 측에서 유효성 검사가 진행되므로 서버는 크롤러에 304 HTTP 상태 코드(HTTP 본문 없음)를 반환합니다. 이는 전제 조건이 검증되지 않을 때까지(서버 측에서 ETag 또는 Last-Modified 날짜가 변경될 때까지) 후속 요청마다 발생합니다.
|
HTTP/1.1 304 Not Modified Date: Fri, 4 Sep 1998 19:15:50 GMT Expires: Fri, 4 Sep 1998 19:15:52 GMT Vary: Accept-Encoding If-None-Match: "34aa387-d-1568eb00" ... |
HTTP/1.1 304 Not Modified Date: Fri, 4 Sep 1998 19:15:50 GMT Expires: Fri, 4 Sep 1998 19:15:51 GMT Vary: Accept-Encoding If-Modified-Since: Fri, 4 Sep 1998 19:15:56 GMT ... |
사용자를 만족시키면서 호스팅 비용도 살짝 절약하고 싶다면 호스팅/CMS 제공업체나 개발자에게 사이트에 HTTP 캐싱을 사용 설정하는 방법을 문의하세요. 혹시나 다른 큰 효과가 없더라도, 최소한 사용자들은 사이트에 좀 더 만족하게 될 것이라는 점은 확실합니다.
캐싱에 관해 이야기하고 싶다면 가장 가까운 Google 검색 센터 도움말 커뮤니티를 방문하세요. 캐싱 방식에 관한 의견이 있으면 이 블로그 게시물과 함께 게시된 캐싱에 관한 문서에 의견을 남겨 주시기 바랍니다.
크롤링에 대해 자세히 알아보시겠어요? 12월 크롤링 시리즈 전체를 확인해보세요.
Google Cloud 문서
Google Cloud 제품 및 서비스 관련 종합적인 문서, 가이드, 리소스
Google Ads API
대규모 Google Ads 계정 및 캠페인을 관리하는 도구를 만들 수 있습니다.
Genkit
Code-first framework for orchestrating, deploying, and monitoring generative AI workflows.
Blockly 접근성 개요
개발자, 학생, 조직을 위해 접근 가능한 블록 기반 프로그래밍을 지원하기 위한 Blockly의 노력
Android Developers
Discover the latest app development tools, platform updates, training, and documentation for developers across every Android device.
Privacy Sandbox
쿠키, 광고, ID, 맞춤설정, 사기 방지를 위한 개인 정보 보호 중심의 API 및 업데이트
Chrome Extensions
Chrome 확장 프로그램 개발 방법을 알아보세요.
Firebase Remote Config
앱 업데이트를 게시하지 않고도 일일 활성 사용자 수 제한 없이 무료로 앱의 동작과 디자인을 변경할 수 있습니다.
Google Maps Platform
수백만 개의 웹사이트와 앱이 Google Maps Platform을 사용하여 사용자에게 효과적인 서비스 환경을 제공하고 있습니다.
Gemini Code Assist 개요
Gemini Code Assist Standard 및 Enterprise에서 사용할 수 있는 기능을 간략하게 설명합니다.
Vertex AI 문서
개발자가 비즈니스 요구에 맞게 고품질 모델을 학습시킬 수 있는 머신러닝 도구 제품군인 Vertex AI 문서입니다.
로깅으로 Gemini Code Assist 측정항목 생성
Gemini Code Assist 사용량 측정항목의 일일 사용량 그래프를 만드는 방법을 설명합니다.
Firebase Test Lab
Firebase Test Lab은 다양한 기기와 구성에서 앱을 테스트할 수 있는 클라우드 기반 앱 테스트 인프라이므로 실제 사용자에게 어떻게 제공되는지 더 잘 이해할 수 있습니다.
Cloud Storage for Firebase
Firebase용 Cloud Storage는 Google의 규모를 활용한 강력하고 단순하며 경제적인 객체 스토리지 서비스입니다.
Firebase Performance Monitoring
Firebase Performance Monitoring은 개발자가 Apple, Android, 웹 앱의 성능 특성을 파악하는 서비스입니다.
Firebase In-App Messaging
Firebase In-App Messaging helps you engage your app's active users by sending them targeted, contextual messages that encourage them to use key app features.
Firebase Hosting
Firebase 호스팅은 정적 웹 앱과 단일 페이지 웹 앱을 위한 빠르고 안전한 호스팅을 제공합니다.
Firestore
Firestore는 Firebase 및 Google Cloud의 모바일, 웹, 서버 개발에 사용되는 유연하고 확장 가능한 데이터베이스입니다.
Cloud Functions for Firebase
Firebase용 Cloud Functions는 Firebase 기능과 HTTPS 요청에 의해 트리거되는 이벤트에 응답하여 백엔드 코드를 자동으로 실행할 수 있는 서버리스 프레임워크입니다.
Firebase App Distribution
Firebase 앱 배포를 사용하면 신뢰할 수 있는 테스터에 앱을 쉽게 배포할 수 있습니다. 테스터 기기에 앱을 빠르게 제공하여 앱에 대한 의견을 조기에 자주 받을 수 있습니다. 또한 앱에서 Crashlytics를 사용하면 모든 빌드의 안정성 측정항목을 자동으로 얻게 되므로 출시 시기를 파악할 수 있습니다.
Firebase Realtime Database
Firebase의 유연한 NoSQL 실시간 데이터베이스입니다.
Gemini in Firebase
"Firebase의 Gemini는 Firebase 제품 및 기능에 대한 질문의 답을 얻고 개발을 위한 코드를 생성 및 설명하며 문제 해결 프로세스를 단축하는 데 도움이 되는 AI 지원 도구입니다."
Firebase Cloud Messaging
Firebase 클라우드 메시징(FCM)은 무료로 메시지를 안정적으로 전송할 수 있는 크로스 플랫폼 메시징 솔루션입니다.
Firebase App Check
앱 체크는 수신 트래픽이 내 앱에서 유입되고 있음을 증명하고 유효한 사용자 인증 정보가 없는 트래픽을 차단하여 앱의 악용을 방지합니다.
Firebase App Hosting
Firebase App Hosting is a framework that provides serverless hosting for modern, full-stack and AI web apps.
Firebase Authentication
Firebase 인증을 사용하면 코드 몇 줄만으로 손쉬운 사용자 인증, 로그인, 온보딩을 위한 엔드 투 엔드 ID 솔루션을 앱에 추가할 수 있습니다.
Firebase Crashlytics
Firebase Crashlytics는 가벼운 실시간 비정상 종료 보고 도구로 앱 품질을 저하하는 안정성 문제를 추적하고 우선순위를 지정하고 문제를 해결하는 데 도움이 됩니다.
Firebase Extensions
생산성 향상을 위해 설계된 Firebase Extensions는 코드를 직접 연구, 작성 또는 디버깅할 필요 없이 앱에 확장된 기능을 제공합니다.
Android Studio for Platform
Android 스튜디오는 Android 앱에 최적화된 통합 개발 환경(IDE)을 앱 빌더에게 제공합니다. 지금 Android 스튜디오를 다운로드하세요.
Vertex AI in Firebase
Build AI-powered mobile and web apps and features with the Gemini API using Vertex AI in Firebase