Đã giải thích cookie SameSite

Hỗ trợ trình duyệt

  • Chrome: 51.
  • Cạnh: 16.
  • Firefox: 60.
  • Safari: 13.

Nguồn

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í cookie đó được sử dụng.

Ra mắt thuộc tính SameSite (được định nghĩa trong RFC6265bis) cho phép bạn khai báo liệu cookie của bạn có bị hạn chế đối với bên thứ nhất hay không ngữ cảnh cùng trang web. Việc hiểu chính xác "site" là rất hữu ích có nghĩa là ở đây. Trang web là sự kết hợp của hậu tố miền và một phần của miền trước nó. Ví dụ: miền www.web.dev là một phần của trang web web.dev.

Từ khoá chính: Nếu người dùng sử dụng www.web.dev và yêu cầu hình ảnh từ static.web.dev, đó là yêu cầu cùng một trang web.

Danh sách hậu tố công khai xác định những trang được tính là ở trên 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, nhưng cũng có thể bao gồm các dịch vụ như github.io. Điều này cho phép your-project.github.iomy-project.github.io để tính là các trang web riêng biệt.

Từ khoá chính: Nếu người dùng sử dụng your-project.github.io và yêu cầu hình ảnh từ my-project.github.io đó là một yêu cầu trên nhiều trang web.

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 ba 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 này hoặc bạn có thể sử dụng Strict hoặc Lax để giới hạn cookie cho các yêu cầu trên cùng một trang web.

Nếu bạn đặt SameSite thành Strict, cookie của bạn chỉ có thể được gửi trong bối cảnh của bên thứ nhất; nghĩa là, nếu trang web của cookie khớp với trang web được hiển thị trong 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 ở trên 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 nhấp vào liên kết từ một liên kết khác đến trang web của bạn, thì cookie không được gửi trong yêu cầu ban đầu đó. Điều này sẽ hữu ích đối với các cookie liên quan đến các tính năng luôn đứng sau tên viết tắt thao tác, chẳng hạn như đổi mật khẩu hoặc mua hàng, nhưng hành động này cũng hạn chế đối với một cookie như promo_shown. Nếu độc giả nhấp vào đường liên kết vào trang web, họ muốn gửi cookie để 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 bằng các cấp cao nhất điều hướng. Ví dụ: nếu một trang web khác tham chiếu đến nội dung trang web của bạn, trong trường hợp này bằng cách sử dụng ảnh mèo của bạn và cung cấp một liên kết đến bài viết của bạn dưới dạng 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 sẽ không gửi cookie. Tuy nhiên, khi độc giả làm theo liên kết đến cat.html trên trang web của bạn, thì yêu cầu đó có bao gồm cookie.

Bạn nên sử dụng SameSite theo cách này, đặt cookie có ảnh hưởng đến trang web hiển thị cho Lax và cookie liên quan đến hành động của người dùng đối với Strict.

Bạn cũng có thể đặt SameSite thành None để cho biết rằng bạn muốn cookie được gửi trong mọi ngữ cảnh. Nếu bạn cung cấp dịch vụ mà các trang web khác sử dụng, chẳng hạn như tiện ích, nội dung được nhúng, chương trình liên kết, quảng cáo hoặc đă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.

3 cookie được gắn nhãn Không có, Lax hoặc Nghiêm ngặt tuỳ thuộc vào bối cảnh của chúng
Đánh dấu rõ ràng ngữ cảnh của cookie là None, Lax hoặc Strict.

Thay đổi hành vi mặc định không có SameSite

Hỗ trợ trình duyệt

  • Chrome: 80.
  • Cạnh: 86.
  • Firefox: sau một lá cờ.
  • Safari: không được hỗ trợ.

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 được mặc định là gửi cookie tất cả ngữ cảnh, khiến người dùng dễ bị CSRF và vô tình rò rỉ thông tin. Để khuyến khích nhà phát triển nêu ý định của họ đồng thời cung cấp cho người dùng trải nghiệm an toàn hơn, đề xuất IETF, Cookie tốt hơn đưa ra hai thay đổi quan trọng:

  • Những cookie không có thuộc tính SameSite được coi là SameSite=Lax.
  • Những cookie có SameSite=None cũng phải chỉ định Secure, nghĩa là chúng yêu cầu ngữ cảnh bảo mật.

Cả hai thay đổi này đều có khả năng tương thích ngược với các trình duyệt đã hoạt động chính xác triển khai phiên bản trước của thuộc tính SameSite, cũng như trình duyệt không hỗ trợ các phiên bản SameSite cũ hơn. Mục đích của các quảng cáo này giảm bớt dữ liệu của nhà phát triển dựa vào trình duyệt hành vi mặc định bằng cách đặt cookie và mục đích sử dụng rõ ràng. Bất kỳ khách hàng nào không nhận ra SameSite=None sẽ bỏ qua hàm 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, trình duyệt xử lý cookie đó như thể được đặt thành SameSite=Lax. Bạn vẫn nên đặt SameSite=Lax rõ ràng để giúp trải nghiệm người dùng nhất quán hơn trên nhiều trình duyệt.

SameSite=None phải 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 các cookie này vào Secure để trình duyệt chấp nhận chúng:

Set-Cookie: widget_session=abc123; SameSite=None; Secure

Bạn có thể kiểm thử 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à trên Firefox 69 bằng cách đặt network.cookie.sameSite.noneRequiresSecure trong about:config.

Bạn cũng nên cập nhật cookie hiện tại lên 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 sẽ cập nhật cookie cũng như cập nhật đoạn trích hoặc trên trang web của bạn để đảm bảo trang web sử dụng hành vi mới.

Để biết thêm thông tin chi tiết về việc cập nhật cookie để xử lý các trường hợp này các thay đổi đố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 làm bánh quy SameSite.

Cảm ơn bạn vì 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.

Hình ảnh chính về cookie của Pille-Riin Priske về Không hiển thị nội dung