Sự khác biệt giữa cookie phía máy chủ và cookie phía máy khách là gì?


120

Sự khác biệt giữa việc tạo cookie trên máy chủ và trên máy khách là gì? Chúng được gọi là cookie phía máy chủ và cookie phía máy khách? Có cách nào để tạo cookie chỉ có thể đọc trên máy chủ hoặc trên máy khách không?


15
Không có cái gọi là "cookie phía máy chủ" và "cookie phía máy khách". Chỉ có cookie, cặp tên / giá trị được gửi trong tiêu đề HTTP với cả yêu cầu và phản hồi.
Dan Grossman

1
Có thể tham chiếu đến các biến Phiên, giữ dữ liệu trên máy chủ. Thông thường vẫn có một số nhận dạng phiên được giữ dưới dạng cookie phía máy khách.
AndrewR

Trong tất cả các khả năng, câu hỏi đề cập đến các cách khác nhau cookie được mã hóa ở phía máy chủ (tức là cách chúng được mã hóa trong tiêu đề phản hồi 'Cookie' và 'Set-Cookie') và ở phía máy khách (tức là cách chúng được mã hóa trong tiêu đề yêu cầu 'Cookie' - biến $ Path và tất cả những thứ đó). Xem RFC 2109
Ophir Radnitz

Câu trả lời:


146

MÓN QUAY HTTP

Cookie là cặp khóa / giá trị được các trang web sử dụng để lưu trữ thông tin trạng thái trên trình duyệt. Giả sử bạn có một trang web (example.com), khi trình duyệt yêu cầu một trang web, trang web có thể gửi cookie để lưu trữ thông tin trên trình duyệt.

Ví dụ về yêu cầu trình duyệt:

GET /index.html HTTP/1.1
Host: www.example.com

Câu trả lời ví dụ từ máy chủ:

HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: foo=10
Set-Cookie: bar=20; Expires=Fri, 30 Sep 2011 11:48:00 GMT
... rest  of the response

Ở đây hai cookie foo = 10 và bar = 20 được lưu trữ trên trình duyệt. Cái thứ hai sẽ hết hạn vào ngày 30 tháng 9. Trong mỗi yêu cầu tiếp theo, trình duyệt sẽ gửi cookie trở lại máy chủ.

GET /spec.html HTTP/1.1
Host: www.example.com
Cookie: foo=10; bar=20
Accept: */*

SESSIONS: Cookie phía máy chủ

Cookie phía máy chủ được gọi là "phiên". Trang web trong trường hợp này lưu trữ một cookie duy nhất trên trình duyệt có chứa Mã nhận dạng phiên duy nhất. Thông tin trạng thái (foo = 10 và bar = 20 ở trên) được lưu trữ trên máy chủ và Mã định danh phiên được sử dụng để khớp yêu cầu với dữ liệu được lưu trữ trên máy chủ.

Ví dụ về cách sử dụng

Bạn có thể sử dụng cả phiên và cookie để lưu trữ: dữ liệu xác thực, tùy chọn người dùng, nội dung của biểu đồ trong trang web thương mại điện tử, v.v.

Ưu và nhược điểm

Dưới đây là ưu và nhược điểm của các giải pháp. Đây là những thứ đầu tiên xuất hiện trong đầu tôi, chắc chắn còn có những người khác.

Ưu điểm về Cookie:

  • khả năng mở rộng: tất cả dữ liệu được lưu trữ trong trình duyệt để mỗi yêu cầu có thể đi qua bộ cân bằng tải đến các máy chủ web khác nhau và bạn có tất cả thông tin cần thiết để điền đầy đủ yêu cầu;
  • chúng có thể được truy cập thông qua javascript trên trình duyệt;
  • không ở trên máy chủ, họ sẽ sống sót khi máy chủ khởi động lại;
  • RESTful: yêu cầu không phụ thuộc vào trạng thái máy chủ

Nhược điểm của Cookie:

Ưu điểm phiên:

  • nói chung là dễ sử dụng hơn, trong PHP có lẽ không có nhiều sự khác biệt.
  • bộ nhớ không giới hạn

Nhược điểm của phiên:

  • khó mở rộng hơn
  • khi khởi động lại máy chủ web, bạn có thể mất tất cả các phiên hoặc không tùy thuộc vào việc triển khai
  • không RESTful

ưu phiên secure:?
user2167582

1
tại sao các phiên lại an toàn hơn? Nếu bạn gửi cookie phiên qua http, nó có thể bị tấn công. Nếu trang web sử dụng https an ninh nên được giống như miễn là bạn sử dụng các tập tin cookie an toàn (mã hóa, ký kết, vv ...)
Filippo

1
Nhược điểm của cookie: làm cho mỗi yêu cầu lớn hơn, có khả năng ảnh hưởng đến hiệu suất. Tôi không biết những con số nhưng vì mọi người sử dụng miền không có cooki cho những thứ tôi cho rằng nó không tầm thường.
maniexx

5
Câu trả lời gây hiểu lầm lớn - phiên không phải là cookie. vi.wikipedia.org/wiki/Hypertext_Transfer_Protocol#HTTP_session Bạn có thể có các biến phiên, tùy thuộc vào cách thực hiện quản lý phiên trên máy chủ. Bạn thường có một hoặc nhiều cookie liên quan đến quản lý phiên, bằng cách giữ mã định danh phiên. Ngoài ra REST và RESTful không liên quan gì đến cookie hoặc quản lý phiên - Việc triển khai REST và RESTful có thể có phiên và cookie.
Zlatin Zlatev

2
Xem stackoverflow.com/questions/35054840/… Tôi không nói rằng các phiên thường không được triển khai bằng cookie, nhưng có các tùy chọn khác để quản lý phiên, do đó, thật sai lầm khi nói về các biến phiên dưới dạng cookie phía máy chủ. Tôi cũng đề cập đến JWT khi tôi nói vào năm 2017 trong nhận xét ở trên rằng "Triển khai REST và RESTful có thể có phiên và cookie". Mặc dù một số người theo chủ nghĩa thuần túy có thể cho rằng đây không phải là cách thích hợp để triển khai API REST.
Zlatin Zlatev

57

Có thể ý bạn là sự khác biệt giữa cookie Http Only và phần truy cập của chúng?

Http Chỉ không thể truy cập cookie (đọc từ hoặc ghi vào) bằng JavaScript phía máy khách, chỉ phía máy chủ. Nếu cờ Http Only không được đặt hoặc cookie được tạo trong JavaScript (phía máy khách), cookie có thể được đọc và ghi vào JavaScript (phía máy khách) cũng như phía máy chủ.


38

Tất cả cookie là máy khách máy chủ

Không có sự khác biệt. Một cookie thông thường có thể được đặt phía máy chủ hoặc phía máy khách. Cookie 'cổ điển' sẽ được gửi lại theo từng yêu cầu. Một cookie do máy chủ đặt, sẽ được gửi đến máy khách trong một phản hồi. Máy chủ chỉ gửi cookie khi nó được thiết lập hoặc thay đổi rõ ràng, trong khi máy khách gửi cookie theo từng yêu cầu.

Nhưng về cơ bản nó là cùng một cookie.

Nhưng, hành vi có thể thay đổi

Về cơ bản cookie là một name=valuecặp, nhưng sau giá trị có thể là một loạt các thuộc tính được phân tách bằng dấu chấm phẩy ảnh hưởng đến hành vi của cookie nếu nó được triển khai bởi máy khách (hoặc máy chủ). Các thuộc tính đó có thể là về thời gian tồn tại, ngữ cảnh và các cài đặt bảo mật khác nhau.

Chỉ HTTP (không chỉ dành cho máy chủ)

Một trong những thuộc tính đó có thể được máy chủ đặt để chỉ ra rằng đó là cookie chỉ HTTP. Điều này có nghĩa là cookie vẫn được gửi đi gửi lại, nhưng nó sẽ không khả dụng trong JavaScript. Tuy nhiên, hãy lưu ý rằng cookie vẫn còn ở đó! Đó chỉ là một biện pháp bảo vệ được tích hợp sẵn trong trình duyệt, nhưng nếu ai đó sử dụng một trình duyệt cũ đến mức nực cười như IE5 hoặc một ứng dụng khách tùy chỉnh nào đó, họ thực sự có thể đọc được cookie!

Vì vậy, có vẻ như có 'cookie máy chủ', nhưng thực tế không có. Những cookie đó vẫn được gửi đến khách hàng. Trên máy khách, không có cách nào để ngăn cookie được gửi đến máy chủ.

Các giải pháp thay thế để đạt được 'only-ness'

Nếu bạn chỉ muốn lưu trữ một giá trị trên máy chủ hoặc chỉ trên máy khách, thì bạn cần một số loại lưu trữ khác, như tệp hoặc cơ sở dữ liệu trên máy chủ hoặc Bộ nhớ cục bộ trên máy khách.


chào, tôi rất mới với những khái niệm này và có một số nghi ngờ. Tôi xin lỗi, câu hỏi của tôi nghe có vẻ ngớ ngẩn nhưng tôi vẫn sẽ hỏi. Bất kỳ trợ giúp nào, đều được đánh giá cao - Một cookie, đã được đặt ở phía khách hàng, có thể được gửi đến bất kỳ miền nào không? Ý tôi là, đó không phải là một mối đe dọa an ninh? Ngoài ra, nó hoạt động như thế nào với các ứng dụng khách không phải là trình duyệt, như API, v.v.?
Karan Chadha

1
Xin chào @KaranChadha, nếu bạn có câu hỏi, vui lòng đặt câu hỏi dưới dạng câu hỏi chính thức bằng cách sử dụng nút 'Đặt câu hỏi' ở đầu trang. Một chủ đề bình luận về một câu hỏi 7 năm tuổi có lẽ sẽ không thu hút được sự chú ý thích hợp đến nó. Tất nhiên, việc thêm liên kết đến câu hỏi và câu trả lời này hoặc thậm chí cụ thể là câu trả lời này. Bạn có thể sử dụng nút 'chia sẻ' ở cuối mỗi bài đăng cho việc đó.
GolezTrol

Điều này có đúng không? Cookie do khách hàng tạo dường như không được chuyển. Nếu làm document.cookie="foo=bar"theo sau fetch("/foobar", {credentials: 'include'} )thì không có cookie nào được gửi có chứa foo=bar. Chỉ cần thử mã đó trực tiếp trên trang web này bằng DevTools và bảng điều khiển.
oligofren

Đúng, nó đúng, tài liệu cũng nói , nhưng có một số chi tiết cụ thể có thể gây ra điều này, như thuộc tính hết hạn bị thiếu.
GolezTrol

1
@MarinosAn Có nó có thể. Nhưng câu trả lời của tôi hơi ngắn gọn khi nói đến các thuộc tính sửa đổi hành vi của cookie, vì vậy tôi đã mở rộng nó một chút ngay bây giờ.
GolezTrol

4
  1. Có, bạn có thể tạo cookie chỉ có thể được đọc ở phía máy chủ. Chúng được gọi là -cookies "Chỉ HTTP", như đã giải thích trong các câu trả lời khác

  2. Không, không có cách nào (tôi biết) để tạo "cookie" chỉ có thể đọc ở phía máy khách. Cookie nhằm tạo điều kiện giao tiếp giữa máy khách và máy chủ.

  3. NHƯNG, nếu bạn muốn một thứ gì đó THÍCH "client-only-cookies" thì có một câu trả lời đơn giản: Sử dụng "Local Storage".

Local Storage thực sự đơn giản hơn về mặt cú pháp so với cookie. Bạn có thể tìm thấy một bản tóm tắt đơn giản tốt về cookie so với lưu trữ cục bộ tại:

https://courses.cs.washington.edu/courses/cse154/12au/lectures/slides/lecture21-client-storage.shtml#slide8

Một điểm: Bạn có thể sử dụng cookie được tạo bằng JavaScript để lưu trữ những thứ liên quan đến GUI mà bạn chỉ cần ở phía máy khách. NHƯNG cookie được gửi đến máy chủ cho MỌI yêu cầu được thực hiện, nó trở thành một phần của tiêu đề http-request, do đó làm cho yêu cầu chứa nhiều dữ liệu hơn và do đó gửi chậm hơn.

Nếu trang của bạn có 50 tài nguyên như hình ảnh và tệp css và tập lệnh thì cookie sẽ được gửi (thường) theo mỗi yêu cầu. Thông tin thêm về điều này trong Mọi yêu cầu web đều gửi cookie của trình duyệt?

Lưu trữ cục bộ không có những nhược điểm liên quan đến truyền dữ liệu, nó không gửi dữ liệu. Nó thật tuyệt.

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.