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 giới thiệu thuộc tính SameSite
(được xác định trong RFC6265bis) cho phép bạn khai báo liệu cookie của mình có bị hạn chế ở bối cảnh bên thứ nhất hay cùng trang web hay không. 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à phần miền ngay trước đó. 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 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. 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 ở your-project.github.io
và yêu cầu 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 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.
Thay đổi đối với hành vi mặc định không có SameSite
Hỗ trợ trình duyệt
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ỉ địnhSecure
, 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 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 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.
Công thức làm bánh quy SameSite
Để 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.
Xin 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