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 khả năng 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ỳ thuộc vào 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 tại thời điểm đó. 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 coi là thuộc cùng 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ác vớ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 mà bạn đang đặt không được sử dụng trên các trang web, tức là 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 ngữ cảnh của bên thứ nhất.

Theo mặc định, cookie có thể được chia sẻ trên các trang web, truy cập bằng JavaScript và gửi qua kết nối HTTP, điều này có một số rủi ro về quyền riêng tư và bảo mật. Mặc dù chúng tôi vẫn đang nỗ lực cải thiện hành vi mặc định, nhưng 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 được nhiều việc ngay hôm nay bằng cách đặt các thuộc tính bổ sung trên cookie.

Bạn nên sử dụng cấu hình sau đây để đả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 các cookie của bên thứ nhất. Phương pháp 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ô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;

Host là một tiền tố không bắt buộc, giúp một số thuộc tính trở thành bắt buộc và 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à /

Sau 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 theo quy tắc __Host hay không 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ì 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 sang HTTPS, hãy ưu tiên việc này.

Thuộc tính Domain chỉ định máy chủ lưu trữ nào có thể nhận cookie. Việc bỏ qua thuộc tính này sẽ hạn chế cookie ở máy chủ lưu trữ tài liệu hiện tại, ngoại trừ các miền con: cookie cho example.com sẽ được gửi trên mọi yêu cầu đến example.com nhưng không phải trên các yêu cầu đến images.example.com. Nếu bạn có nhiều ứng dụng chạy trên nhiều miền con, thì điều này sẽ làm giảm nguy cơ một miền bị xâm nhập cho phép xâm nhậ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 được gửi đến tất cả đường dẫn URL trên miền đó. Việc không có DomainPath=/ sẽ giúp cookie liên kết với nguồn gốc chặt chẽ nhất có thể, vì vậy, cookie sẽ hoạt động tương tự như các bộ nhớ phía máy khách khác như LocalStorage. Bạn không cần phải lo lắng về việc example.com/a có thể nhận được các giá trị khác với example.com/b.

Thuộc tính HttpOnly bổ sung một số biện pháp bảo vệ chống lạ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 đề yêu cầu và không cho phép JavaScript sử dụng cookie bằng document.cookie.

Max-Age giới hạn thời gian tồn tại của cookie vì các phiên trình duyệt có thể kéo dài khá lâu và bạn không muốn các cookie cũ vẫn tồn tại mãi mãi. Phương thức này phù hợp với 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 phiên hoạt động ngắn hơn như mã thông báo để gửi biểu mẫu. Max-Age được xác định theo giây và trong ví dụ trước, giá trị này được đặt thành 7776000 giây, tương đương với 90 ngày. Đây là giá trị mặc định hợp lý mà bạn có thể thay đổi tuỳ theo trường hợp sử dụng.

SameSite=Lax chỉ cho phép gửi cookie trên các yêu cầu cùng trang web. Nghĩa 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 hiện đang truy cập và hiển thị trong 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 giá trị này để đảm bảo khả năng tương thích trên các trình duyệt có thể có giá trị mặc định khác nhau. Bằng cách đánh dấu rõ ràng cookie là chỉ trên cùng một trang web, bạn đang hạn chế cookie đó ở ngữ 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 khác nhau, hãy xem tài liệu về Set-Cookie trên MDN.

Nếu bạn có 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ó cá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 miền con đó. 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;

Secure là một tiền tố không bắt buộc, xác nhận ít yêu cầu hơn so với Host: 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 trên 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 sẽ được gửi khi người dùng chuyển đến trang web gốc (ví dụ: khi nhấp vào đường liên kết từ một trang web khác).

Bạn có thể hạn chế thêm 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 bắt nguồn từ trang web của bên thứ ba bằng SameSite=Strict. Điều này hữu ích khi bạn có các cookie liên quan đến chức năng luôn nằm sau thao tác đ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;