Có phải mọi yêu cầu web gửi cookie trình duyệt?


198

Có phải mọi yêu cầu web gửi cookie của trình duyệt?

Tôi không nói về lượt xem trang, nhưng yêu cầu về hình ảnh, .jstệp, v.v.

Cập nhật Nếu một trang web có 50 yếu tố, đó là 50 yêu cầu. Tại sao nó sẽ gửi (các) cookie CÙNG cho mỗi yêu cầu, không lưu bộ đệm hoặc biết nó đã có nó?


8
Tôi không nghĩ rằng bộ nhớ đệm là có thể trong tình huống này - chúng ta đang nói về trình duyệt gửi dữ liệu đến máy chủ, không phải cách khác. Bạn không thể nói chắc chắn rằng máy chủ "đã có nó" sau khi người dùng đã gửi một yêu cầu, vì nhiều lý do. Có thể có một số lượng lớn máy chủ không nói chuyện với nhau; máy chủ có thể không muốn (hoặc có chỗ) để nhớ bất cứ điều gì về các yêu cầu trước đó - HTTP được coi là không trạng thái; mọi yêu cầu nên độc lập với phần còn lại. Vì lý do này, cookie, như thông tin xác thực, phải được gửi với mọi yêu cầu.
Ian Clelland

Tôi đã đề cập tại sao bộ nhớ đệm không có ý nghĩa đối với cookie trong bản cập nhật cho câu trả lời của tôi: stackoverflow.com/a/1336178/102960
igorsantos07

Câu trả lời:


198

Có, miễn là URL được yêu cầu nằm trong cùng một tên miền và đường dẫn được xác định trong cookie (và tất cả các hạn chế khác - an toàn, httponly, không hết hạn, v.v.), thì cookie sẽ được gửi cho mọi yêu cầu.


103
Điều này, tình cờ, là lý do tại sao các công cụ tốc độ trang như Google Page Speed ​​hoặc YSlow của Yahoo khuyên bạn nên cung cấp nội dung tĩnh từ một miền riêng biệt, không có cookie.
ceejayoz

Tôi đã đề cập về việc phục vụ nội dung từ một tên miền riêng trong câu trả lời được cập nhật của tôi: stackoverflow.com/a/1336178/102960
igorsantos07

Có đúng là trình duyệt gửi Cookies Site2 khi có Chuyển hướng HTTP từ Site1 sang Site2 không?
Zeigeist

92

Như những người khác đã nói, nếu máy chủ của cookie, đường dẫn, v.v ... được đáp ứng, nó sẽ được gửi, 50 lần.

Nhưng bạn cũng đã hỏi tại sao: bởi vì cookie là một tính năng HTTP và HTTP là không trạng thái. HTTP được thiết kế để hoạt động mà không cần máy chủ lưu trữ bất kỳ trạng thái nào giữa các yêu cầu.

Trên thực tế, máy chủ không có cách nhận biết chắc chắn người dùng nào đang gửi yêu cầu cụ thể; có thể có một ngàn người dùng đằng sau một proxy web (và do đó là địa chỉ IP). Nếu cookie không được gửi mỗi yêu cầu, máy chủ sẽ không có cách nào để biết người dùng nào đang yêu cầu bất kỳ tài nguyên nào.

Cuối cùng, trình duyệt không có manh mối nếu máy chủ có cần cookie hay không, nó chỉ biết rằng máy chủ đã hướng dẫn nó gửi cookie cho bất kỳ yêu cầu nào đến foo.com, vì vậy nó làm như vậy. Đôi khi, hình ảnh cần chúng (ví dụ: mỗi người dùng được tạo động), đôi khi thì không, nhưng trình duyệt không thể biết được.


1
Điều này có đúng với HTTP 1.1, đây là sơ đồ ghép kênh? Tức là, các yêu cầu được gói vào một kết nối TCP. Tất nhiên mọi yêu cầu đều được nhận với một bản sao của cookie đính kèm. Nhưng nếu mối quan tâm là nhiều sự trùng lặp truyền, HTTP 1.1 có thể được tối ưu hóa. Mặc dù tôi không biết nếu nó thực sự làm ...
Chris Noe

1
Sau đó, vấn đề trở thành "yêu cầu nào trình duyệt có ý định đính kèm cookie?" Máy chủ đặt chính sách với cookie, để quyết định tên miền nào và đường dẫn URL nào, cookie sẽ được gửi lại, nhưng sau đó nó sẽ quên nó. Bạn cần một cách để xác định rằng các yêu cầu nhất định trong kết nối có cookie và những yêu cầu khác thì không. Điều đó chắc chắn không tồn tại trong HTTP / 1.1, ngoại trừ bằng cách bao gồm rõ ràng chúng trong mọi yêu cầu. Thành thật mà nói, một giải pháp tốt hơn (tương thích tiêu chuẩn) để giảm băng thông sẽ là mã hóa nội dung gzip phía máy khách, nhưng chưa có ai hỗ trợ điều đó.
Ian Clelland

1
@Ian Clelland: Máy khách phải gửi tin nhắn đầu tiên, vì vậy nó không biết máy chủ sẽ gửi gì cho Mã hóa chấp nhận (là các máy chủ gửi trường đó, HTTP / 1.1 §14.3 nói tiêu đề yêu cầu của nó). Và vấn đề là nó có thể thay đổi theo URL ngay cả trên cùng một máy chủ và có thể thay đổi theo thời gian, do đó, làm cho nó hoạt động sẽ không tầm thường.
derobert

1
@Chris: Không, keepalive chỉ lưu chi phí thiết lập / ngắt kết nối TCP, thế thôi. Tiêu đề đầy đủ vẫn được gửi cho mọi yêu cầu. Tuy nhiên, pipelining (gửi nhiều yêu cầu không chờ phản hồi) có thể giúp ích rất nhiều. HTTP / 1.1 §8.1 cung cấp chi tiết.
derobert

21

Đúng. Mỗi yêu cầu gửi cookie thuộc về cùng một tên miền. Chúng không được lưu trong bộ nhớ cache vì HTTP là không trạng thái, điều đó có nghĩa là mọi yêu cầu phải đủ để máy chủ tìm ra phải làm gì với nó. Giả sử bạn có hình ảnh chỉ có thể truy cập bởi một số người dùng nhất định; bạn phải gửi cookie xác thực của mình với mỗi một trong số 50 yêu cầu đó, để máy chủ biết đó là bạn chứ không phải ai khác hoặc khách, trong số các yêu cầu mà nó nhận được.

Có nói rằng, cookie có thể không được gửi với các hạn chế khác được đề cập trong các phản hồi khác, chẳng hạn như cài đặt HTTPS, đường dẫn hoặc tên miền. Đặc biệt ở đó, một điều quan trọng cần lưu ý: cookie không được chia sẻ giữa các tên miền. Điều đó giúp giảm kích thước của các cuộc gọi HTTP cho các tệp tĩnh, chẳng hạn như hình ảnh và tập lệnh bạn đã đề cập.
Ví dụ: bạn có 4 cookie tại www.stackoverflow.com; nếu bạn yêu cầu www.stackoverflow.com/images/logo.png, tất cả 4 cookie đó sẽ được gửi.
Tuy nhiên, nếu bạn yêu cầu stackoverflow.com/images/logo.png(chú ý thay đổi tên miền phụ) hoặc images.stackoverflow.com/logo.png, 4 cookie đó sẽ không xuất hiện - nhưng có thể những cái liên quan đến những tên miền này sẽ.

Bạn có thể đọc thêm về cookie và hình ảnh yêu cầu, ví dụ, tại Bài đăng trên Blog StackOverflow này .


10

Không. Không phải mọi yêu cầu đều gửi cookie. Nó phụ thuộc vào cấu hình cookie và kết nối máy khách-máy chủ.

Ví dụ: nếu securetùy chọn cookie của bạn được đặt thành truethì nó phải được truyền qua kết nối HTTPS an toàn. Có nghĩa là khi bạn thấy trang web đó có giao thức HTTP thì các cookie này sẽ không được gửi bởi trình duyệt vì cờ bảo mật là đúng.


7

Cookie có thuộc tính "đường dẫn". Nếu "đường dẫn = /", câu trả lời là Có.


Có, bạn có thể nhận ra cấu trúc trang web / ứng dụng của mình sao cho tất cả các URL yêu cầu cookie là wthin /app/hoặc tương tự - nó sẽ giữ được tính di động mà không cần các tên miền phụ riêng biệt để loại bỏ chi phí dự phòng. Hoặc bạn có thể bỏ Google Analytics bây giờ vô dụng để bắt đầu. Tôi đã nhìn thấy các tiêu đề cookie rất lâu, tôi tự hỏi liệu bà tôi có đan chúng không.
Jake

7

3 năm đã trôi qua

Có một lý do khác tại sao một trình duyệt sẽ không gửi cookie. Bạn có thể thêm một crossOriginthuộc tính vào <script>thẻ của bạn và giá trị "anonymous". Điều này sẽ ngăn cookie được gửi đến máy chủ đích. 99,9% thời gian, javascripts của bạn là các tệp tĩnh và bạn không tạo mã js dựa trên cookie của yêu cầu. Nếu bạn có 1KB cookie và bạn có 200 tài nguyên trên trang của mình, thì người dùng của bạn đang tải lên 200KB và điều đó có thể mất một chút thời gian trên 3G và không có hiệu lực trên trang kết quả. Truy cập thuộc tính HTML: crossorigin để tham khảo.


Vui lòng giải thích.
Jake

4
@Jake bạn có thể thêm thuộc tính crossOrigin vào thẻ <script> và giá trị thành "ẩn danh". Điều này sẽ ngăn cookie được gửi đến máy chủ đích. 99,9% thời gian, javascripts của bạn là các tệp tĩnh và bạn không tạo mã js dựa trên cookie của yêu cầu. Nếu bạn có 1KB cookie và bạn có 200 tài nguyên trên trang của mình, thì người dùng của bạn đang tải lên 200KB và điều đó có thể mất một chút thời gian trên 3G và không có hiệu lực trên trang kết quả. Truy cập developer.mozilla.org/en-US/docs/Web/HTML/ liệt để tham khảo.
gilm

4

Tôi biết đây là một chủ đề cũ. Nhưng tôi đã nhận thấy rằng hầu hết các trình duyệt sẽ không gửi cookie cho một tên miền nếu bạn thêm dấu chấm. Ví dụ: http://example.com.sẽ không nhận được cookie được đặt cho .example.com. Mặt khác, Apache đối xử với họ như cùng một máy chủ. Tôi thấy điều này hữu ích để làm cho việc theo dõi tên miền chéo trở nên khó khăn hơn đối với các tài nguyên bên ngoài mà tôi đưa vào, nhưng bạn cũng có thể sử dụng nó vì lý do hiệu suất. Lưu ý xác nhận phanh này của httpschứng chỉ. Tôi đã chạy một vài thử nghiệm bằng cách sử dụng ảnh chụp màn hình và các thiết bị của riêng tôi. Bản hack hoạt động trên hầu hết tất cả các trình duyệt ngoại trừ safari (thiết bị di động và máy tính để bàn), sẽ bao gồm cookie trong yêu cầu.


Làm thế nào để "làm cho việc theo dõi tên miền chéo trở nên khó khăn hơn đối với các tài nguyên bên ngoài mà tôi đưa vào"? Bạn đang nói về Farcebook Like và những vật dụng như vậy - mà chúng ta biết theo dõi trình duyệt của người dùng vô tình vẫn đăng nhập?
Jake

Đúng. Nó sẽ làm cho nó khó khăn hơn, bởi vì hầu hết các trình duyệt sẽ không gửi cookie cùng. Vì vậy, nếu bạn bao gồm một cái gì đó từ google.com chẳng hạn và bạn đã đăng nhập vào google, google không thể liên kết hai yêu cầu. Điều này không được đảm bảo khó khăn, dù sao một số trình duyệt đã gửi cookie và có các phương pháp ít tin cậy hơn và ít được sử dụng hơn để xác định người dùng (như Địa chỉ IP) vẫn sẽ hoạt động. Hạn chế lớn nhất là, bạn không thể sử dụng HTTPS, điều này khiến nó trở nên vô dụng ngày nay.
Gellweiler

0

Câu trả lời ngắn gọn là Có. Các dòng dưới đây là từ tài liệu JS

Cookies đã từng được sử dụng để lưu trữ phía khách hàng nói chung. Mặc dù điều này là hợp pháp khi chúng là cách duy nhất để lưu trữ dữ liệu trên máy khách, nhưng hiện tại chúng tôi khuyên bạn nên sử dụng API lưu trữ hiện đại. Cookies được gửi với mọi yêu cầu, vì vậy chúng có thể làm giảm hiệu suất (đặc biệt đối với các kết nối dữ liệu di động).

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.