"304 Not Modified"는 정확히 어떻게 작동합니까?


174
  • "304 Not Modified"응답은 어떻게 생성됩니까?

  • 브라우저는 HTTP 요청에 대한 응답이 304인지 여부를 어떻게 결정합니까?

  • 브라우저에서 설정했거나 서버에서 전송 되었습니까?

  • 서버가 보낸 경우 서버는 캐시에서 사용 가능한 데이터를 어떻게 알 수 있으며 304를 이미지로 어떻게 설정합니까?

브라우저에서 생성 된 경우 내 추측 :

function is_modified()
{
    return get_data_from_cache() === get_data_from_url();
}

function get_data_from_cache()
{
    return some_hash_or_xxx_function(cache_data);
}

function get_data_from_url()
{
     return some_hash_or_xxx_function(new_data);
}

function some_hash_or_xxx_function(data)
{
     // Do something with the data.
     // What is that algorithm?
     return result;
}

console.log(is_modified());

데이터를 가져 와서 구문 분석하고 내 데이터베이스로 푸시하기 위해 타사 API 공급자에 의존하고 있습니다. 모든 요청 동안 데이터가 변경되거나 변경되지 않을 수 있지만 헤더는 항상을 보냅니다 200. 차라리 내가를 DB에 마지막으로 고유 ID를 확인하고 등등 ... 데이터의 변화를 확인하는,도 직접 결과를 비교, 분석하고 싶지 않아요 md5(), sha1()그리고 crc32()그 결과를 해시 및 벌금을 작동하지만 난에 대해 궁금하네요 알고리즘을 결정 304합니다.

동일한 종류의 알고리즘을 사용하여 데이터의 변화를 결정하고 싶습니다.


2
304 수정되지 않은 작동 방식 을 봤지만 아무런 대답도 얻지 못했습니다.
VenomVendor

1
좀 더 일반적이어야합니다. google.com/search?q=http%20caching
SLaks

답변:


200

브라우저가 캐시에 무언가를 넣으면 서버 의 Last-Modified또는 ETag헤더 도 저장 합니다.

그런 다음 브라우저는 If-Modified-Since또는 If-None-Match헤더 와 함께 요청 을 보내 콘텐츠에 여전히 해당 날짜 또는 ETag가 있는지 서버에 304를 보내도록 지시합니다.

서버는 각 자원의 각 버전에 대해 날짜 수정 또는 ETag를 계산하는 방법이 필요합니다. 이것은 일반적으로 파일 시스템 또는 별도의 데이터베이스 열에서 비롯됩니다.


1
ETag헤더로 확인 된 키워드 ETagResponse Headers& 모두 동일하게 유지 Response Headers From Cache되며 알고리즘 뒤에 말할 수 있습니다 ETag. 요구 사항을 나타내는 질문을 업데이트했습니다.
VenomVendor

4
@VenomVendor : ETag서버가 고유 ID (일반적으로 해시 또는 버전 번호 또는 벡터 시계)를 저장할 수있는 필드입니다. ID를 계산하는 데 전혀 도움이되지 않습니다. 그것은 서버 측 코드에 달려 있습니다.
SLaks

@ SLaks : 페이지에 db 호출이 있으면 어떻게됩니까 ... db의 데이터가 변경되었을 가능성이 있습니다.이 경우 마지막으로 수정 된 호출을 확인하는 것이 의미가 없습니다. 이 상태는 어떻게 조사됩니까?
user1050619

3
@ user1050619 : ETag가 정확한지 확인하는 것은 서버에 달려 있습니다. DB의 데이터를 표시하는 경우이를 포함해야합니다.
SLaks

여전히 확실하지 않은 한 가지는 큰 것이 있으면 max-age브라우저가 요청을 해야하는지 여부입니다 . (304에서 스터브 할 수 있고 전혀 요청을 할 수 없기 때문에) "지문이있는"자산 (영원히 좋다)을 원합니다. 다른 점은 무엇입니까 max-age...
Andy Hayden

19

최종 수정 : 요청한 객체의 마지막 수정 날짜

If-Modified-Since : 마지막 수정 날짜가 변경되지 않은 경우 304 Not Modified를 반환 할 수 있습니다.

ETag : ETag는 웹 서버가 URL에서 찾은 특정 버전의 리소스에 할당 된 불투명 한 식별자입니다. 해당 URL의 리소스 표시가 변경되면 새롭고 다른 ETag가 할당됩니다.

If-None-Match : ETag가 변경되지 않은 경우 304 Not Modified를 반환 할 수 있습니다.

날짜 (마지막 수정) 또는 id (ETag)가 포함 된 브라우저 저장소 캐시, URL을 다시 요청해야 할 경우 브라우저는 헤더와 함께 요청 메시지를 보냅니다.

여기에 이미지 설명을 입력하십시오

if 문이 False이면 서버는 304를 반환하고 브라우저는 캐시를 사용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.