Pragma와 Cache-Control 헤더의 차이점은 무엇입니까?


166

Wikipedia의 Pragma 헤더에 대해 읽었습니다 .

"Pragma : no-cache 헤더 필드는 요청에 사용하기위한 HTTP / 1.0 헤더입니다. 이는 브라우저가 서버가 아닌 새로운 버전의 리소스를 원한다고 서버와 모든 중간 캐시에 알리는 수단입니다. 일부 사용자 에이전트는 응답으로이 헤더에주의를 기울이지 만 HTTP / 1.1 RFC는 특히이 동작에 의존하지 않도록 경고합니다. "

그러나 나는 그것이 무엇을 이해하지 못했습니까? 사이의 차이는 무엇입니까 Cache-Control값 헤더 no-cachePragma그 값도는 no-cache?

답변:


196

PragmaHTTP / 1.0 구현이며 cache-control동일한 개념의 HTTP / 1.1 구현입니다. 둘 다 클라이언트가 응답을 캐싱하지 못하도록하기위한 것입니다. 이전 클라이언트는 HTTP / 1.1을 지원하지 않을 수 있으므로 해당 헤더가 여전히 사용되고 있습니다.


31
아래 cnst의 답변은 훨씬 더 복잡하지만 사양에 따라 훨씬 더 정확합니다. Pragma: no-cache요청에만 사용하도록되어 있으며 ( "캐시 된 사본이 아니라 원본을 원합니다") 응답에 대해 해당 동작이 지정되지 않았습니다.
clime

5
Cache-Control: no-cache요청에 대해 동일한 의미를 갖지만 실제로는 응답에 대해서도 정의됩니다. "향후에 캐시 된 사본을 사용하려면 먼저 최신 상태인지 확인해야합니다 (즉, 유효성 다시 확인)".
clime

3
그것은 캐시 제어를위한 것이며, 캐시 방지를 위해서만 필요하지는 않으며, "캐시 가능"이라고 말하는 데 사용될 수도 있습니다. ....
jave.web

기본 답변. 더 복잡하게 만들려면 요청 헤더이기도하므로 서버에 캐시를 보낼 수 없습니다. 그리고 그것은 실제로 오래된 콘텐츠를 클라이언트에게 반환하는 것을 의미 할 수 있습니다. 지금 당신은 이것을 잊고 위의 간단한 대답을 읽고 당신의 인생을 즐기십시오, 너무 열심히 파지 마십시오 lol
sotn

둘 다 클라이언트가 응답을 캐싱하는 것을 방지하기 위한 것이므로 독자에게는 혼란스러운 메모입니다. max-age캐싱을 방해하지 않는 것도 있습니다 . 그것은 단지 그것을 위해 만료 날짜를 설정합니다 ...
Honey

97

Pragma클라이언트의 요청에만 적용 가능한 것으로 정의 된 것을 제외하고 는 차이가 없지만 클라이언트 Cache-Control의 요청과 서버의 응답 모두에서 사용될 수 있습니다.

따라서 표준에 관한 한, 요청을하는 클라이언트와 서버가 클라이언트로부터 요청을받는 관점에서만 비교할 수 있습니다. http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.32 정의하는 시나리오는 다음과 같습니다 :

HTTP / 1.1 캐시는 클라이언트가 "Cache-Control : no-cache"를 보낸 것처럼 "Pragma : no-cache"를 처리해야합니다. 새로운 Pragma 지시문은 HTTP에 정의되지 않습니다.

  Note: because the meaning of "Pragma: no-cache as a response
  header field is not actually specified, it does not provide a
  reliable replacement for "Cache-Control: no-cache" in a response

위의 내용을 읽는 방법 :

  • 클라이언트를 작성 중이고 필요한 경우 no-cache:

    • 서버가 지원 Pragma: no-cache하는지 알 수 없으므로 요청에 사용 하십시오 Cache-Control.
    • 그러나 답장에서 캐시할지 여부를 결정하려면 Cache-Control
  • 서버를 작성하는 경우 :

    • 클라이언트의 요청을 구문 분석 할 때 확인하십시오 Cache-Control. 찾을 수 없으면를 확인 Pragma: no-cache하고 Cache-Control: no-cache논리를 실행하십시오 .
    • 답글을 보내 Cache-Control주십시오.

물론 현실은 RFC에서 작성되거나 암시 된 것과 다를 수 있습니다!


5
헤더에 둘 다 있으면 어떻게됩니까? Cache-Control: max-age=86400그리고 Pragma: no-cache? 그렇다면 현대 브라우저는 어떤 것을 존경 할 것입니까?
PKHunter

3
@ PKHunter, 왜 행동이 정의되지 않은 경우 어떤 방식으로 신경 쓰겠습니까? 서버에 대한 책임이 있다면 클라이언트에게 잘못된 정보를 제공하는 것보다 낫습니다. 또한 내 대답에서 지적한 것처럼 Pragma: no-cache브라우저의 요청에 대해서만 정의되므로 서버에서 브라우저로의 응답에서 완전히 무효화되고 정의되지 않습니다. 예를 들어 모든 단일 브라우저 (현대 또는 not) 수신 할 수있는 회신에서 이러한 헤더를 무시해야합니다.
cnst

3
최신 브라우저는 캐시 제어를 선호하는 Pragma를 무시해야합니다. 캐시 제어는 초기 1.0 프로토콜에서 사용할 수 없었던 기간 및 기타 정보를 지정할 수 있기 때문에 Cache-Control을 선호합니다.
랜달 ck

17
| Stop using          | Replaced with                    |
| (HTTP 1.0)          | (HTTP 1.1 - 1999)                |
|---------------------|----------------------------------|
| Expires: [date]     | Cache-Control: max-age=[seconds] |
| Pragma: no-cache    | Cache-Control: no-cache          |

1999 년 이후에도 여전히 Expires 또는 Pragma를 사용 하고 있다면 잘못하고 있습니다.

나는 당신을보고 있습니다.

200 OK
Pragma: no-cache
Content-Type: application/json
X-Frame-Options: SAMEORIGIN
X-Request-Guid: a3433194-4a03-4206-91ea-6a40f9bfd824
Strict-Transport-Security: max-age=15552000
Content-Length: 54
Accept-Ranges: bytes
Date: Tue, 03 Apr 2018 19:03:12 GMT
Via: 1.1 varnish
Connection: keep-alive
X-Served-By: cache-yyz8333-YYZ
X-Cache: MISS
X-Cache-Hits: 0
X-Timer: S1522782193.766958,VS0,VE30
Vary: Fastly-SSL
X-DNS-Prefetch-Control: off
Cache-Control: private

tl; dr : Pragma은 HTTP / 1.0의 레거시이며 Internet Explorer 5 또는 Netscape 4.7 이후에는 필요하지 않았습니다. 일부 사용자가 IE5를 사용할 것으로 예상하지 않는 한 사용을 중지하는 것이 안전합니다.


  • 만료 : [date] (더 이상 사용되지 않음-HTTP 1.0)
  • Pragma : 캐시 없음 (더 이상 사용되지 않음-HTTP 1.0)
  • 캐시 제어 : max-age =[seconds]
  • 캐시 제어 : 캐시 없음 (매번 캐시 된 사본을 다시 확인해야 함)

그리고 조건부 요청 :

  • Etag (엔티티 태그) 기반 조건부 요청
    • 섬기는 사람: Etag: W/“1d2e7–1648e509289”
    • 고객: If-None-Match: W/“1d2e7–1648e509289”
    • 섬기는 사람: 304 Not Modified
  • 수정 된 날짜 기반 조건부 요청
    • 섬기는 사람: last-modified: Thu, 09 May 2019 19:15:47 GMT
    • 고객: If-Modified-Since: Fri, 13 Jul 2018 10:49:23 GMT
    • 섬기는 사람: 304 Not Modified

최종 수정 : 2019 년 5 월 09 일 목요일 19:15:47 GMT


2
RFC는 클라이언트가 Cache-Control을 지원하지 않는 경우 두 가지를 모두 사용해야한다고 말합니다. tools.ietf.org/html/rfc7234#page-29
Randall Borck

3
클라이언트 "해야지이" 모두 포함 -이 다르게 HTTP / 1.1 및 HTTP / 1.0 캐시 서버를 치료하고 싶어하지 않는 한. 서버가 전혀 포함되어서는 안됩니다 Pragma. (HTTP / 1.0에서 Pragma는 수신자에 대한 구현 지정 지시문에 대한 확장 가능한 필드로 정의되었습니다.이 사양에서는 상호 운용성을 향상시키기 위해 이러한 확장을 더 이상 사용하지 않습니다.)
Ian Boyd

2
보안 관점에서 사용하는 것이 좋습니다. 많은 브라우저는 pragma : no-cache 지시문을 따르므로 OWASP에서이를 사용하는 것이 좋습니다. owasp.org/index.php/…
Randall Borck

2
@RandallBorck : 구식 (20 년 전까지) 정보가 확산되고 있습니다. Pragma 지시문을 따르지 않는 브라우저는 1999 년이 아닌 한 더 이상 브라우저를 사용하지 않습니다. 이것은화물 숭배 조언입니다. "아프지 않고 항상 해왔으므로 좋으며 필요합니다."
Piskvor

2
@Piskvor 대부분의 서버는 여전히 1.0과 1.1을 모두 지원하므로 HTTP / 1.0 요청을 적극적으로 차단하지 않으면 클라이언트가 사용중인 프로토콜을 선택하지 않습니다. 오늘날 대부분의 개발자는 1.0을 차단하지 않으므로 2019
Randall Borck 19
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.