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


166

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

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

그러나 나는 그것이 무엇을 이해하지 못했습니까? 사이의 차이는 무엇입니까 Cache-Control값 헤더 no-cache와 Pragma그 값도는 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.