ETag와 헤더 만료


359

나는 둘러 보았지만 ETag Expires Header 또는 둘 중 하나를 사용 해야하는지 알아낼 수 없었습니다 .

내가하려고하는 것은 내 플래시 파일 (및 다른 이미지 및 해당 파일이 변경되었을 때 업데이트되지 않는 것)을 확인하는 것입니다.

파일 이름을 변경하거나 URL 끝에 이상한 문자를 넣어 캐시되지 않도록하는 것과 같은 특별한 작업을하고 싶지 않습니다.

또한 이것을 지원하기 위해 PHP 스크립트에서 프로그래밍 방식으로해야 할 일이 있습니까? 아니면 모두 Apache입니까?


답변:


677

약간 다릅니다. ETag에는 클라이언트가 나중에 해당 파일을 다시 요청할지 여부를 결정하는 데 사용할 수있는 정보가 없습니다. ETag가 전부라면 항상 요청을해야합니다. 그러나 서버가 클라이언트 요청에서 ETag를 읽을 때 서버는 파일을 전송할지 (HTTP 200) 또는 클라이언트에게 로컬 사본 만 사용하도록 지시 할 수 있습니다 (HTTP 304). ETag는 기본적으로 파일의 내용이 변경 될 때 의미 적으로 변경되는 파일의 체크섬입니다.

Expires 헤더는 클라이언트 (및 프록시 / 캐시)가 서버에 요청해야하는지 여부를 결정하는 데 사용됩니다. 만료 날짜가 가까울수록 클라이언트 (또는 프록시)가 서버에서 해당 파일에 대한 HTTP 요청을 할 가능성이 높습니다.

실제로 당신이하고 싶은 것은 BOTH 헤더를 사용하는 것입니다-내용이 얼마나 자주 변경되는지에 따라 Expires 헤더를 합리적인 값으로 설정하십시오. 그런 다음 클라이언트가 서버에 요청을 보낼 때 파일을 다시 보낼지 여부를보다 쉽게 ​​결정할 수 있도록 ETag를 보내도록 구성하십시오.

ETag에 대한 마지막 참고 사항-Apache를 실행하는 여러 시스템에서로드 밸런스 서버 설정을 사용하는 경우 ETag 생성을 해제 할 수 있습니다. 이는 inode가 서버마다 다른 ETag 해시 알고리즘의 일부로 사용되기 때문입니다. 계산의 일부로 inode를 사용하지 않도록 Apache를 구성 할 수 있지만 모든 서버에 대해 동일한 ETag가 생성되도록 파일의 타임 스탬프가 정확히 동일한 지 확인하려고합니다.


12
또한 만료 대신 캐시 제어를 사용해야하는지 확인해야합니다. 캐시 이해는 만료 후에 소개되었으며 더 많은 통제권을 부여합니다. 참조 stackoverflow.com/questions/5799906/...
루이스 페레즈

6
Expires 헤더를 사용하는 경우 리소스가 바뀔 때마다 클라이언트가 파일을 다시 요청하지 않으므로 리소스가 변경 될 때마다 파일 이름을 변경하는 것이 좋습니다. 특히 미래의 값을 만료 날짜로 사용하는 경우.
schnatterer

8
우리가 둘 다 사용할 것이라고 가정 해 봅시다. 만료 시간이 만료되었지만 파일이 변경되지 않은 경우 (Etag는 동일 함) 어떻게됩니까? 서버는 304를 반환하고 파일은 브라우저 캐시에서 제공됩니다. 내 질문은,이 순간에 만료 시간을 다시 생성 할 것인가?
user345602

2
ETAG Expires 헤더를 0이 아닌 값으로 설정하십시오. 이로 인해 경쟁 조건이 발생할 수 있습니다. jakearchibald.com/2016/caching-best-practices
Weston

2
서버에 inode 또는 타임 스탬프를 전혀 사용하지 않도록 지시 할 수 있습니까? 또한 콘텐츠 만 나타내는 데 ETag에 필요한 이유는 무엇입니까?
Seza 2012

108

EtagLast-modified 헤더는 유효성 검사기 입니다.

파일 및 페이지가 동일한 이름을 유지하더라도 변경된 경우 브라우저 및 / 또는 캐시 (역 프록시)가이를 이해하도록 도와줍니다.

만료캐시 제어새로 고침 정보를 제공 합니다 .

즉, 브라우저가 프록시를 통해 프록시를 사용하여 페이지 / 파일을 캐시에 보관할 수있는 시간 또는 기간을 알려줍니다.

따라서 문제는 일반적으로 어떤 유효성 검사기에서 사용할 태그, 마지막으로 수정했는지, 어떤 새로 고침 정보 헤더를 사용할지, 만료 또는 캐시 제어하는지에 관한 것입니다.


31

Expires그리고 Cache-Control'강력한 캐시 헤더'입니다

Last-Modified그리고 ETag"약한 캐시 헤더"입니다

먼저 브라우저 Expires/Cache-Control는 서버에 대한 요청 여부를 결정합니다

요청 Last-Modified/ETag이 필요한 경우 HTTP 요청을 보냅니다 . Etag문서 의 값이 그 값과 일치하면 서버는 내용 대신 200 코드 대신 304 코드를 보냅니다. 브라우저는 캐시에서 내용을로드합니다.


1
"강하고 약한"캐싱 동작을 지원하는 문서가 있습니까? 하나를 찾을 수 없었고, 클라이언트 브라우저가 실제로 최종 수정보다 우선 순위를 매기므로 실제로 이유를 이해할 수 없습니다.
GMsoF

1
당신은 이것 좀 걸릴 수도 있습니다 @GMsoF : tools.ietf.org/html/rfc7232#section-2.1을
메데이로스

따라서 변경 사항이 즉시 클라이언트에게 전파되지만 일부 캐싱의 이점이 있는지 확인하려면 Last-Modified 및 ETag 만 사용할 수 있습니까?
Sebastien Lorber

이것은 가장 간결하지만 가장 명확한 대답입니다! 감사.
aderchox

18

기본적으로 Apache는 파일의 inode 번호, 마지막 수정 날짜 및 크기를 기반으로 Etag 생성합니다. 원하는 태그 는 완벽하게 작동합니다. 디스크에서 파일의 마지막 수정 시간을 기반으로 Last-Modified 헤더를 기본적으로 생성한다고 생각합니다. 원하는 작업을 수행하는 것도 완벽합니다.

당신은 아마도 (에 따라 아파치는 미래에 헤더 날짜가 일 년 만료 보내도록한다 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21 브라우저는 내용이 알고 그래서) 캐시 가능. 이를 구성하기 위해 mod_expires 를 살펴보십시오 .


따라서 ETag는 마지막으로 수정되고 만료 헤더는 캐시를 원한다고 알려주며 파일을 업로드하고 덮어 쓸 때 다시 사용자의 캐시로 풀다운됩니다. 그렇지 않으면 304가 올바르게 생성됩니까?
GeoffreyF67

이 태그는 마지막 수정 날짜에 복잡한 방식으로 의존합니다. 그러나 파일을 수정하면 Etag가 변경됩니다. 그러면 브라우저가 파일의 캐시 된 버전을 위해 보낸 Etag가 서버에있는 파일의 Etag와 일치하지 않으며 Apache는 304 응답 대신 파일을 보냅니다.
David Z

6
1 년이 헤더에 만료되지 않더라도 클라이언트에게 1 년 동안 새 버전을 확인하지 않아도됩니까?
John Bachir

@ 존 : 예, 나는 그것을 쓸 때 결코 변하지 않는 정적 컨텐츠를 생각하고 있다고 생각합니다.
David Z

2
@ 존 Bachir : 그 행동을 경험해야하지만 브라우저는 적어도 최신 버전을 찾기 위해 서버를 공격하는 것 같습니다. 이 문제에 대한 또 다른 질문을 열었습니다 : stackoverflow.com/questions/10048740/…
Marco Demaio

13

또 다른 요약 :

둘 다 사용해야합니다. ETag는 "서버 측"정보입니다. 만료는 "클라이언트 측"캐싱입니다.

  • 로드 밸런스 서버가있는 경우를 제외하고 ETag를 사용하십시오 . 그것들은 안전하며 클라이언트가 당신이 무언가를 변경할 때마다 새로운 버전의 서버 파일을 가져와야한다고 알립니다.

  • 만료 날짜를 미래에 설정했지만 파일 중 하나 (예 : JS 파일)를 즉시 변경하려는 경우 일부 사용자는 오랫동안 수정 된 버전을 얻지 못할 수 있으므로 만료를주의해서 사용해야합니다!


2
이 만료 상황의 경우 기본적으로 js의 이름을 바꾸고 HTML에서 변경해야하며 HTML 파일의 만료를 1 년으로 설정하지 않았기를 바랍니다.
EralpB

1

대답 중 일부가 놓칠 수 있다고 언급하고 싶은 한 가지 추가 사항은 헤더 ETagsExpires/Cache-control헤더 모두에 단점이 있다는 것 입니다.

필요에 따라 헤더에 여분의 바이트를 추가하면 패킷이 증가하여 더 많은 TCP 오버 헤드가 발생할 수 있습니다. 다시 말하지만 헤더에 두 가지를 모두 두는 오버 헤드가 필요한지 또는 요청에 추가 가중치가 추가되어 성능이 저하되는지 확인해야합니다.

Kyle Simpson의이 훌륭한 블로그 게시물에서 자세한 내용을 확인할 수 있습니다. http://calendar.perfplanet.com/2010/bloated-request-response-headers/


1

필자의 관점에서 Expire Header를 사용하면 서버에서 클라이언트에게 내 데이터가 오래되었을 때 클라이언트에게 알리고 Etag를 사용하면 서버가 클라이언트의 각 요청에 대한 etag 값을 확인할 수 있습니다.


0

ETag는 자원이 사본을 사용해야하는지 여부를 결정하는 데 사용됩니다. Cache-Control과 같은 Expires Header는 클라이언트에게 수십 년 전에 캐시가 로컬 리소스를 가져와야한다는 것을 알려줍니다.

현대 사이트에는 종종, 같은 이름의 hash 파일 app.98a3cf23.js이 있으므로 Expires Header를 사용하는 것이 좋습니다. 이 외에도 네트워크 비용이 절감됩니다.

그것이 도움이되기를 바랍니다.)

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