if-modified-since 대 if-none-match


89

if-modified-since와 if-none-match의 차이점은 무엇입니까? 파일에는 if-none-match가 사용되는 반면 페이지에는 if-modified-since가 사용된다는 느낌이 있습니까?

답변:


112

차이점에 대해서 Last-Modified/If-Modified-SinceETag/If-None-Match:

둘 다 서로 바꿔서 사용할 수 있습니다. 그러나 리소스의 유형과 서버에서 생성되는 방법에 따라 하나 또는 다른 질문 ( "... 이후 수정 되었습니까?"/ "이 ETag와 여전히 일치합니까?")이 더 쉽게 대답 할 수 있습니다. .

예 :

  • 파일을 제공하는 경우 파일을 날짜 mtime로 사용하는 Last-Modified것이 가장 간단한 해결책입니다.
  • 여러 SQL 쿼리로 만든 동적 웹 페이지를 제공하는 경우 이러한 쿼리에서 반환 된 데이터가 변경되었는지 여부를 확인하는 것은 비현실적 일 수 있습니다 (모든 쿼리에 일종의 "마지막 수정"열이있는 경우 제외). 이 경우, 예를 들어 페이지 콘텐츠의 md5 해시를 사용하는 ETag것이 훨씬 쉬울 것입니다.
    OTOH, 이것은 조건부 GET의 경우에도 서버에서 전체 페이지를 생성해야 함을 의미합니다. ETag에 정확히 무엇이 들어가야하는지 (기본 키, 개정 번호 등) 파악하면 여기에서 많은 시간을 절약 할 수 있습니다.

주제에 대한 자세한 내용은 다음 링크를 참조하십시오.


브라우저에 ETag를 보냈지 만 If-None-Match로 동일한 페이지를 요청하지 않습니다. 무엇이 문제일까요?
Pacerier 2012-07-12

2
@pacerier : 브라우저는 Etag를 사용할 필요가 없습니다. 따라서 오래된 브라우저 일 수 있으며 단순히 무시할 수 있습니다. 다른 가능성은 호출마다 변경되는 url 매개 변수로 엔티티에 액세스하는 것입니다. 엔티티 이름이 변경되면 다른 요청에 etag가 사용되지 않습니다.
라파엘 밥티스타

@RafaelBaptista 의견의 후반부에 대해 자세히 설명하기 위해 다음과 같은 상황이 있다고 가정하십시오. 파일 서버가 있고 서버가 ETag를 사용한 버전 관리를 지원하며 이전 버전과의 호환성을 위해 클라이언트가 쿼리 매개 변수 my_current_version = (version)을 사용하도록했습니다. ). my_current_version에 대한 다양한 값과 ETag를 사용하여 HTTP 요청을 보내는 경우 새 버전을 제공할지 또는 304를 다시 보낼지 결정할 때 모범 사례로서 어떤 기준이 우선 순위가됩니까? 감사!
laughing_man

1
서버가 Etag를 사용하는 방법은 서버에 달려 있습니다. 재 작성 규칙을 통해 원하는 경우 etag로 매개 변수를 무시하도록 대부분의 파일 서버를 구성 할 수 있습니다. 클라이언트 (브라우저)에 대한 제어 권한이 적습니다. 대부분은 다른 요청에서 한 매개 변수 세트에 대해받은 etag 헤더를 보내지 않습니다. image? v = 1에 대한 클라이언트 요청은 image? v = 2에 대해 동일한 etag를 전송하지 않습니다. 자체 서버를 작성하는 경우 이미지 콘텐츠의 해시로 etag를 구현합니다. 리소스를 요청하고 내가 보낼 이미지의 해시와 일치하는 etag와 함께 제공되는 모든 URL은 304를 반환합니다.
Rafael Baptista

22

If-Modified-Since와 비교되는 Last-Modified반면 If-None-Match에 비교됩니다 ETag. Modified-Since및 둘 다 ETag리소스의 특정 변형을 식별하는 데 사용할 수 있습니다.

그러나 If-Modified-Sinceto를 비교 Last-Modified하면 캐시 된 변형이 이전 또는 최신 인지 여부에 대한 정보 를 제공 하는 반면 If-None-Matchto 비교는 ETag둘 다 동일한 지 여부에 대한 정보를 제공합니다 . 또한 대부분의ETag 생성기는 시스템 특정 inode 의 정보를 포함 하므로 파일을 다른 드라이브로 이동하면 변경 될 수도 있습니다 ETag.


흥미롭지 만 왜 "마지막 수정"검사에 대해 "동일"검사를 사용합니까? 이점은 무엇입니까? 제공 할 파일이있는 경우 어떤 파일이 더 나은 옵션입니까?
Tower

7
컴퓨터에서는 시간이 허약합니다. 윤초, 일광 절약 시간 간 전환 및 부정확 한 시계는 모두 "마지막 수정"검사에서 잘못된 결과를 반환하는 원인이 될 수 있습니다. 콘텐츠 자체 (또는 콘텐츠의 MD5 해시)를 비교하면 이러한 문제를 방지 할 수 있습니다.
devdanke

@devdanke를 완전히 이해 했음에도 불구하고 타임 스탬프를 확인하는 것이 md5sum을 확인하는 것보다 훨씬 빠르다고 말할 수 있습니다. 이러한 헤더의 목적은 빠르게 만드는 것입니다. 때로는 I / O로 서버를로드하는 것보다 새로운 버전의 엔티티를 클라이언트에 전송하지 않는 것이 선호됩니다. 어쨌든 사용자는 언제든지 ctrl + shift + R (또는 ctrl + F5 또는 기타)을 누를 수 있습니다.
Grief

13

Last-Modified / If-Modified-Since에서 사용되는 타임 스탬프 값은 정밀도가 제한되어 있습니다 (1 초). 예를 들어 주어진 시간에 두 개 이상의 메시지를 게시 할 수있는 웹 채팅 애플리케이션과 같이 빠르게 변화하는 콘텐츠에는 충분하지 않습니다. . ETag / If-None-Match는 이러한 문제를 해결하는 데 도움이 될 수 있습니다.


9

Google의 모범 사례에 명시된 바와 같이 :

캐시 가능한 모든 리소스에 대해 Expires 또는 Cache-Control max-age 중 하나와 Last-Modified 또는 ETag 중 하나를 지정하는 것이 중요합니다. Expires 및 Cache-Control : max-age를 모두 지정하거나 Last-Modified 및 ETag를 모두 지정하는 것은 중복됩니다.

https://developers.google.com/speed/docs/best-practices/caching


해당 URL에는 더 이상 이와 유사한 텍스트가 없습니다. Last-Modifiedwith ETag(또는 useragent 측에서는 If-Modified-Sincewith If-None-Match) 사용에 대한 제한 이 언급 되지 않았습니다 . 마찬가지로 W3 사양은 당신을 제한하지 않습니다. If-Modified-Since와 함께 사용하지 말라고 If-Match했지만 날짜가 업데이트되었지만 ETag에 정의 된 것과 동일한 내용이있는 문서 세트가 매우 작아야하기 때문이라고 가정합니다.
mpag


3

서버에서 약하다고 명시하지 않는 한 ETag는 강력한 유효성 검사기로 간주되므로 조건부 범위 요청을 포화시키는 데 사용할 수 있습니다. 그러나 대부분의 자동 생성 ETag는 종종 inode 정보 및 / 또는 고유 한 영구 카운터를 사용하기 때문에 서버 팜 상황에서 어려움을 나타냅니다. 실제로 파일의 쓰기 시간이 합리적으로 좋은 유효성 검사기를 만들기 때문에 Last Modified 헤더가 상당히 정적 인 콘텐츠 (예 : 보호 된 정적 콘텐츠 제공)에 충분하다는 것을 발견했습니다.

ETag는 가장 유연합니다. 준수하는 클라이언트는 조건부 요청으로 ETag를 전송해야하지만 가능한 경우 둘 다 전송해야합니다 (SHOULD).


0

If-Modified-Since 헤더는 브라우저가 요청 된 리소스를 마지막으로 수신 한 시간을 지정하는 데 사용됩니다. If-None-Match 헤더는 요청 된 자원이 마지막으로 수신되었을 때 서버가 발행 한 엔티티 태그를 지정하는 데 사용됩니다.

설명 된 두 가지 방법에서 이러한 헤더는 브라우저 내에서 콘텐츠 캐싱을 지원하는 데 사용되며, 서버가 리소스의 전체 콘텐츠로 응답하는 대신 리소스의 캐시 된 복사본을 사용하도록 브라우저에 지시 할 수 있습니다. 필요하지 않습니다.

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