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.
Công thức làm bánh hấp dẫn của bên thứ nhất
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;
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ó Domain
và Path=/
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.
Công thức cookie của bên thứ nhất cho các trang web có miền con
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.site
và sport.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;
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
.
Hạn chế quyền truy cập vào cookie của bên thứ nhất đối với các yêu cầu được đưa ra từ trang web của bên thứ ba
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;