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 theo đề xuất của IETF, Incrementally Better Cookies (Cookie ngày càng tốt hơn) để:

  • Cookie không có thuộc tính SameSite được coi là SameSite=Lax, nghĩa là hành vi mặc định là chỉ giới hạn cookie trong các bối cảnh của bên thứ nhất mà thôi.
  • Cookie để sử 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 làm, bạn nên cập nhật các thuộc tính cho cookie của bên thứ ba để chúng không bị chặn trong tương lai.

Browser Support

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

Source

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

Có một số trường hợp sử dụng và mẫu hình phổ biến mà cookie cần được gửi trong bối 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 xuất hiện trong một <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 của các dịch vụ bên ngoài, chẳng hạn như tính năng thanh toán, lịch, đặt chỗ 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ơ đồ về một 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 bối cảnh duyệt web cấp cao nhất, thì đó là nội dung của bên thứ ba.

Vì bản chất của web là có thể 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 bối cảnh bên thứ nhất. Mọi cookie mà trang web hiển thị trong iframe đều được coi là cookie của bên thứ ba. Nếu đ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, thì bạn cũng cần đảm bảo rằng các cookie đó đượ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 cookie đó.

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

"Không an toàn" có thể nghe có vẻ đáng lo ngại ở đây, nhưng nó đề cập đến mọi yêu cầu có thể nhằm mục đích 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 trong các thao tác điều hướng an toàn ở cấp cao nhất, 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 nào đó như việc gửi <form> đến một trang web khác bằng phương thức POST sẽ không bao gồm cookie.

Sơ đồ về 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 một phương thức "an toàn", trang sẽ gửi cookie.

Mẫu này được dùng cho những 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ã thông báo 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 trong yêu cầu trả về để giảm thiểu các cuộc tấn công Giả mạo yêu cầu trên nhiều trang web (CSRF). Nếu yêu cầu trả về đó được gửi qua POST, bạn sẽ 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 của bạn bằng fetch hoặc XMLHttpRequest. Nếu fetch() được gọi bằng lựa 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. Bạn phải đánh dấu những cookie đó một cách thích hợp để đưa vào các 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 hỗ trợ bởi một 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 CookieManager API. Tương tự như 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 bạn dự định sử dụng chú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ỳ theo nhu cầu của bạn. Nếu bạn không đánh dấu các cookie này và thay vào đó dựa vào hành vi mặc định của trình duyệt để xử lý chúng, 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ó khả năng kích hoạt cảnh báo trên bảng điều khiển cho từng cookie.

Set-Cookie: first_party_var=value; SameSite=Lax

Đảm bảo đánh dấu mọi cookie cần thiết trong bối cảnh của bên thứ ba là SameSite=None; Secure. Bạn phải cung cấp cả hai thuộc tính này. Nếu bạn chỉ chỉ định None mà không có Secure, thì cookie sẽ bị từ chối. Để giải thích 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ý các ứ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 để thêm None 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 khác nhau sẽ xử lý chúng theo những cách khác nhau. Bạn có thể tham khảo trang cập nhật trên chromium.org để xem 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 từng 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ý các cookie được đưa vào, trước tiên, trang web của bạn phải kiểm tra sự hiện diện của kiểu cookie mới, 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, bằng cách sử dụng khung Express và phần mềm trung gian cookie-parser của khung này:

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);

Cách tiếp cận này đòi hỏi bạn phải làm thêm việc thiết lập cookie dự phòng và thực hiện các thay đổi tại thời điểm thiết lập và đọc cookie. Tuy nhiên, giải pháp này phải áp dụng cho tất cả các trình duyệt bất kể hành vi của chúng và duy trì chức năng của cookie 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 các ứ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 phát hiện tác nhân người dùng có thể không phát hiện được tất cả người dùng chịu ảnh hưởng.

Hỗ trợ SameSite=None bằng các ngôn ngữ, thư viện và khung

Đa số 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 hiện tại, bạn có thể cần phải giải quyết một số hành vi chuẩn. Những hành vi này được ghi lại trong kho lưu trữ SameSiteví dụ trên GitHub.

Nhận trợ giúp

Cookie được sử dụng ở mọi nơi trên web và hiếm khi có nhóm phát triển nào nắm được đầy đủ thông tin về vị trí mà 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 gặp phải một vấn đề, có thể bạn là người đầu tiên gặp phải vấn đề đó, vì vậy, đừng ngại liên hệ với chúng tôi: