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
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
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"
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 đó.
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.
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.