Méně známá HTTP hlavička "Clear-Site-Data" dokáže být velmi užitečná. Umí totiž prohlížeči přikázat, aby smazal všechny stopy po návštěvě daného webu. To se hodí zejména při odhlášení uživatele.
Princip jejího fungování je jednoduchý. Server může s HTTPS odpovědí (celé to, stejně jako všechna nová API, funguje jenom přes HTTPS) poslat klientovi hlavičku Clear-Site-Data
. Hodnotou této hlavičky mohou být následující tokeny, oddělené čárkami (pozor, uvozovky jsou součástí tokenu):
Název | Význam |
---|---|
"cache" |
Experimentální. Položky v HTTP cache. Browser může vymazat i související věci, jako třeba návrhy v adresním řádku apod. |
"cookies" |
Cookies pro doménu, ve které se nachází origin, a všechny její subdomény. Také HTTP autentizace (např. Basic Authentication). |
"storage" |
Různé formy storage, např. Local/Session Storage, IndexedDB a další. |
"executionContexts" |
Experimentální, nefunguje v Chrome et al. Refreshnout otevřené záložky na tomtéž originu. |
"*" |
Nefunguje v Chrome et al. Všechna data, která lze smazat. |
Co dobře funguje v současných prohlížečích, jsou hodnoty "cache", "cookies", "storage"
. Problém je s hodnotami "executionContexts"
a "*"
. Jediný browser, který podle MDN podporuje hodnotu "executionContexts"
je Samsung Internet Browser. Firefox sice tuto hodnotu neimplementuje, ale ignoruje ji. Problém je s browsery, které jsou založeny na jádře Chromium (tj. Chrome, Edge, Opera a spousta dalších). Ty totiž v případě, že je přítomna hodnota "executionContexts"
nebo "*"
ignorují celou hlavičku a nevymažou nic. Jedná se o známý bug, který je reportován již od roku 2018 a zatím (v srpnu 2023, kdy píšu tento článek) nebyl vyřešen.
Kdy a jak tuto hlavičku použít?
Typickým kandidátem pro použití této hlavičky je proces odhlášení uživatele. Kód (implementovaný pomocí Minimal API) pro odhlášení a smazání stop může vypadat například takto:
app.MapGet("/logout", async (HttpContext c, SignInManager<ApplicationUser> signInManager) => {
// Sign out the user
if (signInManager.IsSignedIn(c.User)) await signInManager.SignOutAsync();
// Add the Clear-Site-Data header to the response
// Do not use "*", due to a bug #898503 in Chromium-based browsers
c.Response.Headers.Add("Clear-Site-Data", "\"cache\", \"cookies\", \"storage\"");
// Redirect to the home page
return Results.Redirect("/");
});
Pokud si chcete vyzkoušet jak to funguje, připravil jsem pro vás jednoduchou ukázkovou aplikaci, kde si můžete vyzkoušet mazání cookies a local storage.