Cookie là một khối dữ liệu được lưu trữ trong trình duyệt, dùng để duy trì trạng thái và thông tin khác mà một trang web cần để thực thi các tính năng của mình.
Cookie là một tệp nhỏ mà các trang web lưu trữ trên máy của người dùng, thông tin mà cookie lưu trữ sẽ di chuyển qua lại giữa trình duyệt và trang web.
Mỗi cookie là một cặp khoá-giá trị cùng với một số thuộc tính kiểm soát thời điểm và vị trí sử dụng cookie đó. Các thuộc tính này được dùng để đặt những thông tin như ngày hết hạn hoặc cho biết cookie chỉ được gửi qua HTTPS. Bạn có thể đặt cookie trong tiêu đề HTTP hoặc thông qua giao diện JavaScript.
Cookie là một trong những phương thức có sẵn để thêm trạng thái liên tục vào các trang web. Trong những năm qua, các tính năng của nền tảng này đã phát triển và hoàn thiện hơn, nhưng vẫn còn một số vấn đề cũ gây nhiều phiền toái. Để giải quyết vấn đề này, các trình duyệt (bao gồm Chrome, Firefox và Edge) đang thay đổi hành vi của mình để thực thi các chế độ mặc định bảo đảm quyền riêng tư hơn.
Cookie trong thực tế
Giả sử bạn có một blog và muốn hiển thị chương trình khuyến mãi "Có gì mới" cho người dùng. Người dùng có thể đóng chương trình khuyến mãi và sau đó sẽ không thấy chương trình này nữa trong một thời gian. Bạn có thể lưu trữ lựa chọn ưu tiên đó trong một cookie, đặt thời gian hết hạn là một tháng (2.600.000 giây) và chỉ gửi qua HTTPS. Tiêu đề đó sẽ có dạng như sau:
Set-Cookie: promo_shown=1; Max-Age=2600000; Secure
Set-Cookie.
Khi độc giả xem một trang đáp ứng các yêu cầu đó (họ đang sử dụng một kết nối an toàn và cookie đã được tạo chưa đến một tháng), trình duyệt của họ sẽ gửi tiêu đề này trong yêu cầu:
Cookie: promo_shown=1
Cookie.
Bạn cũng có thể thêm và đọc các cookie có sẵn cho trang web đó bằng JavaScript thông qua document.cookie. Việc chỉ định cho document.cookie sẽ tạo hoặc ghi đè một cookie bằng khoá đó. Ví dụ: bạn có thể thử những nội dung sau trong bảng điều khiển JavaScript của trình duyệt:
→ document.cookie = "promo_shown=1; Max-Age=2600000; Secure"
← "promo_shown=1; Max-Age=2600000; Secure"
Việc đọc document.cookie sẽ xuất tất cả cookie có thể truy cập trong ngữ cảnh hiện tại, với mỗi cookie được phân tách bằng dấu chấm phẩy:
→ document.cookie;
← "promo_shown=1; color_theme=peachpuff; sidebar_loc=left"
document.cookie.
Nếu thử trên một số trang web phổ biến, bạn sẽ nhận thấy rằng hầu hết các trang web này đều đặt nhiều hơn 3 cookie. Trong hầu hết các trường hợp, những cookie đó được gửi trên mọi yêu cầu đến miền đó, điều này có một số tác động. Băng thông tải lên thường bị hạn chế hơn băng thông tải xuống đối với người dùng của bạn, do đó, chi phí chung cho tất cả các yêu cầu gửi đi sẽ làm tăng độ trễ cho thời gian phản hồi byte đầu tiên. Hãy thận trọng về số lượng và kích thước cookie mà bạn đặt. Hãy sử dụng thuộc tính Max-Age để đảm bảo rằng cookie không tồn tại lâu hơn mức cần thiết.
Cookie của bên thứ nhất và cookie của bên thứ ba là gì?
Nếu quay lại cùng một nhóm trang web mà bạn đã xem trước đó, có lẽ bạn nhận thấy rằng có cookie cho nhiều miền, chứ không chỉ miền mà bạn đang truy cập. Cookie khớp với miền của trang web hiện tại (tức là những gì hiển thị trong thanh địa chỉ của trình duyệt) được gọi là cookie của bên thứ nhất. Tương tự, cookie từ các miền khác với trang web hiện tại được gọi là cookie của bên thứ ba. Đây không phải là nhãn tuyệt đối mà là nhãn tương đối theo bối cảnh của người dùng; cùng một cookie có thể là cookie của bên thứ nhất hoặc bên thứ ba tuỳ thuộc vào trang web mà người dùng đang truy cập tại thời điểm đó.
Tiếp tục ví dụ trước, giả sử một trong các bài đăng trên blog của bạn có hình ảnh một chú mèo đặc biệt đáng yêu và được lưu trữ tại /blog/img/amazing-cat.png. Vì đó là một hình ảnh tuyệt vời, nên một người khác sử dụng trực tiếp hình ảnh đó trên trang web của họ. Nếu khách truy cập đã truy cập vào blog của bạn và có cookie promo_shown, thì khi họ xem amazing-cat.png trên trang web của người khác, cookie đó sẽ được gửi trong yêu cầu đó đối với hình ảnh. Điều này không đặc biệt hữu ích cho bất kỳ ai vì promo_shown không được dùng cho bất kỳ mục đích nào trên trang web của người khác này, mà chỉ làm tăng thêm chi phí cho yêu cầu.
Nếu đó là một hiệu ứng không mong muốn, thì tại sao bạn lại muốn làm điều này? Đây là cơ chế cho phép các trang web duy trì trạng thái khi được dùng trong bối cảnh bên thứ ba. Ví dụ: nếu bạn nhúng một video trên YouTube vào trang web của mình, thì khách truy cập sẽ thấy lựa chọn "Xem sau" trong trình phát. Nếu khách truy cập đã đăng nhập vào YouTube, thì cookie của bên thứ ba sẽ cung cấp phiên đó trong trình phát được nhúng. Điều này có nghĩa là nút "Xem sau" sẽ chỉ lưu video trong một lần thay vì nhắc họ đăng nhập hoặc phải điều hướng họ ra khỏi trang của bạn và quay lại YouTube.
Một trong những đặc tính văn hoá của web là nó có xu hướng mở theo mặc định. Đây là một phần của những yếu tố giúp nhiều người có thể tạo nội dung và ứng dụng của riêng mình trên nền tảng này. Tuy nhiên, điều này cũng gây ra một số lo ngại về bảo mật và quyền riêng tư. Các cuộc tấn công giả mạo yêu cầu trên nhiều trang web (CSRF) dựa vào thực tế là cookie được đính kèm vào mọi yêu cầu đối với một nguồn gốc nhất định, bất kể ai khởi tạo yêu cầu. Ví dụ: nếu bạn truy cập vào evil.example, thì yêu cầu có thể được kích hoạt đến your-blog.example và trình duyệt của bạn sẽ vui vẻ đính kèm các cookie được liên kết. Nếu blog của bạn không cẩn thận với cách xác thực các yêu cầu đó, thì evil.example có thể kích hoạt các hành động như xoá bài đăng hoặc thêm nội dung của riêng họ.
Người dùng cũng ngày càng nhận thức rõ hơn về cách cookie có thể được dùng để theo dõi hoạt động của họ trên nhiều trang web. Tuy nhiên, cho đến nay, vẫn chưa có cách nào để nêu rõ ý định của bạn đối với cookie. Cookie promo_shown của bạn chỉ được gửi trong bối cảnh của bên thứ nhất, trong khi cookie của phiên cho một tiện ích được dùng để nhúng trên các trang web khác sẽ được đặt ở đó một cách có chủ ý để cung cấp trạng thái đã đăng nhập trong bối cảnh của bên thứ ba.
Bạn có thể nêu rõ ý định của mình bằng một cookie bằng cách đặt thuộc tính SameSite thích hợp.
Để xác định cookie của bên thứ nhất và đặt các thuộc tính phù hợp, hãy xem Các công thức về cookie của bên thứ nhất.