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

Tìm hiểu cách thiết lập cookie của bên thứ nhất để đảm bảo tính bảo mật, khả năng tương thích với 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à 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 việc người dùng đang truy cập vào trang web nào tại thời điểm đó. Nếu miền và lượ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à thông tin hiển thị trong thanh địa chỉ của trình duyệt, thì cookie đó sẽ được coi 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.

Ví dụ: nếu cookie bạn đang cài đặt không được dùng để quản lý các phiên hoạt động 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 đó sẽ luôn được dùng trong ngữ 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 cũng dẫn đến một số rủi ro về quyền riêng tư và bảo mật. Mặc dù chúng ta vẫn đang nỗ lực 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 giới hạn nguồn gốc, bạn hiện có thể làm được rất nhiều việc bằng cách thiết lập các thuộc tính bổ sung cho 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. Tài khoản này sẽ cung cấp cho bạn một nền tảng an toàn mà bạn có thể điều chỉnh để chỉ cấp quyền khi cần. Bài viết này cũng đề cập đến các biến thể của 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;
Chi tiết

Host là tiền tố không bắt buộc, bắt buộc phải có một số thuộc tính và cấm các thuộc tính khá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ó được thiết lập tuân theo quy tắc __Host hay không và từ chối cookie nếu không.

Secure bảo vệ cookie không bị đánh cắp trên 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. Việc bỏ qua cookie sẽ hạn chế cookie trê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, nhưng không được gử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, điều này sẽ làm giảm nguy cơ một miền bị xâm nhập và 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. Việc đặt Path=/ có nghĩa là cookie sẽ được gửi đến tất cả các đường dẫn URL trên miền đó. Sự kết hợp không có DomainPath=/ khiến cookie liên kết với nguồn gốc chặt chẽ nhất có thể, vì vậy, cookie này sẽ hoạt động tương tự như các bộ nhớ phía máy khách khác, chẳng hạn như LocalStorage. Không có gì nhầm lẫn khi example.com/a có thể nhận các giá trị khác nhau với 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. API này chỉ cho phép gửi cookie trong tiêu đề của yêu cầu và khô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 hoạt động của trình duyệt có thể kéo dài khá lâu và bạn sẽ không muốn sử dụng cookie cũ mãi mãi. Phù hợp với các cookie ngắn hạn, chẳng hạn như phiên của người dùng hoặc thậm chí cả các cookie ngắn 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, giá trị này được thiết lập thành 7776000 giây, tức là 90 ngày. Đây là một chế độ mặc định hợp lý và bạn có thể thay đổi theo trường hợp sử dụng của mình.

SameSite=Lax giới hạn để cookie chỉ được gửi trong các yêu cầu trên cùng một trang web. Tức là khi 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 đang truy cập sẽ xuất hiện trên thanh vị trí của họ. SameSite=Lax là giá trị mặc định trong các trình duyệt hiện đại, nhưng bạn nên chỉ định thuộc tính này để tương thích trên các trình duyệt có thể có nhiều chế độ mặc định. Bằng cách đánh dấu rõ ràng cookie này là chỉ cùng một trang web, bạn sẽ giới hạn cookie này ở bối cảnh của bên thứ nhất 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, hãy xem tài liệu về Set-Cookie về MDN.

Nếu bạn sở hữu một trang web có các miền con và muốn có một phiên trên tất cả các miền con đó, thì tiền tố Host có thể 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;
Chi tiết

Secure là tiền tố không bắt buộc giúp khẳng định í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 được nhúng hoặc iframe trên trang web của bên thứ ba), nhưng cookie này vẫn được gửi khi người dùng chuyển đến trang web gốc (ví dụ: khi truy cập một đườ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 cookie cùng với các yêu cầu được đưa ra từ các trang web của bên thứ ba bằng SameSite=Strict. Điều này rất hữu ích khi bạn có các cookie liên quan đến chức năng sẽ luôn nằm trong đ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;