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.io
và my-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](https://web.dev/static/articles/samesite-cookies-explained/image/three-cookies-labelled-no-495f9afccf1cd.png?authuser=19&hl=vi)
None
, Lax
hoặc Strict
.
Thay đổ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
đượ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ỉ địnhSecure
, 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.
SameSite
công thức làm bánh quy
Để 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