Nem minden harmadik feles cookie követ: így működik a CHIPS

A Partitioned cookie-attribútum külön állapotot ad minden beágyazó webhelynek. Chat- és térképwidgeteknél hasznos, központi SSO-sessionre viszont nem való.

Egy beágyazott chat, térkép vagy fizetési widget sokszor nem kér globális bejelentkezést; csak azt kell megjegyeznie, hogy az adott oldalon melyik beszélgetés, konfiguráció vagy terheléselosztó-változat tartozik a látogatóhoz. A hagyományos harmadik féltől származó cookie ennél többet tud: ugyanazt az azonosítót elküldheti minden, a widgetet beágyazó oldalról. Ez követésre is alkalmas, ezért a böngészők egyre szigorúbban kezelik.

Egy külső widget két külön webhelyhez tartozó, elkülönített cookie-tárolója

Erre való a CHIPS (Cookies Having Independent Partitioned State) és a Partitioned cookie-attribútum. Nem a harmadik fél cookie-ját teszi újra korlátlanul használhatóvá, hanem két kulccsal tárolja: a cookie-t kibocsátó hostja mellett a felső szintű oldal schemeful site-ja is a kulcs része. Ugyanaz a widget.example iframe így külön cookie-t kap a bolt-a.hu és a bolt-b.hu alatt.

Mit old meg, és mit nem?

Ez jó választás, ha a beágyazott szolgáltatásnak helyi, nem érzékeny állapot kell: egy ügyfélszolgálati panel nyitott beszélgetése, egy térkép nézetállapota vagy egy CDN-nek szóló, webhelyenként elkülönülő routingjelzés. A cookie továbbra is elküldhető a widget saját szerverének, amikor az iframe az adott oldalon fut; a bolt-a.hu-hoz létrejött érték viszont nem bukkan fel bolt-b.hu alatt.

Ezért nem SSO-megoldás. Ha egy identitásszolgáltató iframe-je minden ügyféloldalon ugyanazt a bejelentkezett felhasználót akarja felismerni, éppen az egységes, partíció nélküli állapot hiányzik. Ilyen esetben a Storage Access API kérhet hozzáférést a korlátozott harmadik feles, nem partícionált tárolóhoz; ehhez felhasználói interakció és böngészőfüggő engedélyezés is tartozhat. A CHIPS-et ne ezzel próbáljuk kiváltani.

Egy használható Set-Cookie fejléc

Egy cross-site iframe-ben futó widget cookie-ja például lehet ilyen:

import http from 'node:http';

const server = http.createServer((request, response) => {
  if (request.url !== '/frame') return response.writeHead(404).end();

  response.setHeader(
    'Set-Cookie',
    '__Host-widget_state=8c1f; Path=/; Max-Age=1800; ' +
      'SameSite=None; Secure; HttpOnly; Partitioned',
  );
  response.end('<p>Beágyazott widget</p>');
});

A Partitioned kötelező társa a Secure: a böngésző csak biztonságos kontextusban fogadja el. A cross-site iframe-es használathoz a SameSite=None is kell, különben a SameSite-szabályok miatt a kérés nem viszi a cookie-t. A Set-Cookie dokumentáció szerint a __Host- prefixhez Secure, Path=/ és Domain nélküli fejléc szükséges. Ez szándékosan hostra szűkíti a cookie-t, ezért widgetnél biztonságos alapértelmezés, ha nem kell aldomainnel megosztani.

A példában az HttpOnly azt jelenti, hogy a JavaScript nem olvashatja ki az értéket. Állapotot ettől még a böngésző elküld a szervernek. Az időkorlát sem dísz: a Max-Age legyen a funkcióhoz szükséges legrövidebb érték, és ne kerüljön ide felhasználói session vagy tartós, webhelyek közötti azonosító.

Nem felhasználóazonosító

Az azonos cookie-név és -érték több partícióban is létezhet. Emiatt a __Host-widget_state nem alkalmas arra, hogy a widget szolgáltatója ebből számolja az egyedi felhasználókat, vagy ebből vezesse le a központi jogosultságot. Egy látogató egy új beágyazó oldalon új, üres állapotot kap; ez a tulajdonság, nem hiba. A szerveroldalon is úgy tervezzünk, hogy a cookie egy adott beágyazás állapota, nem a böngésző univerzális identitása.

Ez adatmodellezési döntés is. A widgetnek saját, top-level oldaltól független fiókja lehet, de a partícionált cookie-ban csak egy rövid élettartamú, az adott integrációra érvényes referencia legyen. Ha a felhasználó tényleg azonosítani akarja magát, azt látható, első féltől induló beléptetési folyamattal vagy erre való federált megoldással érdemes kezelni.

A félrevezető teszt

A fejlesztői gépen könnyű úgy ellenőrizni, hogy közvetlenül megnyitjuk a widget saját domainjét. Ezzel viszont más tárolópartíciót tesztelünk, mint amikor az iframe egy ügyféloldal alatt fut. Két külön top-level tesztoldal kell: töltsük be mindkettőbe a widgetet, állítsunk be eltérő állapotot, majd nézzük meg, hogy az első oldalra visszatérve csak a saját értéke marad-e meg. A modern DevTools cookie-nézetében a partíció kulcsa is segít ezt ellenőrizni.

A kompatibilitási döntést nem szabad pusztán attribútum-felismerésre építeni. A böngészőtámogatási táblázat mellett azt is tesztelni kell, mit csinál a szolgáltatás akkor, ha nincs megőrizhető harmadik feles állapot. Egy chat esetén ez lehet új beszélgetés indítása; fizetésnél vagy beléptetésnél viszont jellemzően más integrációs terv kell.

Források

Leave a Reply

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük