Chrome, Firefox, Edge, và các trình duyệt khác đang thay đổi hành vi mặc định của chúng theo đề xuất của IETF, Cookie ngày càng tốt hơn để:
- Cookie không có thuộc tính
SameSite
sẽ được coi làSameSite=Lax
, nghĩa là hành vi mặc định là chỉ hạn chế cookie ở ngữ cảnh của bên thứ nhất. - Cookie dùng trên nhiều trang web phải chỉ định
SameSite=None; Secure
để cho phép đưa vào ngữ cảnh bên thứ ba.
Nếu chưa thực hiện việc này, bạn nên cập nhật các thuộc tính cho cookie của bên thứ ba để cookie của bên thứ ba không bị chặn trong tương lai.
Các trường hợp sử dụng cookie của nhiều trang web hoặc bên thứ ba
Có một số trường hợp sử dụng và mẫu phổ biến mà bạn cần gửi cookie trong ngữ cảnh của bên thứ ba. Nếu bạn cung cấp hoặc phụ thuộc vào một trong những trường hợp sử dụng này, hãy đảm bảo rằng bạn hoặc nhà cung cấp đang cập nhật cookie của họ để dịch vụ hoạt động đúng cách.
Nội dung trong <iframe>
Nội dung từ một trang web khác hiển thị trong <iframe>
nằm trong ngữ cảnh của bên thứ ba. Các trường hợp sử dụng tiêu chuẩn bao gồm:
- Nội dung được nhúng được chia sẻ từ các trang web khác, chẳng hạn như video, bản đồ, mã mẫu và bài đăng trên mạng xã hội.
- Tiện ích từ các dịch vụ bên ngoài, chẳng hạn như tính năng thanh toán, lịch, đặt phòng và đặt trước.
- Các tiện ích như nút mạng xã hội hoặc dịch vụ chống gian lận tạo ra
<iframes>
ít rõ ràng hơn.
Trong số những việc khác, cookie có thể được sử dụng để duy trì trạng thái phiên, lưu trữ các lựa chọn ưu tiên chung, bật số liệu thống kê hoặc cá nhân hoá nội dung cho người dùng bằng các tài khoản hiện có.
Vì web vốn là một thành phần kết hợp, nên <iframes>
cũng được dùng để nhúng nội dung được xem trong bối cảnh cấp cao nhất hoặc của bên thứ nhất. Mọi cookie mà trang web hiển thị trong iframe sử dụng đều được coi là cookie của bên thứ ba. Nếu bạn đang tạo các trang web mà bạn muốn các trang web khác nhúng và cần cookie để các trang web đó hoạt động, bạn cũng cần đảm bảo rằng các trang web đó được đánh dấu để sử dụng trên nhiều trang web hoặc bạn có thể quay lại một cách linh hoạt mà không cần các trang web đó.
Các yêu cầu "Không an toàn" trên các trang web
Có vẻ như trạng thái "Không an toàn" có vẻ đáng lo ngại, nhưng tức là mọi yêu cầu có thể nhằm thay đổi trạng thái. Trên web, đó chủ yếu là các yêu cầu POST. Cookie
được đánh dấu là SameSite=Lax
sẽ được gửi trên thanh điều hướng cấp cao nhất và an toàn, chẳng hạn như việc nhấp vào một đường liên kết để truy cập vào một trang web khác. Tuy nhiên, những lượt gửi <form>
đến một trang web khác bằng yêu cầu POST sẽ không bao gồm cookie.
Mẫu này được dùng cho các trang web có thể chuyển hướng người dùng đến một dịch vụ từ xa để thực hiện một số thao tác trước khi quay lại, ví dụ: chuyển hướng đến một nhà cung cấp danh tính bên thứ ba. Trước khi người dùng rời khỏi trang web, một cookie sẽ được đặt chứa một mã thông báo sử dụng một lần với kỳ vọng rằng mã thông báo này có thể được kiểm tra trên yêu cầu trả về để giảm thiểu các cuộc tấn công Gian lận yêu cầu trên nhiều trang web (CSRF). Nếu yêu cầu trả lại đó được thực hiện thông qua POST, thì bạn cần phải đánh dấu cookie là SameSite=None; Secure
.
Tài nguyên từ xa
Mọi tài nguyên từ xa trên một trang, chẳng hạn như từ thẻ <img>
hoặc thẻ <script>
, có thể dựa vào cookie được gửi cùng với một yêu cầu. Các trường hợp sử dụng phổ biến bao gồm pixel theo dõi và cá nhân hoá nội dung.
Điều này cũng áp dụng cho các yêu cầu được gửi từ JavaScript bằng fetch
hoặc XMLHttpRequest
. Nếu fetch()
được gọi bằng tuỳ chọn credentials: 'include'
, thì những yêu cầu đó có thể bao gồm cookie.
Đối với XMLHttpRequest
, cookie dự kiến thường được biểu thị bằng giá trị withCredentials
cho true
. Những cookie đó phải được đánh dấu phù hợp để được đưa vào yêu cầu trên nhiều trang web.
Nội dung trong WebView
WebView trong một ứng dụng dành riêng cho nền tảng được cung cấp bởi trình duyệt. Nhà phát triển cần kiểm thử xem các quy định hạn chế hoặc vấn đề ảnh hưởng đến ứng dụng của họ có áp dụng cho WebView của ứng dụng hay không.
Android cũng cho phép các ứng dụng dành riêng cho nền tảng đặt cookie trực tiếp bằng cách sử dụng CookieManager API.
Tương tự như với các cookie được đặt bằng tiêu đề hoặc JavaScript, hãy cân nhắc đưa SameSite=None; Secure
vào nếu nhằm mục đích sử dụng trên nhiều trang web.
Cách triển khai SameSite
ngay hôm nay
Đánh dấu mọi cookie chỉ cần thiết trong bối cảnh bên thứ nhất là SameSite=Lax
hoặc SameSite=Strict
tuỳ thuộc vào nhu cầu của bạn. Nếu bạn không đánh dấu các cookie này mà thay vào đó dựa vào hành vi mặc định của trình duyệt để xử lý, thì các cookie này có thể hoạt động không nhất quán trên các trình duyệt và có thể kích hoạt cảnh báo của bảng điều khiển cho từng cookie.
Set-Cookie: first_party_var=value; SameSite=Lax
Hãy nhớ đánh dấu mọi cookie cần thiết trong ngữ cảnh của bên thứ ba là SameSite=None; Secure
. Cả hai thuộc tính đều bắt buộc. Nếu bạn chỉ chỉ định None
mà không có Secure
, thì cookie sẽ bị từ chối. Để tính đến sự khác biệt trong cách triển khai trình duyệt, bạn có thể cần sử dụng một số chiến lược giảm thiểu được mô tả trong phần Xử lý ứng dụng không tương thích.
Set-Cookie: third_party_var=value; SameSite=None; Secure
Xử lý các ứng dụng không tương thích
Vì những thay đổi này để đưa None
vào và cập nhật hành vi mặc định vẫn còn khá mới, nên các trình duyệt xử lý những thay đổi này theo nhiều cách khác nhau. Bạn có thể tham khảo trang cập nhật trên chromium.org để biết danh sách các vấn đề đã biết, nhưng danh sách này có thể chưa đầy đủ.
Một giải pháp có thể là đặt mỗi cookie theo cả kiểu mới và kiểu cũ:
Set-cookie: 3pcookie=value; SameSite=None; Secure
Set-cookie: 3pcookie-legacy=value; Secure
Các trình duyệt triển khai hành vi mới hơn sẽ đặt cookie bằng giá trị SameSite
. Những trình duyệt không triển khai hành vi mới sẽ bỏ qua giá trị đó và đặt cookie 3pcookie-legacy
. Khi xử lý cookie được đưa vào, trước tiên, trang web của bạn phải kiểm tra xem có kiểu cookie mới hay không, sau đó quay lại cookie cũ nếu không tìm thấy cookie mới.
Ví dụ sau đây cho biết cách thực hiện việc này trong Node.js, sử dụng khung Express và phần mềm trung gian cookie-parser:
const express = require('express');
const cp = require('cookie-parser');
const app = express();
app.use(cp());
app.get('/set', (req, res) => {
// Set the new style cookie
res.cookie('3pcookie', 'value', { sameSite: 'none', secure: true });
// And set the same value in the legacy cookie
res.cookie('3pcookie-legacy', 'value', { secure: true });
res.end();
});
app.get('/', (req, res) => {
let cookieVal = null;
if (req.cookies['3pcookie']) {
// check the new style cookie first
cookieVal = req.cookies['3pcookie'];
} else if (req.cookies['3pcookie-legacy']) {
// otherwise fall back to the legacy cookie
cookieVal = req.cookies['3pcookie-legacy'];
}
res.end();
});
app.listen(process.env.PORT);
Phương pháp này yêu cầu bạn phải làm thêm việc thiết lập cookie thừa và thực hiện các thay đổi tại thời điểm cả thiết lập và đọc cookie. Tuy nhiên, cookie này phải áp dụng cho tất cả trình duyệt bất kể hành vi của trình duyệt và vẫn duy trì hoạt động của cookie của bên thứ ba.
Ngoài ra, bạn có thể phát hiện ứng dụng bằng cách sử dụng chuỗi tác nhân người dùng khi tiêu đề Set-Cookie
được gửi. Tham khảo danh sách ứng dụng không tương thích và sử dụng thư viện phát hiện tác nhân người dùng thích hợp cho nền tảng của bạn, ví dụ: thư viện ua-parser-js trên Node.js. Phương pháp này chỉ yêu cầu bạn thực hiện một thay đổi, nhưng tính năng đánh hơi tác nhân người dùng có thể không phát hiện được tất cả người dùng bị ảnh hưởng.
Hỗ trợ SameSite=None
trong các ngôn ngữ, thư viện và khung
Phần lớn các ngôn ngữ và thư viện đều hỗ trợ thuộc tính SameSite
cho cookie. Tuy nhiên, vì việc thêm SameSite=None
vẫn còn tương đối mới, nên bạn có thể cần phải xử lý một số hành vi chuẩn hiện tại.
Những hành vi này được ghi lại trong kho lưu trữ ví dụ về SameSite
trên GitHub.
Nhận trợ giúp
Cookie được sử dụng ở mọi nơi trên web và hiếm có nhóm phát triển nào có kiến thức đầy đủ về vị trí trang web của họ đặt và sử dụng cookie, đặc biệt là trong các trường hợp sử dụng trên nhiều trang web. Khi bạn gặp sự cố, đó có thể là lần đầu tiên bất kỳ ai gặp phải sự cố đó, vì vậy đừng ngần ngại liên hệ với chúng tôi:
- Nêu vấn đề trong kho lưu trữ mẫu
SameSite
trên GitHub. - Đặt câu hỏi trong thẻ "samesite" trên StackOverflow.
- Đối với các vấn đề về hành vi của Chromium, hãy báo lỗi trong Công cụ theo dõi lỗi của Chromium.
- Theo dõi tiến trình của Chrome trên trang cập nhật
SameSite
.