Công thức làm bánh quy của bên thứ nhất

Tìm hiểu cách đặt cookie của bên thứ nhất để đảm bảo tính bảo mật, khả năng tương thích trên nhiều trình duyệt và giảm thiểu nguy cơ bị lỗi sau khi cookie của bên thứ ba bị loại bỏ.

Cookie có thể là cookie của bên thứ nhất hoặc bên thứ ba tuỳ theo bối cảnh của người dùng, tuỳ thuộc vào trang web mà người dùng đang truy cập. Nếu miền và giao thức có thể đăng ký của cookie khớp với trang cấp cao nhất hiện tại, tức là nội dung hiển thị trong thanh địa chỉ của trình duyệt, thì cookie đó được xem là đến từ cùng một trang web với trang và thường được gọi là cookie của bên thứ nhất.

Cookie từ các miền không phải trang web hiện tại thường được gọi là cookie của bên thứ ba.

Nếu cookie bạn đang đặt không được sử dụng trên các trang web, chẳng hạn như cookie được dùng để quản lý các phiên trên trang web của bạn và không bao giờ được dùng trong iframe trên nhiều trang web, thì cookie đó luôn được dùng trong bối cảnh bên thứ nhất.

Theo mặc định, cookie có thể được chia sẻ giữa các trang web, được JavaScript truy cập và được gửi qua kết nối HTTP, điều này đi kèm với một số rủi ro về quyền riêng tư và bảo mật. Mặc dù vẫn đang trong quá trình cải thiện hành vi mặc định, thông qua Hộp cát về quyền riêng tư và các đề xuất khác như cookie liên kết với nguồn gốc, bạn có thể làm rất nhiều việc để làm ngay hôm nay bằng cách đặt các thuộc tính bổ sung vào cookie của mình.

Cấu hình sau đây là phương pháp hay nhất để đảm bảo tính bảo mật và khả năng tương thích trên nhiều trình duyệt cho hầu hết cookie của bên thứ nhất. Việc này sẽ cung cấp cho bạn một nền tảng an toàn. Bạn có thể điều chỉnh nền tảng này để chỉ cấp quyền khi cần thiết. Bài viết này cũng đề cập đến các biến thể công thức nấu ăn cho một số trường hợp sử dụng cụ thể.

Công thức

Set-Cookie:
__Host-cookie-name=cookie-value;
Secure;
Path=/;
HttpOnly;
Max-Age=7776000;
SameSite=Lax;
Thông tin chi tiết

Host là một tiền tố không bắt buộc, khiến một số thuộc tính trở nên bắt buộc và bị cấm các thuộc tính khác:

  • Bắt buộc phải có Secure
  • Phải bỏ qua Domain
  • Path phải là /

Khi thêm Host, bạn có thể dựa vào trình duyệt để kiểm tra xem các thuộc tính này đã được đặt theo quy tắc __Host hay chưa và từ chối cookie nếu không.

Secure bảo vệ cookie khỏi bị đánh cắp trên các mạng không an toàn vì ứng dụng này chỉ cho phép gửi cookie qua kết nối HTTPS. Nếu bạn chưa di chuyển hoàn toàn trang web của mình sang HTTPS, hãy ưu tiên việc đó.

Thuộc tính Domain chỉ định máy chủ nào có thể nhận cookie. Nếu không, cookie sẽ chỉ được gửi đến máy chủ lưu trữ tài liệu hiện tại, ngoại trừ miền con: cookie cho example.com sẽ được gửi theo mọi yêu cầu đến example.com chứ không phải theo các yêu cầu đến images.example.com. Nếu bạn có nhiều ứng dụng chạy trên các miền con khác nhau, thì điều này sẽ làm giảm nguy cơ một miền bị xâm phạm cho phép truy cập vào các miền khác.

Path cho biết đường dẫn phải tồn tại trong URL được yêu cầu để trình duyệt gửi tiêu đề Cookie. Nếu bạn đặt Path=/, cookie sẽ được gửi đến tất cả đường dẫn URL trên miền đó. Việc kết hợp không có DomainPath=/ sẽ khiến cookie được liên kết với nguồn gốc một cách chặt chẽ nhất có thể, vì vậy, cookie này sẽ hoạt động tương tự như cách lưu trữ phía máy khách khác, chẳng hạn như LocalStorage. Đừng nhầm lẫn khi example.com/a có thể nhận các giá trị khác nhau cho example.com/b.

Thuộc tính HttpOnly bổ sung một số biện pháp bảo vệ khỏi các tập lệnh độc hại của bên thứ ba trên trang web của bạn bằng cách hạn chế quyền truy cập vào JavaScript. Phương thức này chỉ cho phép gửi cookie trong tiêu đề của yêu cầu và ngừng cho phép JavaScript sử dụng document.cookie.

Max-Age giới hạn vòng đời của cookie vì các phiên trình duyệt có thể kéo dài trong một khoảng thời gian khá dài và bạn không muốn các cookie cũ tồn tại mãi. Bạn nên sử dụng cookie này cho những cookie ngắn hạn, chẳng hạn như phiên hoạt động của người dùng hoặc thậm chí là các cookie ngắn hơn (chẳng hạn như mã thông báo để gửi biểu mẫu). Max-Age được xác định bằng giây và trong ví dụ trước, nó được đặt thành 7776000 giây, tức là 90 ngày. Đây là chế độ mặc định hợp lý và bạn có thể thay đổi tuỳ theo trường hợp sử dụng của mình.

SameSite=Lax hạn chế việc cookie chỉ được gửi theo các yêu cầu trên cùng trang web. Tức là yêu cầu khớp với ngữ cảnh duyệt web hiện tại – trang web cấp cao nhất mà người dùng hiện đang truy cập được hiển thị trên thanh vị trí. SameSite=Lax là chế độ mặc định trong các trình duyệt hiện đại. Tuy nhiên, bạn nên chỉ định chế độ này để tương thích trên nhiều trình duyệt (có thể có các giá trị mặc định khác nhau). Bằng việc đánh dấu một cách rõ ràng cookie là chỉ dành cho cùng một trang web, bạn đang hạn chế cookie này trong bối cảnh bên thứ nhất của mình và bạn không cần phải thay đổi cookie đó khi cookie của bên thứ ba biến mất.

Để tìm hiểu thêm về các thuộc tính cookie khác nhau, hãy xem tài liệu Set-Cookie về MDN.

Nếu bạn có một trang web có miền con và muốn có một phiên hoạt động trên tất cả các miền con đó, thì tiền tố Host có thể là quá hạn chế. Ví dụ: news.site có thể có miền con cho các chủ đề, chẳng hạn như finance.news.sitesport.news.site và bạn muốn có một phiên người dùng trên tất cả các chủ đề đó. Trong trường hợp đó, hãy sử dụng tiền tố __Secure thay vì __Host và chỉ định Domain.

Công thức

Set-Cookie:
__Secure-cookie-name=cookie-value;
Secure;
Domain=news.site;
Path=/;
HttpOnly;
Max-Age=7776000;
SameSite=Lax;
Thông tin chi tiết

Secure là một tiền tố không bắt buộc xác nhận ít yêu cầu hơn Host: tiền tố này chỉ yêu cầu đặt cookie bằng thuộc tính Secure.

Mặc dù cookie SameSite=Lax không được gửi theo các yêu cầu phụ trên nhiều trang web (ví dụ: khi tải hình ảnh hoặc iframe được nhúng trên trang web của bên thứ ba), nhưng cookie được gửi khi người dùng đang điều hướng đến trang web gốc (ví dụ: khi truy cập đường liên kết từ một trang web khác).

Bạn có thể hạn chế hơn nữa quyền truy cập vào cookie và không cho phép gửi những cookie này cùng với các yêu cầu được đưa ra từ trang web của bên thứ ba thông qua SameSite=Strict. Điều này rất hữu ích khi bạn có cookie liên quan đến chức năng luôn ở sau điều hướng ban đầu, chẳng hạn như thay đổi mật khẩu hoặc mua hàng.

Công thức

Set-Cookie:
__Host-cookie-name=cookie-value;
Secure;
Path=/;
HttpOnly;
Max-Age=7776000;
SameSite=Strict;