HTTP 304 Not Modified
캐시 유효성 검사: 마지막 방문 이후 변경된 내용이 없으므로 이미 가지고 있는 사본을 계속 사용하면 됩니다.
HTTP 304의 의미
HTTP 304 Not Modified는 조건부 요청에 대한 응답입니다. 클라이언트는 “이 날짜의 사본을 가지고 있습니다”(If-Modified-Since) 또는 “이 지문(fingerprint)을 가진 사본을 가지고 있습니다”(If-None-Match)라고 알리고, 서버는 본문 없이 304로 응답하여 그 사본이 여전히 최신임을 확인해 줍니다.
이 메커니즘, 즉 캐시 재검증(cache revalidation)은 반복적인 페이지 로드를 빠르게 만들어 줍니다. 브라우저는 변경된 부분만 다시 다운로드하고, 나머지는 작은 왕복 요청 하나의 비용만 발생합니다.
304 응답이 발생하는 일반적인 원인
- 브라우저가 캐시된 페이지, 스크립트 또는 이미지를 재검증했고 변경 사항이 없었던 경우입니다.
- CDN 엣지 서버가 원본 서버에 대해 저장된 객체를 재검증한 경우입니다.
- API 클라이언트가 ETag를 사용해 리소스를 저비용으로 폴링(poll)한 경우입니다.
개발자를 위한 모범 사례
- 클라이언트가 재검증할 수 있도록 안정적인 ETag 또는 Last-Modified 헤더를 제공하세요.
- 304 응답에는 본문을 포함하지 마세요. 클라이언트가 이미 해당 내용을 명시적으로 가지고 있습니다.
- 응답마다 값이 바뀌는 ETag(예: 노드별 해시를 사용하는 로드 밸런싱 서버)에 주의하세요. 이런 ETag는 재검증 기능을 은연중에 무력화시킵니다.
응답 예시
GET /styles.css HTTP/1.1 If-None-Match: "abc123" HTTP/1.1 304 Not Modified ETag: "abc123" Cache-Control: max-age=3600
SEO 영향
304 응답은 SEO 성능에도 유리합니다. Googlebot은 조건부 요청을 적극적으로 사용하며, 올바른 재검증이 이루어지면 동일한 크롤링 예산으로 더 많은 사이트를 크롤링할 수 있습니다. 검증자가 제대로 동작하지 않으면 크롤링할 때마다 전체를 다시 다운로드하게 됩니다.
자주 묻는 질문
304 응답은 오류인가요?
아니요. 캐시된 사본이 여전히 유효하다는 것을 나타내는 성공 신호입니다. 브라우저가 이를 투명하게 처리합니다.
무엇이 304 응답을 유발하나요?
현재 리소스와 값이 일치하는 If-None-Match 또는 If-Modified-Since 헤더를 포함한 요청입니다.
DevTools에서 200 대신 304가 표시되는 이유는 무엇인가요?
브라우저가 캐시된 사본을 가지고 있었고 이를 재검증한 경우입니다. 이 상태 코드는 서버가 파일을 다시 보내는 대신 캐시를 확인해 주었음을 나타냅니다.