Công thức bánh quy SameSite

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 cập nhật, bạn nên cập nhật các thuộc tính cho cookie của bên thứ ba để cookie không bị chặn trong tương lai.

Hỗ trợ trình duyệt

  • Chrome: 51.
  • Edge: 16.
  • Firefox: 60.
  • Safari: 13.

Nguồn

Trường hợp sử dụng cookie của bên thứ ba hoặc cookie trên nhiều trang web

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.

Cookie có thể được dùng ở đây để 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 có tài khoản hiện tại.

Sơ đồ cửa sổ trình duyệt, trong đó URL của nội dung được nhúng không khớp với URL của trang.
Nếu nội dung được nhúng không đến từ cùng một trang web với ngữ cảnh duyệt web cấp cao nhất, thì đó là nội dung của bên thứ ba.

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 đó.

Yêu cầu "không an toàn" trên các trang web

"Không an toàn" có vẻ đáng lo ngại ở đây, nhưng thuật ngữ này đề cập đến 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 các thao tác điều hướng cấp cao nhất an toàn, chẳng hạn như nhấp vào một đường liên kết để chuyển đến một trang web khác. Tuy nhiên, một nội dung như <form> được gửi đến một trang web khác bằng phương thức POST sẽ không bao gồm cookie.

Sơ đồ của một yêu cầu di chuyển từ trang này sang trang khác.
Nếu yêu cầu đến sử dụng phương thức "an toàn", trang sẽ gửi 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 gửi qua POST, bạn cần đá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ì các 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. Các cookie đó phải được đánh dấu thích hợp để đư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. Cũng như với cookie được đặt bằng tiêu đề hoặc JavaScript, hãy cân nhắc việc thêm SameSite=None; Secure nếu cookie đó dùng để 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 tương đối 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 phù 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 ngôn ngữ và thư viện đều hỗ trợ thuộc tính SameSite cho cookie. Tuy nhiên, vì việc bổ sung 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 vấn đề, đó có thể là lần đầu tiên mọi người gặp phải vấn đề đó. Vì vậy, đừng ngại liên hệ: