Tìm hiểu về cookie

Cookie là một phầ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à trang web lưu trữ trên máy của người dùng, thông tin mà trang web 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 dùng để thiết lập những thông tin như ngày hết hạn hoặc chỉ ra 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 pháp có thể dùng để thêm trạng thái cố định vào trang web. Trong những năm qua, các tính năng của họ đã được phát triển và nâng cấp, nhưng nền tảng này vẫn còn một số vấn đề cũ và có vấn đề. Để 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 để thực thi các chế độ mặc định bảo đảm quyền riêng tư hiệu quả hơn.

Cookie đang hoạt động

Giả sử bạn có một blog và muốn hiển thị quảng cáo "Có gì mới" cho người dùng. Người dùng có thể đóng quảng cáo này và sẽ không thấy quảng cáo đó xuất hiện trong một thời gian nữa. Bạn có thể lưu trữ lựa chọn ưu tiên đó trong một cookie, đặt lựa chọn ưu tiên đó hết hạn trong một tháng (2.600.000 giây) và chỉ gửi lựa chọn ưu tiên qua HTTPS. Tiêu đề đó sẽ có dạng như sau:

Set-Cookie: promo_shown=1; Max-Age=2600000; Secure
3 cookie được gửi đến trình duyệt 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ả của bạn xem một trang đáp ứng các yêu cầu đó – họ đang có kết nối bảo mật và cookie chưa đầy một tháng – thì trình duyệt của họ sẽ gửi tiêu đề này trong yêu cầu:

Cookie: promo_shown=1
3 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 sẽ gửi cookie trở lại 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 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ử các thao tác 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ẽ 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"
JavaScript truy cập vào các cookie trong trình duyệt
JavaScript có thể truy cập vào cookie bằng document.cookie.

Nếu bạn thử thực hiện thao tác này trên một số trang web phổ biến, bạn sẽ thấy hầu hết các trang web này chỉ đặt nhiều hơn đáng kể, chứ không chỉ 3 cookie. Trong hầu hết các trường hợp, các cookie đó được gửi theo mọi yêu cầu đến miền đó, điều này có một số ý nghĩa. 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 đối với người dùng của bạn, do đó, chi phí chung đối với tất cả các yêu cầu gửi đi sẽ thêm độ trễ vào thời gian của bạn đối với byte đầu tiên. Hãy thận trọng với số lượng và kích thước cookie bạn đặt. Hãy 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à của bên thứ ba là gì?

Nếu quay lại cùng một lựa chọn các trang web 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ỉ trang bạn đang truy cập. Những cookie khớp với miền của trang web hiện tại, tức là những cookie 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 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à liên quan đến ngữ 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 ở tại thời điểm đó.

3 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
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 chú mèo đặc biệt tuyệt vời và bài đăng đó được lưu trữ tại /blog/img/amazing-cat.png. Vì đây là hình ảnh tuyệt vời nên một người khác sẽ sử dụng nó 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 hình ảnh đó. Điều này không đặc biệt hữu ích cho bất cứ 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 dùng này, nó chỉ làm tăng thêm hao tổn cho yêu cầu.

Nếu đó là tác động ngoài ý muốn, vì sao bạn muốn làm việc này? Cơ chế này cho phép các trang web duy trì trạng thái khi chúng được sử dụng trong ngữ 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, khách truy cập sẽ thấy tuỳ chọn "Xem sau" trong trình phát. Nếu khách truy cập của bạn đã đă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, tức là nút "Xem sau" sẽ chỉ lưu video trong một lượt thay vì nhắc họ đăng nhập hoặc phải chuyển họ ra 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 sẽ được gửi khi truy cập vào các trang khác nhau.

Một trong những đặc điểm văn hoá của web là web thường được mở theo mặc định. Đây là một phần giúp cho rất nhiều người có thể sáng tạo nội dung và ứng dụng của riêng họ ở đó. 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 là người đưa ra yêu cầu. Ví dụ: nếu bạn truy cập 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ẽ sẵn sàng đí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 thao tác như xoá bài đăng hoặc thêm nội dung của riêng chúng.

Người dùng cũng đang hiểu rõ hơn về cách cookie để 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 thông qua cookie. Cookie promo_shown của bạn chỉ nên được gửi trong ngữ 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 được chủ ý ở đó để cung cấp trạng thái đăng nhập trong ngữ 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 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.