Đã giải thích cookie SameSite

Hỗ trợ trình duyệt

  • Chrome: 51.
  • Edge: 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í mà cookie đó được sử dụng.

Việc sử dụng thuộc tính SameSite (được định nghĩa trong RFC6265bis) cho phép bạn khai báo việc cookie của bạn bị hạn chế đối với bối cảnh của bên thứ nhất hay cùng một trang web. Bạn nên hiểu rõ ý nghĩa của "trang web" ở đâ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 ngay trước nó. Ví dụ: miền www.web.dev thuộc 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à yêu cầu trên 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à thuộc cùng một trang web. Bộ công cụ này 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. Thao tác này cho phép your-project.github.iomy-project.github.io được 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 một hình ảnh từ my-project.github.io, thì đó là một 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 để 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 sử dụng Strict hoặc Lax để giới hạn cookie ở 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 ngữ cảnh của bên thứ nhất; tức là nếu trang web của cookie khớp với trang web 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 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 từ một trang web khác, thì cookie sẽ không được gửi theo yêu cầu ban đầu đó. Điều này phù hợp với các cookie liên quan đến các tính 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, nhưng lại quá hạn chế đối với một cookie như promo_shown. Nếu người đọc nhấp vào đường liên kết đến trang web, 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 bằng 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à bằng cách 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 người đọc 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 chế độ 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 ngữ 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 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ó nhãn Không có, Lax hoặc Nghiêm ngặt tuỳ thuộc vào ngữ 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: phía sau một 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 mặc định là gửi cookie trong tất cả ngữ cảnh, khiến người dùng dễ bị 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 mình và mang đến cho người dùng trải nghiệm an toàn hơn, đề xuất của IETF, Cookie ngày càng tốt hơn nêu ra hai thay đổi chính:

  • Cookie không có thuộc tính SameSite sẽ được coi là SameSite=Lax.
  • Cookie có SameSite=None cũng phải chỉ định Secure, nghĩa là cookie đó yêu cầu một ngữ cảnh an toàn.

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 trước đó. Các cookie này nhằm 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 ra SameSite=None đều sẽ bỏ qua ứng dụng đó.

SameSite=Lax theo mặc định

Nếu bạn gửi một cookie mà không chỉ định thuộc tính SameSite của cookie đó, thì trình duyệt sẽ xử lý cookie đó như thể cookie đó đượ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 nhất quán hơn cho người dùng trên các trình duyệt.

SameSite=None phải an toàn

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 thành 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à 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ó 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 rằng nhà cung cấp dịch vụ của bạn cập nhật cookie và cập nhật mọi đoạn mã hoặc phần phụ thuộc trên trang web để đảm bảo trang web sử dụng hành vi mới.

Để 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 về 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.

Trân trọng 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.

Hình ảnh chính về cookie của Pille-Riin Priske trên Unsplash