의미
클라이언트가 이미 가진 캐시 사본이 여전히 유효하므로 서버가 본문을 보내지 않습니다. If-None-Match나 If-Modified-Since가 있는 조건부 요청에 대한 응답입니다.
흔한 원인
- If-None-Match의 ETag가 현재 버전과 일치함
- If-Modified-Since 이후 리소스가 바뀌지 않음
- 브라우저가 캐시된 자산을 재검증함
해결 방법
클라이언트 또는 방문자라면
캐시된 본문을 사용하세요. 내용이 오래되어 보이면 검증자가 잘못되었을 수 있으니 강제 새로 고침하거나 ETag 생성을 확인하세요.
사이트나 API 운영자라면
안정적인 ETag(로드 밸런서 뒤 모든 서버에서 동일)를 생성하고, 200에서 보낼 캐시 헤더를 똑같이 보내세요.
응답 예시
HTTP/1.1
HTTP/1.1 304 Not Modified
Date: Tue, 07 Oct 2025 09:30:00 GMT
Server: nginx
ETag: "33a64df5"
Cache-Control: max-age=3600 명세
자주 묻는 질문
› 304는 오류인가요?
아닙니다. 클라이언트 캐시가 최신임을 알려 대역폭을 절약합니다.
› 배포 후 사용자가 옛 파일을 보는 이유는?
캐시 헤더가 오래된 사본을 허용하기 때문입니다. 자산에는 핑거프린트가 붙은 파일 이름을, HTML에는 짧은 max-age와 재검증을 쓰세요.