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 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. Trong những năm qua, 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 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 nơi bạn muốn hiển thị quảng cáo "Có gì mới" cho người dùng của mình. 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 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ử 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"

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ử 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 các trang web này đều đặt nhiều hơn đáng kể so với chỉ 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 của 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 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 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
Cookie có thể đến từ nhiều miền khác nhau trên cùng 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 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 này, mà chỉ làm tăng thêm mức hao tổn đối với 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? 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 đặc điểm 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 evil.example, thì trình duyệt 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 lòng đính kèm các cookie liên quan. 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 vẫn chưa có cách nào để nêu rõ ý định của bạn bằng 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.