Browser Support
Mỗi cookie chứa một cặp khoá-giá trị cùng với một số thuộc tính kiểm soát thời điểm và vị trí sử dụng cookie đó.
Việc ra mắt thuộc tính SameSite (được xác định trong RFC6265bis) cho phép bạn khai báo liệu cookie của bạn có bị hạn chế trong bối cảnh bên thứ nhất hay cùng trang web hay không. Bạn nên hiểu chính xác ý nghĩa của "trang web" trong trường hợp này.
Trang web là sự kết hợp giữa hậu tố tên miền và phần tên miền ngay trước hậu tố đó. Ví dụ: miền www.web.dev là một phần của trang web web.dev.
Thuật ngữ chính: Nếu người dùng đang ở trên www.web.dev và yêu cầu một hình ảnh từ static.web.dev, thì đó là một yêu cầu cùng trang web.
Danh sách hậu tố công khai xác định những trang được tính là thuộc cùng một trang web. Nó không chỉ phụ thuộc vào các miền cấp cao nhất như .com,
mà còn có thể bao gồm các dịch vụ như github.io. Điều này cho phép
your-project.github.io và my-project.github.io được tính là các trang web riêng biệt.
Thuật ngữ chính: Nếu người dùng đang ở trên your-project.github.io và yêu cầu một hình ảnh từ my-project.github.io, thì đó là yêu cầu trên nhiều trang web.
Sử dụng thuộc tính SameSite để khai báo việc sử dụng cookie
Thuộc tính SameSite trên cookie cung cấp 3 cách khác nhau để kiểm soát hành vi này. Bạn có thể chọn không chỉ định thuộc tính hoặc có thể sử dụng Strict hoặc Lax để giới hạn cookie cho các yêu cầu cùng trang web.
Nếu bạn đặt SameSite thành Strict, thì cookie của bạn chỉ có thể được gửi trong bối cảnh của bên thứ nhất; tức là nếu trang web cho cookie khớp với trang web hiển thị trên thanh địa chỉ của trình duyệt. Vì vậy, nếu cookie promo_shown được đặt như sau:
Set-Cookie: promo_shown=1; SameSite=Strict
Khi người dùng truy cập vào trang web của bạn, cookie sẽ được gửi cùng với yêu cầu như dự kiến.
Tuy nhiên, nếu người dùng truy cập vào trang web của bạn thông qua một đường liên kết từ một trang web khác, thì cookie sẽ không được gửi trong yêu cầu ban đầu đó.
Điều này phù hợp với các cookie liên quan đến những tính năng luôn nằm sau một 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, nhưng lại quá hạn chế đối với một cookie như promo_shown. Nếu người đọc truy cập vào trang web thông qua đường liên kết, họ muốn cookie được gửi để có thể áp dụng lựa chọn ưu tiên của họ.
SameSite=Lax cho phép trình duyệt gửi cookie cùng với các thao tác điều hướng cấp cao nhất này. Ví dụ: nếu một trang web khác tham chiếu đến nội dung trên trang web của bạn, trong trường hợp này là sử dụng ảnh mèo của bạn và cung cấp đường liên kết đến bài viết của bạn như sau:
<p>Look at this amazing cat!</p>
<img src="https://blog.example/blog/img/amazing-cat.png" />
<p>Read the <a href="https://blog.example/blog/cat.html">article</a>.</p>
Với cookie được đặt thành Lax như sau:
Set-Cookie: promo_shown=1; SameSite=Lax
Khi trình duyệt yêu cầu amazing-cat.png cho blog của người khác, trang web của bạn sẽ không gửi cookie. Tuy nhiên, khi độc giả nhấp vào đường liên kết đến cat.html trên trang web của bạn, yêu cầu đó sẽ bao gồm cookie.
Bạn nên sử dụng SameSite theo cách này, đặt cookie ảnh hưởng đến việc hiển thị trang web thành Lax và cookie liên quan đến hành động của người dùng thành Strict.
Bạn cũng có thể đặt SameSite thành None để cho biết rằng bạn muốn gửi cookie trong mọi bối cảnh. Nếu bạn cung cấp một dịch vụ mà các trang web khác sử dụng, chẳng hạn như tiện ích, nội dung nhúng, chương trình tiếp thị liên kết, quảng cáo hoặc tính năng đăng nhập trên nhiều trang web, hãy sử dụng None để đảm bảo ý định của bạn rõ ràng.
None, Lax hoặc Strict.
Thay đổi đối với hành vi mặc định khi không có SameSite
Browser Support
Thuộc tính SameSite được hỗ trợ rộng rãi nhưng chưa được áp dụng rộng rãi.
Trước đây, việc đặt cookie mà không có SameSite sẽ mặc định gửi cookie trong mọi bối cảnh, khiến người dùng dễ bị tấn công CSRF và rò rỉ thông tin ngoài ý muốn. Để khuyến khích nhà phát triển nêu rõ ý định của họ
và mang đến cho người dùng trải nghiệm an toàn hơn, đề xuất của IETF,
Cookie tốt hơn theo thời gian
đưa ra hai thay đổi chính:
- Cookie không có thuộc tính
SameSiteđược coi làSameSite=Lax. - Cookie có
SameSite=Nonecũng phải chỉ địnhSecure, nghĩa là cookie yêu cầu một bối cảnh bảo mật.
Cả hai thay đổi này đều tương thích ngược với các trình duyệt đã triển khai chính xác phiên bản trước của thuộc tính SameSite, cũng như các trình duyệt không hỗ trợ các phiên bản SameSite cũ hơn. Các thuộc tính này nhằm mục đích giảm sự phụ thuộc của nhà phát triển vào hành vi mặc định của trình duyệt bằng cách làm rõ hành vi và mục đích sử dụng cookie. Mọi ứng dụng không nhận dạng được SameSite=None đều nên bỏ qua thuộc tính này.
SameSite=Lax theo mặc định
Nếu bạn gửi cookie mà không chỉ định thuộc tính SameSite, thì trình duyệt sẽ coi cookie đó như thể được đặt thành SameSite=Lax. Bạn vẫn nên đặt SameSite=Lax một cách rõ ràng để mang lại trải nghiệm người dùng nhất quán hơn trên các trình duyệt.
SameSite=None phải được bảo mật
Khi tạo cookie trên nhiều trang web bằng SameSite=None, bạn cũng phải đặt cookie thành Secure để trình duyệt chấp nhận:
Set-Cookie: widget_session=abc123; SameSite=None; Secure
Bạn có thể kiểm tra hành vi này kể từ Chrome 76 bằng cách bật about://flags/#cookies-without-same-site-must-be-secure và từ Firefox 69 bằng cách đặt network.cookie.sameSite.noneRequiresSecure trong about:config.
Bạn cũng nên cập nhật các cookie hiện có thành Secure càng sớm càng tốt.
Nếu bạn dựa vào các dịch vụ cung cấp nội dung của bên thứ ba trên trang web của mình, hãy đảm bảo nhà cung cấp dịch vụ của bạn cập nhật cookie của họ, đồng thời cập nhật mọi đoạn mã hoặc phần phụ thuộc trên trang web của bạn để đảm bảo trang web sử dụng hành vi mới.
SameSite công thức làm bánh quy
Để biết thêm thông tin chi tiết về cách cập nhật cookie để xử lý thành công những thay đổi này đối với SameSite=None và sự khác biệt trong hành vi của trình duyệt, hãy xem bài viết tiếp theo, Công thức cookie SameSite.
Xin chân thành cảm ơn những đóng góp và ý kiến phản hồi của Lily Chen, Malte Ubl, Mike West, Rob Dodson, Tom Steiner và Vivek Sekhar.