Tại sao cả no-cache và no-store nên được sử dụng trong phản hồi HTTP?


120

Tôi được yêu cầu để ngăn rò rỉ thông tin người dùng, chỉ phản hồi "no-cache" là không đủ. "no-store" cũng là cần thiết.

Cache-Control: no-cache, no-store

Sau khi đọc thông số này http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html , tôi vẫn không chắc tại sao.

Sự hiểu biết hiện tại của tôi là nó chỉ dành cho máy chủ bộ đệm trung gian. Ngay cả khi phản hồi "no-cache", máy chủ cache trung gian vẫn có thể lưu nội dung vào bộ nhớ không bay hơi. Máy chủ bộ đệm trung gian sẽ quyết định xem có sử dụng nội dung đã lưu cho yêu cầu sau hay không. Tuy nhiên, nếu phản hồi là "no-store", thì máy chủ cache trung gian không được phép lưu trữ nội dung. Vì vậy, nó là an toàn hơn.

Có lý do nào khác mà chúng ta cần cả "no-cache" và "no-store" không?


3
no-cachekhông có nghĩa là những gì bạn nghĩ rằng nó không. Trên thực tế, nó có nghĩa là "vui lòng xác thực lại".
Erwan Legrand

Câu trả lời:


77

Tôi phải làm rõ điều no-cacheđó không có nghĩa là không lưu vào bộ nhớ cache . Trên thực tế, nó có nghĩa là "xác thực lại với máy chủ" trước khi sử dụng bất kỳ phản hồi nào được lưu trong bộ nhớ cache mà bạn có thể có, theo mọi yêu cầu.

must-revalidate, mặt khác, chỉ cần xác thực lại khi tài nguyên được coi là cũ.

Nếu máy chủ thông báo rằng tài nguyên vẫn hợp lệ thì bộ nhớ đệm có thể phản hồi với biểu diễn của nó, do đó giảm bớt nhu cầu máy chủ gửi lại toàn bộ tài nguyên.

no-storehiệu quả là chỉ thị không lưu bộ nhớ cache đầy đủ và nhằm ngăn chặn việc lưu trữ biểu diễn dưới bất kỳ hình thức bộ nhớ cache nào.

Tôi nói bất cứ điều gì, nhưng lưu ý điều này trong thông số HTTP RFC 2616:

Bộ đệm lịch sử CÓ THỂ lưu trữ các phản hồi như vậy như một phần của hoạt động bình thường của chúng

Nhưng điều này được bỏ qua khỏi thông số RFC 7234 HTTP mới hơn có khả năng là một nỗ lực để làm cho no-storemạnh hơn, hãy xem:

http://tools.ietf.org/html/rfc7234#section-5.2.1.5


18
Vẫn không trả lời được câu hỏi: tại sao cả no-cache no-store nên được sử dụng trong phản hồi HTTP? Không Cache-Control: no-stoređủ sao?
Franklin Yu

Có sự khác biệt giữa các trình duyệt không? Bởi vì bài viết này từ Microsoft docs.microsoft.com/en-us/iis/configuration/system.webServer/… thậm chí không đề cập no-storevà mô tả no-cachenhư thể nó không có bộ nhớ đệm nào cả .... Tôi bối rối!
Roel

Câu trả lời của Alconja là câu trả lời cụ thể cho câu hỏi. Khi tôi trả lời, tôi làm như vậy chỉ để làm rõ một nhận thức vi mô rất phổ biến. Hãy bình chọn câu trả lời khác lên!
Luke Puplett,

48

Trong một số trường hợp nhất định, IE6 sẽ vẫn lưu trữ các tệp trong bộ nhớ cache ngay cả khi Cache-Control: no-cacheở trong tiêu đề phản hồi.

Các W3C nói củano-cache :

Nếu lệnh no-cache không chỉ định tên trường, thì cache KHÔNG PHẢI sử dụng phản hồi để đáp ứng yêu cầu tiếp theo mà không cần xác thực lại thành công với máy chủ gốc.

Trong ứng dụng của tôi, nếu bạn truy cập một trang có no-cachetiêu đề, sau đó đăng xuất và sau đó truy cập lại trong trình duyệt của mình, IE6 sẽ vẫn lấy trang đó từ bộ nhớ cache (mà không có yêu cầu mới / xác thực đối với máy chủ). Thêm vào no-storetiêu đề ngăn nó làm như vậy. Nhưng nếu bạn sử dụng W3C theo lời của họ, thực sự không có cách nào để kiểm soát hành vi này:

Bộ đệm lịch sử CÓ THỂ lưu trữ các phản hồi như vậy như một phần của hoạt động bình thường của chúng.

Sự khác biệt chung giữa lịch sử trình duyệt và bộ đệm HTTP thông thường được mô tả trong phần phụ cụ thể của thông số kỹ thuật .


7
khi bạn truy cập lại vào trình duyệt của mình, IE6 không lấy trang từ bộ nhớ cache. Nó lấy trang từ bộ đệm lịch sử.
Pacerier

1
Trong Chrome 34 (2014), vẫn cần thiết lập no-store. Nếu không, Chrome sẽ hiển thị dữ liệu đã lưu trong bộ đệm / lưu vào bộ đệm khi sử dụng nút quay lại.
caw

4
-1 vì câu đầu tiên ngụ ý sai rằng trình duyệt lưu vào bộ đệm một phản hồi có no-cachetiêu đề là không chính xác . Trích dẫn của W3C ngay dưới đây cho thấy rõ ràng rằng đây không phải là trường hợp; thay vào đó, no-cachetiêu đề chỉ có nghĩa là phản hồi phải được xác thực lại trước khi được sử dụng lại để phục vụ các yêu cầu tiếp theo.
Mark Amery

1
Việc ghi thông số kỹ thuật đã được cải thiện từ RFC1616, thành phiên bản hiện tại của thông số kỹ thuật ( họ tools.ietf.org/html/rfc7230 của RFC). một gia đình vì nó là 6 RFC. Chúng đã lỗi thời 2616.
Arcin B

16

Từ đặc tả HTTP 1.1 :

không có cửa hàng :

Mục đích của cửa hàng khôngchỉ thị là để ngăn chặn việc vô tình phát hành hoặc lưu giữ thông tin nhạy cảm (ví dụ: trên các băng sao lưu). Chỉ thị không có cửa hàng áp dụng cho toàn bộ tin nhắn và CÓ THỂ được gửi trong một phản hồi hoặc trong một yêu cầu. Nếu được gửi trong một yêu cầu, bộ nhớ cache KHÔNG ĐƯỢC lưu trữ bất kỳ phần nào của yêu cầu này hoặc bất kỳ phản hồi nào đối với nó. Nếu được gửi trong một phản hồi, bộ nhớ cache KHÔNG ĐƯỢC lưu trữ bất kỳ phần nào của phản hồi này hoặc yêu cầu tạo ra nó. Chỉ thị này áp dụng cho cả bộ đệm không chia sẻ và bộ đệm được chia sẻ. "KHÔNG PHẢI lưu trữ" trong ngữ cảnh này có nghĩa là bộ đệm ẩn PHẢI cố ý lưu trữ thông tin trong bộ nhớ không bay hơi và PHẢI cố gắng hết sức để xóa thông tin khỏi bộ nhớ dễ bay hơi càng nhanh càng tốt sau khi chuyển tiếp. Ngay cả khi chỉ thị này được liên kết với một phản hồi, người dùng có thể lưu trữ một cách rõ ràng phản hồi như vậy bên ngoài hệ thống bộ nhớ đệm (ví dụ: với hộp thoại "Lưu dưới dạng"). Bộ đệm lịch sử CÓ THỂ lưu trữ các phản hồi như vậy như một phần của hoạt động bình thường của chúng. Mục đích của chỉ thị này là để đáp ứng các yêu cầu đã nêu của một số người dùng và tác giả dịch vụ nhất định lo ngại về việc vô tình phát hành thông tin qua các truy cập không lường trước đến cấu trúc dữ liệu bộ nhớ cache. Mặc dù việc sử dụng chỉ thị này có thể cải thiện quyền riêng tư trong một số trường hợp, nhưng chúng tôi lưu ý rằng nó KHÔNG phải là cơ chế đáng tin cậy hoặc đủ để đảm bảo quyền riêng tư theo bất kỳ cách nào. Đặc biệt, bộ nhớ đệm độc hại hoặc bị xâm nhập có thể không nhận ra hoặc không tuân theo chỉ thị này và các mạng truyền thông có thể dễ bị nghe trộm. Bộ đệm lịch sử CÓ THỂ lưu trữ các phản hồi như vậy như một phần của hoạt động bình thường của chúng. Mục đích của chỉ thị này là để đáp ứng các yêu cầu đã nêu của một số người dùng và tác giả dịch vụ nhất định lo ngại về việc vô tình phát hành thông tin qua các truy cập không lường trước đến cấu trúc dữ liệu bộ nhớ cache. Mặc dù việc sử dụng chỉ thị này có thể cải thiện quyền riêng tư trong một số trường hợp, nhưng chúng tôi lưu ý rằng nó KHÔNG phải là cơ chế đáng tin cậy hoặc đủ để đảm bảo quyền riêng tư theo bất kỳ cách nào. Đặc biệt, bộ nhớ đệm độc hại hoặc bị xâm nhập có thể không nhận ra hoặc không tuân theo chỉ thị này và các mạng truyền thông có thể dễ bị nghe trộm. Bộ đệm lịch sử CÓ THỂ lưu trữ các phản hồi như vậy như một phần của hoạt động bình thường của chúng. Mục đích của chỉ thị này là để đáp ứng các yêu cầu đã nêu của một số người dùng và tác giả dịch vụ nhất định lo ngại về việc vô tình phát hành thông tin qua các truy cập không lường trước đến cấu trúc dữ liệu bộ nhớ cache. Mặc dù việc sử dụng chỉ thị này có thể cải thiện quyền riêng tư trong một số trường hợp, nhưng chúng tôi lưu ý rằng nó KHÔNG phải là cơ chế đáng tin cậy hoặc đủ để đảm bảo quyền riêng tư theo bất kỳ cách nào. Đặc biệt, bộ nhớ đệm độc hại hoặc bị xâm nhập có thể không nhận ra hoặc không tuân theo chỉ thị này và các mạng truyền thông có thể dễ bị nghe trộm. Mặc dù việc sử dụng chỉ thị này có thể cải thiện quyền riêng tư trong một số trường hợp, nhưng chúng tôi lưu ý rằng nó KHÔNG phải là cơ chế đáng tin cậy hoặc đủ để đảm bảo quyền riêng tư theo bất kỳ cách nào. Đặc biệt, bộ nhớ đệm độc hại hoặc bị xâm nhập có thể không nhận ra hoặc không tuân theo chỉ thị này và các mạng truyền thông có thể dễ bị nghe trộm. Mặc dù việc sử dụng chỉ thị này có thể cải thiện quyền riêng tư trong một số trường hợp, nhưng chúng tôi lưu ý rằng nó KHÔNG phải là cơ chế đáng tin cậy hoặc đủ để đảm bảo quyền riêng tư theo bất kỳ cách nào. Đặc biệt, bộ nhớ đệm độc hại hoặc bị xâm nhập có thể không nhận ra hoặc không tuân theo chỉ thị này và các mạng truyền thông có thể dễ bị nghe trộm.


1
Nếu bạn chưa yêu cầu vào bộ nhớ đệm, thì điều đó có ngăn cản việc lưu trữ phản hồi trong phương tiện không bay hơi không?
Lèse majesté

4
@ Lèsemajesté Thường thì không. no-cachemax-age=0nói rằng món đồ đó được coi là cũ. Điều này có nghĩa là nó phải được xác thực lại trước khi được phục vụ. Điều này có nghĩa là một bộ đệm có thể lưu trữ tệp và sau đó thực hiện một yêu cầu có điều kiện mà máy chủ có thể trả lời 304 NOT MODIFIED. Đây rõ ràng là một lợi thế lớn vì nội dung của phản hồi không cần phải được tạo và gửi. Vì vậy, để tận dụng lợi thế của nhiều (hầu hết?) Bộ nhớ đệm này sẽ lưu trữ các no-cachephản hồi.
Kevin Cox

14

Nếu bạn muốn ngăn chặn tất cả bộ nhớ đệm (ví dụ: buộc tải lại khi sử dụng nút quay lại), bạn cần:

  • no-cache cho IE

  • no-store cho Firefox

Có thông tin của tôi về điều này ở đây:

http://blog.httpwatch.com/2008/10/15/two-important-differences-between-firefox-and-ie-caching/


6
Tại sao no-store không đủ cho Internet Explorer? Bài đăng trên blog của bạn không giải thích.
Simon Lieschke

1
Bạn đang nói về phiên bản IE nào?
Pacerier

1
@Pacerier, Có lẽ là phiên bản IE mới nhất tại thời điểm anh ấy / cô ấy viết bình luận. Theo Wikipedia, đây là IE7. Đối với FF nó giống như 3. Không nhiều người vẫn sử dụng.
chạy thận

11

no-storekhông cần thiết trong các tình huống bình thường, và có thể gây hại cho cả tốc độ và khả năng sử dụng. Nó được thiết kế để sử dụng khi phản hồi HTTP chứa thông tin nhạy cảm đến mức nó không bao giờ được ghi vào bộ nhớ cache trên đĩa, bất kể những tác động tiêu cực tạo ra cho người dùng.

Làm thế nào nó hoạt động:

  • Thông thường, ngay cả khi tác nhân người dùng như trình duyệt xác định rằng phản hồi không nên được lưu vào bộ nhớ cache, nó vẫn có thể lưu nó vào bộ đệm ẩn đĩa vì những lý do bên trong tác nhân người dùng. Phiên bản này có thể được sử dụng cho các tính năng như "xem nguồn", "quay lại", "thông tin trang", v.v., trong đó người dùng không nhất thiết phải yêu cầu lại trang, nhưng trình duyệt không coi đó là một lần xem trang mới và sẽ có ý nghĩa nếu cung cấp cùng một phiên bản mà người dùng hiện đang xem.

  • Việc sử dụng no-storesẽ ngăn phản hồi đó được lưu trữ, nhưng điều này có thể ảnh hưởng đến khả năng của trình duyệt cung cấp "nguồn xem", "quay lại", "thông tin trang", v.v. mà không đưa ra yêu cầu mới, riêng biệt cho máy chủ, điều này là không mong muốn. Nói cách khác, người dùng có thể thử xem nguồn và nếu trình duyệt không giữ nó trong bộ nhớ, họ sẽ được thông báo rằng điều này là không thể hoặc nó sẽ tạo ra một yêu cầu mới đến máy chủ. Do đó, no-storechỉ nên được sử dụng khi trải nghiệm người dùng bị cản trở của các tính năng này không hoạt động bình thường hoặc nhanh chóng vượt trội bởi tầm quan trọng của việc đảm bảo nội dung không được lưu trữ trong bộ nhớ cache.

Sự hiểu biết hiện tại của tôi là nó chỉ dành cho máy chủ bộ đệm trung gian. Ngay cả khi phản hồi "no-cache", máy chủ cache trung gian vẫn có thể lưu nội dung vào bộ nhớ không bay hơi.

Điều này là không đúng. Các máy chủ bộ đệm trung gian tương thích với HTTP 1.1 sẽ tuân theo các hướng dẫn no-cachemust-revalidatechỉ dẫn, đảm bảo rằng nội dung không được lưu vào bộ đệm. Sử dụng các hướng dẫn này sẽ đảm bảo rằng phản hồi không được lưu vào bộ đệm ẩn bởi bất kỳ bộ đệm trung gian nào và tất cả các yêu cầu tiếp theo sẽ được gửi trở lại máy chủ gốc.

Nếu máy chủ cache trung gian không hỗ trợ HTTP 1.1, thì bạn sẽ cần sử dụng Pragma: no-cachevà hy vọng điều tốt nhất. Lưu ý rằng nếu nó không hỗ trợ HTTP 1.1 thì no-storedù sao cũng không liên quan.


3
Có phải tôi đang hiểu nhầm điều gì đó không vì mnot.net/cache_docs/#CACHE-CONTROL đang mâu thuẫn với bạn. Nó nói rằng no-cacheduy trì sự mới mẻ cứng nhắc mà không phải hy sinh tất cả lợi ích của bộ nhớ đệm, có nghĩa là bộ nhớ cache được lưu trữ và sử dụng lại nếu máy chủ phản hồi với 304 Not Modified.
Pacerier

-1: no-cache không có nghĩa là nội dung không thể được cache. Trong 14.9.1 What Is Cachable, thông số cho biết, "Nếu lệnh no-cache không chỉ định tên trường, thì cache KHÔNG PHẢI sử dụng phản hồi để đáp ứng yêu cầu tiếp theo mà không cần xác thực lại thành công với máy chủ gốc." ( w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9. ) Như Chris Shiflett giải thích, nó "không ngăn hệ thống bộ nhớ đệm giữ bản sao đã lưu trong bộ đệm. Nó chỉ yêu cầu hệ thống bộ nhớ đệm xác thực lại bộ nhớ đệm của nó trước khi để gửi lại cho khách hàng. " (HTTP cho nhà phát triển của Sổ tay, p 91)
james.garriss

Tôi không nghĩ những gì tôi đã viết trong câu trả lời này hợp đồng với cả hai nhận xét đó - tôi chỉ đơn giản là không nói về cách các trình duyệt xác thực lại (ví dụ: sử dụng If-Modified-Since / If-None-Match) bởi vì tôi không thấy nó là liên quan, thích hợp. Tôi thậm chí đã không cố gắng che đậy không có bộ nhớ cache để làm gì, vì vậy tôi khó hiểu nhận xét của @ james.garriss liên quan như thế nào đến câu trả lời của tôi.
thomasrutter

7

Nếu một hệ thống bộ nhớ đệm thực hiện đúng cách không lưu trữ, thì bạn sẽ không cần bộ nhớ đệm. Nhưng không phải tất cả đều làm. Ngoài ra, một số trình duyệt triển khai no-cache giống như không có cửa hàng. Vì vậy, mặc dù không bắt buộc nghiêm ngặt, nhưng có lẽ an toàn nhất là bao gồm cả hai.


Nhưng không phải tất cả đều như vậy. ”Chúng tôi cần một ví dụ cụ thể để thuyết phục đồng nghiệp của tôi.
Franklin Yu

Nhận xét đó đã được đưa ra cách đây 6 năm. Bạn sẽ cần phải khảo sát hoạt động hiện tại của các máy chủ bộ nhớ đệm để xem chúng đang làm gì.
james.garriss

6

Lưu ý rằng Internet Explorer từ phiên bản 5 trở lên 8 sẽ gặp lỗi khi cố tải xuống tệp được phân phát qua https và máy chủ gửi Cache-Control: no-cachehoặc Pragma: no-cachetiêu đề.

Xem http://support.microsoft.com/kb/812935/en-us

Việc sử dụng Cache-Control: no-storePragma: privatedường như là thứ gần nhất vẫn hoạt động.


2
Như được đề xuất trong một câu trả lời SO liên quan, bạn có thể đặt Cache-Control: no-store, no-cache, must-revalidatetheo thứ tự chính xác đó để làm cho nó hoạt động. Tuy nhiên, điều đó không hoạt động trong kịch bản của chúng tôi, nhưng những gì @bassim đề xuất ở trên đã làm được. Cảm ơn!
Eirik H

6

Đối với chrome, no-cache được sử dụng để tải lại trang khi truy cập lại, nhưng nó vẫn lưu vào bộ nhớ cache nếu bạn quay lại lịch sử (nút quay lại). Để tải lại trang cũng như quay lại lịch sử, hãy sử dụng tính năng không cần lưu trữ. IE cần phải được xác thực lại để hoạt động trong mọi trường hợp.

Vì vậy, để đảm bảo tránh tất cả các lỗi và hiểu sai, tôi luôn sử dụng

Cache-Control: no-store, no-cache, must-revalidate

nếu tôi muốn đảm bảo rằng nó sẽ tải lại.


2

Ban đầu, chúng tôi đã sử dụng no-cache nhiều năm trước và đã gặp phải một số vấn đề với nội dung cũ với một số trình duyệt nhất định ... Rất tiếc, không nhớ chi tiết cụ thể.

Kể từ đó, chúng tôi đã giải quyết CHỈ bằng việc sử dụng không có cửa hàng. Kể từ đó, chưa bao giờ nhìn lại hoặc gặp vấn đề với nội dung cũ bởi bất kỳ trình duyệt hoặc trung gian nào.

Không gian này chắc chắn bị chi phối bởi thực tế của việc triển khai so với những gì xảy ra đã được viết trong các RFC khác nhau. Đặc biệt, nhiều proxy có xu hướng nghĩ rằng họ làm tốt hơn công việc "cải thiện hiệu suất" bằng cách thay thế chính sách mà họ được cho là phải tuân theo bằng chính sách của chính họ.


Tôi tin rằng đó là Firefox đã từng thích no-store.
bvdb


-1

OWASP thảo luận về điều này:

Sự khác biệt giữa các chỉ thị kiểm soát bộ nhớ cache: no-cache và no-store là gì?

Lệnh no-cache trong một phản hồi chỉ ra rằng phản hồi không được sử dụng để phục vụ yêu cầu tiếp theo, tức là bộ đệm không được hiển thị phản hồi có chỉ thị này được đặt trong tiêu đề nhưng phải để máy chủ phục vụ yêu cầu. Lệnh no-cache có thể bao gồm một số tên trường; trong trường hợp đó phản hồi có thể được hiển thị từ bộ nhớ cache ngoại trừ các tên trường được chỉ định sẽ được cung cấp từ máy chủ. Lệnh no-store áp dụng cho toàn bộ thông báo và chỉ ra rằng bộ đệm ẩn không được lưu trữ bất kỳ phần nào của phản hồi hoặc bất kỳ yêu cầu nào yêu cầu nó.

Tôi có hoàn toàn an toàn với những chỉ thị này không?

Không. Nhưng nói chung, hãy sử dụng cả Cache-Control: no-cache, no-store và Pragma: no-cache, ngoài Expires: 0 (hoặc một ngày GMT được cập nhật đầy đủ chẳng hạn như kỷ nguyên UNIX). Các loại nội dung không phải html như pdf, tài liệu word, bảng tính excel, v.v. thường được lưu vào bộ nhớ cache ngay cả khi các chỉ thị kiểm soát bộ nhớ cache ở trên được đặt (mặc dù điều này thay đổi theo phiên bản và việc sử dụng bổ sung phải xác thực lại, kiểm tra trước = 0, kiểm tra sau = 0, max-age = 0 và s-maxage = 0 trong thực tế đôi khi có thể dẫn đến việc xóa tệp ít nhất khi đóng trình duyệt trong một số trường hợp do các lỗi trình duyệt và triển khai HTTP). Ngoài ra, tính năng 'Tự động điền' cho phép trình duyệt lưu vào bộ đệm bất kỳ thứ gì người dùng nhập vào trường đầu vào của biểu mẫu. Để kiểm tra điều này, thẻ biểu mẫu hoặc các thẻ nhập riêng lẻ phải bao gồm thuộc tính 'Autocomplete = "Off"'. Tuy nhiên,

Nguồn tại đây .


Điều này là không đúng. no-cachecho biết bạn không thể sử dụng nó nếu không xác thực với máy chủ. Nếu bản sao được lưu trong bộ nhớ cache của bạn vẫn tốt, máy chủ sẽ trả lời bằng 304 và sau đó bạn sử dụng bản sao đã lưu trong bộ nhớ cache của mình. Tiết kiệm cho bạn bản tải xuống mạng lớn tiềm năng. no-storemặt khác nói rằng bạn không được phép lưu dữ liệu vào bộ nhớ cache.
Gargoyle
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.