Tìm hiểu về cookie

Cookie là một phần dữ liệu được lưu trữ trong trình duyệt, dùng để duy trì trạng thái và các thông tin khác mà trang web cần để thực thi các tính năng của nó.

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ữ được 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 ổn định vào trang web. Qua nhiều năm, các tính năng này đã phát triển và tiến hoá, nhưng vẫn để lại một số vấn đề cũ cho nền tảng. Để giải quyết vấn đề này, các trình duyệt (bao gồm cả 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 vệ 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ị thông tin quảng bá "Tính năng mới" cho người dùng. Người dùng có thể đóng quảng cáo và sau đó họ sẽ không thấy quảng cáo đó trong một khoảng thời gian. Bạn có thể lưu trữ lựa chọn ưu tiên đó trong một cookie, đặt cookie đó hết hạn sau một tháng (2.600.000 giây) và chỉ gửi cookie đó qua HTTPS. Tiêu đề đó sẽ có dạng như sau:

Set-Cookie: promo_shown=1; Max-Age=2600000; Secure
Ba cookie được gửi đến trình duyệt từ máy chủ trong một phản hồi
Các máy chủ đặt cookie bằng tiêu đề Set-Cookie.

Khi người đọc xem một trang đáp ứng các yêu cầu đó (tức là họ đang sử dụng một kết nối bảo mật và cookie có thời gian tồn tại dưới 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
Ba cookie được gửi từ trình duyệt đến máy chủ trong một yêu cầu
Trình duyệt của bạn gửi lại cookie trong tiêu đề Cookie.

Bạn cũng có thể thêm và đọc các cookie có sẵn cho trang web đó trong JavaScript bằng cách sử dụng document.cookie. Việc chỉ định cho document.cookie sẽ tạo hoặc ghi đè cookie bằng khoá đó. Ví dụ: bạn có thể thử làm như 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 ra tất cả các cookie có thể truy cập được 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"
JavaScript truy cập vào cookie trong trình duyệt
JavaScript có thể truy cập vào cookie bằng document.cookie.

Nếu thử nghiệm điều này 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 đó đặt nhiều cookie hơn đáng kể so với 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ế nhiều hơn so với băng thông tải xuống đối với người dùng, do đó, hao tổn trên tất cả các yêu cầu gửi đi sẽ làm tăng độ trễ về thời gian tải đến byte đầu tiên. Hãy tiết kiệm số lượng và kích thước cookie mà bạn đặt. 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à bên thứ ba là gì?

Nếu quay lại cùng một lựa chọn trang web mà bạn đã xem trước đó, bạn có thể 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à nội dung 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ông phải là 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à tương đối với bối cảnh của người dùng; cùng một cookie có thể là 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 đó.

Ba cookie được gửi đến trình duyệt từ các yêu cầu khác nhau trên cùng một trang
Các cookie có thể đến từ nhiều miền khác nhau trên một trang.

Tiếp tục ví dụ ở trên, giả sử một trong các bài đăng trên blog của bạn có một bức ảnh về 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 hình ảnh đó ngay trên trang web của họ. Nếu một 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 đó cho 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, mà chỉ làm tăng chi phí cho yêu cầu.

Nếu đó là hiệu ứng ngoài mong muốn, tại sao bạn lại muốn làm như vậy? Cơ chế này cho phép các trang web duy trì trạng thái khi đang được sử dụng trong bối cảnh của 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ì người dùng 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ì phiên đó sẽ được cung cấp trong trình phát được nhúng bằng cookie của bên thứ ba. Điều này có nghĩa là nút "Xem sau" sẽ chỉ lưu video ngay lập tức thay vì nhắc họ đăng nhập hoặc phải rời khỏi trang của bạn và quay lại YouTube.

Cùng một cookie được gửi trong 3 ngữ cảnh khác nhau
Một cookie trong bối cảnh bên thứ ba được gửi khi truy cập vào các trang khác nhau.

Một trong những thuộc tính văn hoá của web là web thường mở theo mặc định. Đây là một trong những lý do khiến nhiều người có thể tạo nội dung và ứng dụng của riêng họ trên đó. Tuy nhiên, điều này cũng đã gây ra một số vấn đề 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 trên thực tế là cookie được đính kèm vào bất kỳ yêu cầu nào đến 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ì thao tác này có thể kích hoạt các yêu cầu đế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 blog.

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, chưa có cách nào để nêu rõ ý định của bạn đối với cookie. Bạn chỉ nên gửi cookie promo_shown trong bối cảnh của bên thứ nhất, trong khi cookie phiên cho một tiện ích được nhúng trên các trang web khác là để 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 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 thích hợp, hãy xem Công thức cookie của bên thứ nhất.