Set Situs Terkait: panduan developer

Set Situs Terkait (RWS) adalah mekanisme platform web yang membantu browser memahami hubungan antara kumpulan domain. Hal ini memungkinkan browser membuat keputusan penting untuk mengaktifkan fungsi situs tertentu (seperti apakah akan mengizinkan akses ke cookie lintas situs) dan menampilkan informasi ini kepada pengguna.

Seiring penghentian penggunaan cookie pihak ketiga oleh Chrome, tujuannya adalah untuk mempertahankan kasus penggunaan utama di web sekaligus meningkatkan privasi bagi pengguna. Misalnya, banyak situs mengandalkan beberapa domain untuk memberikan satu pengalaman pengguna. Organisasi mungkin ingin mempertahankan domain level teratas yang berbeda untuk beberapa kasus penggunaan seperti domain khusus negara atau domain layanan untuk menghosting gambar atau video. Set Situs Terkait memungkinkan situs berbagi data di seluruh domain, dengan kontrol tertentu.

Pada tingkat tinggi, Set Situs Terkait adalah kumpulan domain, yang memiliki satu "kumpulan domain utama" dan mungkin beberapa "anggota kumpulan".

Dalam contoh berikut, primary mencantumkan domain primer, dan associatedSites mencantumkan domain yang memenuhi persyaratan subset terkait.

{
  "primary": "https://primary.com",
  "associatedSites": ["https://associate1.com", "https://associate2.com", "https://associate3.com"]
}

Daftar Set Situs Terkait kanonis adalah daftar yang dapat dilihat oleh publik dalam format file JSON yang dihosting di repositori GitHub Set Situs Terkait, yang berfungsi sebagai sumber tepercaya untuk semua set. Chrome menggunakan file ini untuk diterapkan ke perilakunya.

Hanya mereka yang memiliki kontrol administratif atas domain yang dapat membuat kumpulan dengan domain tersebut. Pengirim wajib menyatakan hubungan antara setiap "anggota kumpulan" ke "{i>set primary<i}." Anggota kumpulan dapat mencakup berbagai jenis domain dan harus menjadi bagian dari subkumpulan berdasarkan kasus penggunaan.

Jika aplikasi Anda bergantung pada akses ke cookie lintas situs (juga disebut cookie pihak ketiga) di seluruh situs dalam Set Situs Terkait yang sama, Anda dapat menggunakan Storage Access API (SAA) dan requestStorageAccessFor API untuk meminta akses ke cookie tersebut. Bergantung pada subkumpulan tempat yang merupakan bagian dari setiap situs, browser mungkin menangani permintaan secara berbeda.

Untuk mempelajari lebih lanjut proses dan persyaratan pengiriman set, lihat panduan pengiriman. Set yang dikirim akan melalui berbagai pemeriksaan teknis untuk memvalidasi pengiriman.

Set Situs Terkait cocok untuk kasus saat organisasi memerlukan suatu bentuk identitas bersama di berbagai situs tingkat atas.

Beberapa kasus penggunaan untuk Set Situs Terkait adalah:

  • Penyesuaian negara. Memanfaatkan situs yang dilokalkan sembari mengandalkan infrastruktur bersama (example.co.uk mungkin bergantung pada layanan yang dihosting oleh example.ca).
  • Integrasi domain layanan. Memanfaatkan domain layanan yang tidak pernah berinteraksi secara langsung oleh pengguna, tetapi menyediakan layanan di seluruh situs organisasi yang sama (example-cdn.com).
  • Pemisahan konten pengguna. Mengakses data di domain berbeda yang memisahkan konten yang diupload pengguna dari konten situs lainnya untuk alasan keamanan, sekaligus mengizinkan akses domain dalam sandbox ke cookie (dan lainnya). Jika menayangkan konten tidak aktif yang diupload pengguna, Anda mungkin juga dapat menghostingnya dengan aman di domain yang sama dengan mengikuti praktik terbaik.
  • Konten yang diautentikasi dan disematkan. Mendukung konten tersemat dari seluruh properti terafiliasi (video, dokumen, atau resource yang dibatasi bagi pengguna yang login di situs tingkat atas).
  • Login. Mendukung login di seluruh properti terafiliasi. FedCM API mungkin juga sesuai untuk beberapa kasus penggunaan.
  • Analytics. Men-deploy analisis dan pengukuran perjalanan pengguna di seluruh properti terafiliasi untuk meningkatkan kualitas layanan.

Storage Access API

Dukungan Browser

  • Chrome: 119.
  • Edge: 85.
  • Firefox: 65.
  • Safari: 11.1.

Sumber

Storage Access API (SAA) menyediakan cara bagi konten lintas origin yang disematkan untuk mengakses penyimpanan yang biasanya hanya dapat diakses dalam konteks pihak pertama.

Resource tersemat dapat menggunakan metode SAA untuk memeriksa apakah saat ini memiliki akses ke penyimpanan, dan untuk meminta akses dari agen pengguna.

Jika cookie pihak ketiga diblokir tetapi Set Situs Terkait (RWS) diaktifkan, Chrome akan otomatis memberikan izin dalam konteks intra-RWS, dan akan menampilkan perintah kepada pengguna. ("Konteks intra-RWS" adalah konteks, seperti iframe, yang situs sematan dan situs tingkat atas-nya berada dalam RWS yang sama.)

Memeriksa dan meminta akses penyimpanan

Untuk memeriksa apakah saat ini situs memiliki akses ke penyimpanan, situs sematan dapat menggunakan metode Document.hasStorageAccess().

Metode ini menampilkan promise yang di-resolve dengan nilai boolean yang menunjukkan apakah dokumen sudah memiliki akses ke cookie-nya atau tidak. Promise juga menampilkan true jika iframe memiliki origin yang sama dengan frame atas.

Untuk meminta akses ke cookie dalam konteks lintas situs yang disematkan, situs dapat menggunakan Document.requestStorageAccess() (rSA).

requestStorageAccess() API dimaksudkan untuk dipanggil dari dalam iframe. iframe tersebut baru saja menerima interaksi pengguna (gestur pengguna, yang diperlukan oleh semua browser), tetapi Chrome juga mewajibkan bahwa dalam 30 hari terakhir, pengguna telah mengunjungi situs yang memiliki iframe tersebut dan telah berinteraksi dengan situs tersebut secara khusus—sebagai dokumen tingkat atas, bukan di iframe.

requestStorageAccess() menampilkan promise yang akan diselesaikan jika akses ke penyimpanan diberikan. Janji tersebut ditolak, dengan menyebutkan alasannya, jika akses ditolak karena alasan apa pun.

requestStorageAccessFor di Chrome

Dukungan Browser

  • Chrome: 119.
  • Edge: 119.
  • Firefox: tidak didukung.
  • Safari: tidak didukung.

Sumber

Storage Access API hanya mengizinkan situs tersemat untuk meminta akses ke penyimpanan dari dalam elemen <iframe> yang telah menerima interaksi pengguna.

Hal ini menimbulkan tantangan dalam mengadopsi Storage Access API untuk situs tingkat atas yang menggunakan gambar lintas situs atau tag skrip yang memerlukan cookie.

Untuk mengatasi hal ini, Chrome telah mengimplementasikan cara bagi situs tingkat atas untuk meminta akses penyimpanan atas nama origin tertentu dengan Document.requestStorageAccessFor() (rSAFor).

 document.requestStorageAccessFor('https://target.site')

API requestStorageAccessFor() dimaksudkan untuk dipanggil oleh dokumen tingkat atas. Dokumen tersebut juga baru saja menerima interaksi pengguna. Namun, tidak seperti requestStorageAccess(), Chrome tidak memeriksa interaksi di dokumen tingkat teratas dalam 30 hari terakhir karena pengguna sudah berada di halaman tersebut.

Memeriksa izin akses penyimpanan

Akses ke beberapa fitur browser, seperti kamera atau geolokasi, didasarkan pada izin yang diberikan pengguna. Izin API menyediakan cara untuk memeriksa status izin untuk mengakses API, baik yang telah diberikan, ditolak, maupun memerlukan beberapa bentuk interaksi pengguna, seperti mengklik perintah atau berinteraksi dengan halaman.

Anda dapat meminta status izin menggunakan navigator.permissions.query().

Guna memeriksa izin akses penyimpanan untuk konteks saat ini, Anda harus meneruskan string 'storage-access':

navigator.permissions.query({name: 'storage-access'})

Untuk memeriksa izin akses penyimpanan untuk origin yang ditentukan, Anda harus meneruskan string 'top-level-storage-access':

navigator.permissions.query({name: 'top-level-storage-access', requestedOrigin: 'https://target.site'})

Perlu diperhatikan bahwa untuk melindungi integritas origin yang disematkan, ini hanya memeriksa izin yang diberikan oleh dokumen tingkat atas menggunakan document.requestStorageAccessFor.

Bergantung pada apakah izin dapat diberikan secara otomatis atau memerlukan gestur pengguna, izin akan menampilkan prompt atau granted.

Model per frame

Hibah rSA berlaku per frame. Pemberian rSA dan rSAFor diperlakukan sebagai izin terpisah.

Setiap frame baru harus meminta akses penyimpanan satu per satu dan akan otomatis diberi akses. Hanya permintaan pertama yang memerlukan gestur pengguna, setiap permintaan berikutnya yang diinisiasi oleh iframe, seperti navigasi atau subresource tidak perlu menunggu gestur pengguna karena akan diberikan untuk sesi penjelajahan oleh permintaan awal.

Memuat ulang, memuat ulang, atau membuat ulang iframe akan memerlukan permintaan akses lagi.

Cookie harus menentukan atribut SameSite=None dan Secure karena rSA hanya memberikan akses ke cookie yang telah ditandai untuk digunakan dalam konteks lintas situs.

Cookie dengan SameSite=Lax, SameSite=Strict, atau tanpa atribut SameSite hanya untuk penggunaan pihak pertama dan tidak akan pernah dibagikan dalam konteks lintas situs terlepas dari rSA.

Keamanan

Untuk rSAFor, permintaan subresource memerlukan header Cross-Origin Resource Sharing (CORS) atau atribut crossorigin pada resource, sehingga memastikan keikutsertaan eksplisit.

Contoh implementasi

Meminta akses ke penyimpanan dari iframe lintas origin tersemat

Diagram yang menunjukkan situs tersemat di top-level.site
Menggunakan requestStorageAccess() dalam sematan di situs lain.

Memeriksa apakah Anda memiliki akses penyimpanan

Untuk memeriksa apakah Anda sudah memiliki akses penyimpanan, gunakan document.hasStorageAccess().

Jika promise ditetapkan ke true, Anda dapat mengakses penyimpanan dalam konteks lintas situs. Jika statusnya berubah menjadi false, Anda perlu meminta akses penyimpanan.

document.hasStorageAccess().then((hasAccess) => {
    if (hasAccess) {
      // You can access storage in this context
    } else {
      // You have to request storage access
    }
});

Meminta akses penyimpanan

Jika Anda perlu meminta akses penyimpanan, pertama-tama periksa izin akses penyimpanan navigator.permissions.query({name: 'storage-access'}) untuk melihat apakah hal tersebut memerlukan gestur pengguna atau dapat diberikan secara otomatis.

Jika izinnya adalah granted, Anda dapat memanggil document.requestStorageAccess() dan operasi akan berhasil tanpa gestur pengguna.

Jika status izin adalah prompt, Anda harus memulai panggilan document.requestStorageAccess() setelah gestur pengguna, seperti klik tombol.

Contoh:

navigator.permissions.query({name: 'storage-access'}).then(res => {
  if (res.state === 'granted') {
    // Permission has already been granted
    // You can request storage access without any user gesture
    rSA();
  } else if (res.state === 'prompt') {
    // Requesting storage access requires user gesture
    // For example, clicking a button
    const btn = document.createElement("button");
    btn.textContent = "Grant access";
    btn.addEventListener('click', () => {
      // Request storage access
      rSA();
    });
    document.body.appendChild(btn);
  }
});

function rSA() {
  if ('requestStorageAccess' in document) {
    document.requestStorageAccess().then(
      (res) => {
        // Use storage access
      },
      (err) => {
        // Handle errors
      }
    );
  }
}

Permintaan berikutnya dari dalam bingkai, navigasi, atau subresource, akan otomatis memiliki izin untuk mengakses cookie lintas situs. hasStorageAccess() menampilkan cookie benar dan lintas situs dari Set Situs Terkait yang sama akan dikirim pada permintaan tersebut tanpa panggilan JavaScript tambahan.

Diagram yang menunjukkan requestStorageAccessFor() digunakan di situs tingkat atas dan bukan di dalam sematan
Menggunakan requestStorageAccessFor() di situs tingkat atas untuk origin yang berbeda

Situs tingkat atas dapat menggunakan requestStorageAccessFor() untuk meminta akses penyimpanan atas nama origin tertentu.

hasStorageAccess() hanya memeriksa apakah situs yang memanggilnya memiliki akses penyimpanan, sehingga situs tingkat atas dapat memeriksa izin untuk asal lain.

Untuk mengetahui apakah pengguna akan ditanya atau apakah akses penyimpanan telah diberikan ke asal yang ditentukan, panggil navigator.permissions.query({name: 'top-level-storage-access', requestedOrigin: 'https://target.site'}).

Jika izinnya adalah granted, Anda dapat memanggil document.requestStorageAccessFor('https://target.site'). Metode ini akan berhasil tanpa gestur pengguna.

Jika izinnya adalah prompt maka Anda harus mengaitkan panggilan document.requestStorageAccessFor('https://target.site') di belakang gestur pengguna, seperti klik tombol.

Contoh:

navigator.permissions.query({name:'top-level-storage-access',requestedOrigin: 'https://target.site'}).then(res => {
  if (res.state === 'granted') {
    // Permission has already been granted
    // You can request storage access without any user gesture
    rSAFor();
  } else if (res.state === 'prompt') {
    // Requesting storage access requires user gesture
    // For example, clicking a button
    const btn = document.createElement("button");
    btn.textContent = "Grant access";
    btn.addEventListener('click', () => {
      // Request storage access
      rSAFor();
    });
    document.body.appendChild(btn);
  }
});

function rSAFor() {
  if ('requestStorageAccessFor' in document) {
    document.requestStorageAccessFor().then(
      (res) => {
        // Use storage access
      },
      (err) => {
        // Handle errors
      }
    );
  }
}

Setelah panggilan requestStorageAccessFor() berhasil, permintaan lintas situs akan menyertakan cookie jika menyertakan CORS atau atribut crossorigin, sehingga situs mungkin perlu menunggu sebelum memicu permintaan.

Permintaan harus menggunakan opsi credentials: 'include' dan resource harus menyertakan atribut crossorigin="use-credentials".

function checkCookie() {
    fetch('https://related-website-sets.glitch.me/getcookies.json', {
        method: 'GET',
        credentials: 'include'
      })
      .then((response) => response.json())
      .then((json) => {
      // Do something
      });
  }

Cara menguji secara lokal

Prasyarat

Untuk menguji Set Situs Terkait secara lokal, gunakan Chrome 119 atau yang lebih baru yang diluncurkan dari command line dan aktifkan test-third-party-cookie-phaseout flag Chrome.

Mengaktifkan tanda Chrome

Untuk mengaktifkan tanda Chrome yang diperlukan, buka chrome://flags#test-third-party-cookie-phaseout dari kolom URL dan ubah tanda tersebut menjadi Enabled. Pastikan untuk memulai ulang browser setelah tanda diubah.

Untuk meluncurkan Chrome dengan Set Situs Terkait yang dideklarasikan secara lokal, buat objek JSON yang berisi URL yang merupakan anggota kumpulan dan teruskan ke --use-related-website-set.

Pelajari lebih lanjut cara menjalankan Chromium dengan tanda.

--use-related-website-set="{\"primary\": \"https://related-website-sets.glitch.me\", \"associatedSites\": [\"https://rws-member-1.glitch.me\"]}" \
https://related-website-sets.glitch.me/

Contoh

Untuk mengaktifkan Set Situs Terkait secara lokal, Anda harus mengaktifkan test-third-party-cookie-phaseout di chrome://flags dan meluncurkan Chrome dari command line dengan tanda --use-related-website-set dengan objek JSON yang berisi URL yang merupakan anggota kumpulan.

--use-related-website-set="{\"primary\": \"https://related-website-sets.glitch.me\", \"associatedSites\": [\"https://rws-member-1.glitch.me\"]}" \
https://related-website-sets.glitch.me/

Memverifikasi bahwa Anda memiliki akses ke cookie lintas situs

Panggil API (rSA atau rSAFor) dari situs yang sedang diuji dan validasi akses ke cookie lintas situs.

Lakukan langkah-langkah berikut untuk mendeklarasikan hubungan antara domain dan menentukan subhimpunan mana yang menjadi bagian dari suatu {i>subset<i}.

1. Identifikasi RWS Anda

Identifikasi domain yang relevan, termasuk kumpulan anggota dan anggota kumpulan yang akan menjadi bagian dari Set Situs Terkait. Identifikasi juga mana jenis subset yang mencakup setiap anggota kumpulan.

2. Membuat kiriman RWS

Buat salinan lokal (clone atau fork) dari Repositori GitHub. Di cabang baru, buat perubahan pada related_website_sets.JSON untuk mencerminkan set Anda. Untuk memastikan set Anda memiliki format JSON yang tepat dan Anda dapat menggunakan Alat Generator JSON.

3. Pastikan RWS Anda memenuhi persyaratan teknis

Pastikan atribut menetapkan persyaratan formasi dan menetapkan persyaratan validasi sudah diterapkan.

4. Menguji RWS secara lokal

Sebelum membuat permintaan pull (PR) untuk mengirimkan set, uji kiriman Anda secara lokal untuk memastikan set tersebut lulus semua pemeriksaan yang diwajibkan.

5. Mengirimkan RWS Anda

Kirimkan Set Situs Terkait dengan membuat Humas ke related_website_sets.JSON tempat Chrome menghosting daftar Set Situs Terkait kanonis. (GitHub diperlukan untuk membuat Humas, dan Anda harus menandatangani Perjanjian Lisensi Kontributor (CLA) sebelum Anda dapat berkontribusi pada daftar.)

Setelah PR dibuat, serangkaian pemeriksaan diselesaikan untuk memastikan bahwa persyaratan dari langkah 3 sudah dipenuhi, seperti memastikan bahwa Anda telah menandatangani CLA dan bahwa file .well-known valid.

Jika berhasil, PR akan menunjukkan bahwa pemeriksaan telah lulus. Humas yang Disetujui akan digabungkan secara manual dalam beberapa batch ke daftar Set Situs Terkait kanonis sekali per minggu (Selasa pukul 12 siang Waktu Timur). Jika ada pemeriksaan yang gagal, pengirim akan diberi tahu melalui kegagalan PR di GitHub. Pengirim dapat memperbaiki kesalahan dan memperbarui PR, dan mengingat bahwa:

  • Jika PR gagal, pesan error akan memberikan informasi tambahan tentang alasan pengiriman mungkin gagal. (contoh).
  • Semua pemeriksaan teknis yang mengatur pengiriman set dilakukan di GitHub, dan sebagai akibatnya, semua kegagalan pengiriman yang disebabkan oleh pemeriksaan teknis akan dapat dilihat di GitHub.

Kebijakan perusahaan

Chrome menerapkan dua kebijakan untuk memenuhi kebutuhan pengguna versi bisnis:

  • Sistem yang mungkin tidak dapat berintegrasi dengan Set Situs Terkait dapat menonaktifkan fitur Set Situs Terkait di semua instance Chrome perusahaan dengan kebijakan RelatedWebsiteSetsEnabled.
  • Beberapa sistem perusahaan memiliki situs khusus internal (seperti intranet) dengan domain yang dapat didaftarkan yang berbeda dengan domain di Set Situs Terkait. Jika mereka perlu memperlakukan situs ini sebagai bagian dari Set Situs Terkait tanpa mengeksposnya ke publik (karena domainnya mungkin rahasia), mereka dapat menambah atau mengganti daftar Set Situs Terkait publik mereka dengan kebijakan RelatedWebsiteSetsOverrides.

Chrome menyelesaikan perpotongan apa pun dari kumpulan publik dan Enterprise dalam salah satu dari dua cara, bergantung pada apakah replacemements atau additions ditentukan atau tidak.

Misalnya, untuk kumpulan publik {primary: A, associated: [B, C]}:

replacements: {primary: C, associated: [D, E]}
Set perusahaan menyerap situs umum untuk membentuk set baru.
Set hasil: {primary: A, associated: [B]}
{primary: C, associated: [D, E]}
additions: {primary: C, associated: [D, E]}
Set Public dan Enterprise digabungkan.
Hasil set: {primary: C, associated: [A, B, D, E]}

"Perintah pengguna" dan "{i>user gestur<i}"

"Perintah pengguna" dan "{i>user gestur<i}" adalah hal yang berbeda. Chrome tidak akan menampilkan dialog izin kepada pengguna untuk situs yang berada dalam Set Situs Terkait yang sama, tetapi Chrome tetap mengharuskan pengguna untuk berinteraksi dengan halaman. Sebelum memberikan izin, Chrome memerlukan gestur pengguna, disebut juga sebagai “interaksi pengguna” atau "aktivasi pengguna". Hal ini karena penggunaan Storage Access API di luar konteks Set Situs Terkait (yaitu requestStorageAccess()) juga memerlukan gestur pengguna, karena prinsip desain platform web.

Akses situs lain cookie atau penyimpanan

Set Situs Terkait tidak menggabungkan penyimpanan untuk situs yang berbeda: set ini hanya memungkinkan panggilan requestStorageAccess() yang lebih mudah (tanpa perintah). Situs Terkait Menetapkan hanya mengurangi hambatan pengguna dalam menggunakan Storage Access API, tetapi tidak mendikte apa yang harus dilakukan setelah akses dipulihkan. Jika A dan B adalah situs yang berbeda dalam Set Situs Terkait yang sama, dan A sematan B, B dapat memanggil requestStorageAccess() dan dapatkan akses ke penyimpanan pihak pertama tanpa meminta izin pengguna. Set Situs Terkait tidak melakukan komunikasi lintas situs. Sebagai menyiapkan Set Situs Terkait tidak akan menyebabkan cookie milik ke B untuk mulai dikirim ke A. Jika Anda membagikan data tersebut, Anda harus membagikannya sendiri, misalnya dengan mengirimkan window.postMessage dari iframe B ke Sebuah {i>frame<i}.

Set Situs Terkait tidak mengizinkan akses cookie yang tidak dipartisi secara implisit tanpa memanggil API apa pun. Cookie lintas situs tidak tersedia secara default dalam kumpulan; Set Situs Terkait hanya mengizinkan situs dalam set untuk lewati permintaan izin Storage Access API. iframe harus memanggil document.requestStorageAccess() jika ingin mengakses cookie, atau halaman tingkat atas dapat memanggil document.requestStorageAccessFor().

Berikan masukan

Mengirimkan set di GitHub serta menggunakan Storage Access API dan requestStorageAccessFor API adalah kesempatan untuk membagikan pengalaman Anda terkait proses dan masalah apa pun yang Anda hadapi.

Untuk mengikuti diskusi tentang Set Situs Terkait: