Tìm hiểu về cookie

Cookie là một đoạn dữ liệu được lưu trữ trong trình duyệt được 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 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ữ được truyề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 giúp kiểm soát thời điểm và vị trí mà cookie đó được sử dụng. Các thuộc tính này dùng để đặt những thông tin như ngày hết hạn hoặc chỉ báo chỉ nên gửi cookie 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 các phương thức hiện có để thêm trạng thái cố định vào các trang web. Qua nhiều năm, các chức năng của họ đã lớn mạnh, nhưng vẫn tồn tại một số vấn đề cũ gây ra vấn đề trên nền tảng YouTube. Để 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 cách hoạt động để thực thi nhiều chế độ mặc định bảo đảm quyền riêng tư hơn.

Cookie đang hoạt động

Giả sử bạn có một blog tại đó bạn muốn hiển thị phần "Có gì mới" CANNOT TRANSLATE người dùng. Người dùng có thể loại bỏ 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, rồi đặt để lựa chọn này hết hạn sau một tháng (2.600.000 giây) và chỉ gửi qua HTTPS. Tiêu đề đó sẽ có dạng sau:

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

Khi độc giả xem một trang đáp ứng những yêu cầu đó—họ sẽ truy cập kết nối bảo mật và cookie mới ra mắt chưa đầy 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 sẽ 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 giao bài tập cho document.cookie sẽ tạo hoặc ghi đè cookie bằng khoá đó. Ví dụ: bạn có thể thử các cách 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"

Thao tác đọc document.cookie sẽ cho ra tất cả cookie có thể truy cập trong hiện tại ngữ cảnh, 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ử làm cách 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 họ đã đặt nhiều hơn đáng kể so với chỉ 3 cookie. Trong hầu hết các trường hợp, đó là và cookie được gửi đi trên mọi yêu cầu đơn lẻ đến miền đó, miền đó có số lần truy cập tác động của từng thay đổi. Băng thông tải lên thường bị hạn chế hơn so với băng thông tải xuống cho người dùng, do đó, việc hao tổn tài nguyên đối với tất cả các yêu cầu gửi đi sẽ làm tăng độ trễ thời gian của bạn cho byte đầu tiên. Hãy thận trọng về số lượng và kích thước cookie bạn đặt. Nhãn hiệu việc sử dụng thuộc tính Max-Age để giúp đảm bảo rằng cookie không bị treo 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 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 khác nhau chỉ trang bạn đang truy cập. Các cookie khớp với miền của trang web hiện tại, tức là những nội dung hiển thị trong thanh địa chỉ của trình duyệt được tham chiếu dưới dạng cookie của bên thứ nhất. Tương tự, cookie từ các tên miền khác với trang web hiện tại được gọi là cookie của bên thứ ba. Chỉ số này không tuyệt đối nhưng có liên quan đến ngữ cảnh của người dùng; cùng một cookie có thể là 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 vào thời điểm đó.

Ba cookie được gửi đến một trình duyệt từ các yêu cầu khác nhau trên cùng một trang
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ó hình ảnh của một con mèo đặc biệt kỳ thú trong đó và được lưu trữ tại /blog/img/amazing-cat.png. Vì đây là một hình ảnh tuyệt vời, một người khác sử dụng ngay trên trang web của họ. Nếu khách truy cập vào blog của bạn và có promo_shown cookie, thì khi họ xem amazing-cat.png trên cookie khác của người đó mà cookie sẽ được gửi trong yêu cầu hình ảnh đó. Chiến dịch này không đặc biệt hữu ích với 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 chỉ làm tăng thêm chi phí cho yêu cầu.

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

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

Một trong những đặc tính văn hoá của web là trang web thường được mở mặc định. Đây là một phần đã giúp rất nhiều người sáng tạo ra nội dung và ứng dụng của riêng họ ở đó. Tuy nhiên, điều này cũng đã mang lại nhiều các 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 vào việc cookie được gắn liền với mọi yêu cầu đến một nguồn gốc nhất định, bất kể người khởi tạo yêu cầu. Ví dụ: nếu bạn truy cập evil.example thì ứng dụng có thể kích hoạt yêu cầu vào your-blog.example và trình duyệt của bạn sẽ sẵn lòng đính kèm cookie liên quan. Nếu blog của bạn không cẩn thận về cách xác thực những kết quả đó các yêu cầu thì evil.example có thể kích hoạt các hành động như xóa bài đăng hoặc thêm nội dung của chính họ.

Người dùng cũng nhận thức được nhiều hơn về cách cookie có thể được sử dụng để theo dõi các cuộc trò chuyện trên nhiều trang web. Tuy nhiên, cho đến bây giờ, vẫn chưa có cách nào để nêu rõ ý định của bạn bằng cookie. Cookie promo_shown của bạn sẽ chỉ được gửi trong bối cảnh 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à có chủ đích ở đó để cung cấp trong bối cảnh 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 phù hợp, hãy xem bài viết Công thức làm bánh quy của bên thứ nhất.