Brugere og data på enheden
Browserlagring og sikker logout: efterlad ikke brugerdata på enheden
En webapp kan logge brugeren ud på serveren og stadig efterlade kundekort, kladder, søgninger eller filer i browseren. Det bliver et sikkerhedsproblem på en delt computer, ved kontoskift og efter en mistet enhed. Samtidig kan en for hård oprydning slette usynkroniseret arbejde. Derfor skal hver lokal kopi have et formål, en ejer og en klar regel for, hvornår den slettes.
Udgivet 11. oktober 2026 · Ca. 11 minutters læsetid
Det korte svar
Behandl logout som mere end en omdirigering til login-siden. Den aktive session skal ugyldiggøres dér, hvor den kan bruges, og browseren skal stoppe aktive forbindelser, fjerne den konkrete brugers lokale data og forhindre følsomme svar i at dukke op igen fra cache. Test derefter med tilbageknap, offline-tilstand, flere faner og en anden bruger i samme browserprofil.
Logout har to sider
Oprydning i browseren beskytter den lokale enhed, men erstatter ikke tilbagekaldelse af sessionen på serveren eller hos loginudbyderen. Omvendt fjerner en lukket session ikke automatisk data, som allerede ligger i IndexedDB, Cache API eller browserens HTTP-cache.
Find alle steder, browseren kan huske noget
Åbn browserens udviklerværktøjer og gennemgå lagring og netværk efter et realistisk brugerforløb. Kodesøgning efter enkelte API-navne er nyttig, men den finder ikke altid data, som et auth-bibliotek, en service worker eller en tredjepartspakke gemmer.
| Lager | Typisk levetid | Det skal kontrolleres |
|---|---|---|
| localStorage | Overlever normalt lukning og genstart af browseren | Tokens, bruger-id, filtre, skjulte kopier af poster og data fra andre apps på samme origin |
| sessionStorage | Følger fanens session og overlever genindlæsning | Kladder, retur-URL'er og antagelsen om, at “session” er det samme som logout |
| IndexedDB | Vedvarende, indtil appen, browseren eller brugeren rydder den | Offline-poster, vedhæftninger, køer, søgeindeks og data pr. bruger eller virksomhed |
| Cache API og service worker | Styres af appens cachelogik og browserens lagerpolitik | Om autentificerede API-svar eller dokumenter er cachet sammen med offentlige appfiler |
| HTTP-cache | Styres af responsens cache-headere og browseradfærd | Personlige sider, downloads, tilbageknap og delte caches |
| Cookies og auth-SDK | Afhænger af cookie, udbyder og valgt persistens | Sessioncookie, refresh-token, flere faner og om sign-out faktisk tilbagekalder adgang |
MDN beskriver, at localStoragedeles inden for samme origin og normalt overlever en genstart, menssessionStorage er knyttet til fanens session. IndexedDB og Cache API er andre, separate lagre. Et tomt localStorage beviser derfor ikke, at browseren er ryddet.
Vælg hvad der må overleve – og hvorfor
Lav en lille lagringsoversigt med datakategori, teknisk lager, bruger- eller virksomhedstilknytning, ønsket levetid, oprydningshændelse og konsekvens ved tab eller eksponering. “Det gør biblioteket automatisk” er ikke en dokumenteret politik.
- Offentlige appfiler: Kan ofte caches længe, når filnavne versionsstyres, fordi de ikke indeholder brugerdata.
- Ufarlige præferencer: Tema eller tabelvisning kan typisk overleve logout, hvis de ikke afslører identitet, rolle eller kundedata.
- Brugerdata: Knyt cache og offline-poster til en stabil bruger- og virksomhedsnøgle, og fjern dem ved logout eller kontoskift efter den aftalte regel.
- Usynkroniserede kladder: Beslut om de skal synkroniseres, eksporteres, slettes eller bevares krypteret. Informér brugeren før en destruktiv oprydning.
- Sessionshemmeligheder: OWASP fraråder sessions-id'er i localStorage, fordi JavaScript kan læse lageret. Vælg sessionmekanisme efter arkitektur og risiko; en HttpOnly-cookie kan begrænse JavaScript-adgang, men kræver stadig korrekt cookie- og CSRF-beskyttelse.
Lokal browserlagring bør ikke være den eneste kopi af forretningskritiske data. Browseren kan afvise en skrivning ved opbrugt kvote, og standardlagring kan blive slettet under lagerpres. Appen skal vise, om en kladde kun findes lokalt, afventer synkronisering eller er bekræftet på serveren.
Styr HTTP-cache pr. type svar
HTTP-cache er ikke det samme som appens egen Cache API. Sæt cache-headere på serverens svar ud fra indholdet. MDN præciserer, atno-cachestadig tillader lagring, men kræver validering før almindelig genbrug. Hvis et følsomt svar slet ikke må gemmes, erno-storedet relevante direktiv.
Offentlige, versionsstyrede filer
Cache dem effektivt efter platformens anbefalinger. De må ikke indeholde personlige svar eller runtime-secrets.
Følsomme eller sessionsbundne svar
Brug en bevidst, testet politik. OWASP anbefaler no-store til svar med sessions-id eller følsomme sessionsdata.
Tilbageknappen kræver sin egen test. Browsere kan gendanne et øjebliksbillede gennem back/forward-cache uden et nyt netværkskald. Appens klienttilstand skal derfor også reagere på en afsluttet session og må ikke vise den gamle brugers data som aktive.
Gør logout til en kontrolleret tilstandsændring
- 1. Afslut sessionen autoritativt. Brug loginudbyderens eller backendens sign-out og tilbagekaldelse efter den valgte sessionsmodel. En slettet UI-variabel er ikke nok.
- 2. Stop aktive dataveje. Afmeld realtidslyttere, stop forespørgsler og baggrundssynkronisering, og sørg for at gamle async-svar ikke kan skrive data tilbage efter logout.
- 3. Håndtér lokale kladder. Synkronisér, eksportér eller bed om en tydelig beslutning, før ikke-gemte ændringer fjernes.
- 4. Ryd den rigtige brugers data. Fjern bruger- og virksomhedsspecifikke poster fra Web Storage, IndexedDB og appens caches uden at slette nødvendige data for en anden aktiv konto.
- 5. Nulstil klienttilstanden. Tøm in-memory caches, valgte poster, downloadlinks og fejltilstande, og send brugeren til en side uden følsomt indhold.
- 6. Synkronisér faner. Afklar hvordan logout og kontoskift opdages i andre åbne faner. De skal stoppe beskyttede kald og skjule den gamle tilstand.
Et konkret bibliotek kan have andre standarder. Firebase Authentication bruger for eksempel som udgangspunkt lokal persistens i webbrowseren, mens session- og hukommelsesbaseret persistens også findes. Kontrollér den faktiske version og opsætning i jeres loginløsning i stedet for at antage, at fanen styrer levetiden.
Brug Clear-Site-Data med præcision
En logout-respons over HTTPS kan bruge HTTP-headerenClear-Site-Datatil at bede browseren fjerne valgte typer data som cache, cookies og storage. Det kan være et nyttigt ekstra sikkerhedsnet, men bør ikke indsættes ukritisk.
- Vælg direktiver efter appens reelle lagring; et globalt wildcard kan fjerne mere end hensigten.
- Kontrollér domæne- og origin-grænser. Cookie-oprydning kan påvirke relaterede subdomæner, mens flere apps på samme origin kan dele lager.
- Test de browsere og enheder, virksomheden understøtter, fordi enkelte dele af headeren kan have forskellig understøttelse.
- Bevar eksplicit oprydning i appen og server-side sessionstilbagekaldelse. Headeren er ikke en erstatning for nogen af delene.
Afprøv en delt enhed og et kontoskift
En god test bruger to konti med tydeligt forskellige data. Kør den i et realistisk browsermiljø og gentag den med både netværk og offline-tilstand.
- Bruger A logger ind. Åbn følsomme poster, søg, hent en fil, opret en lokal kladde og lad mindst to faner stå åbne.
- A logger ud. Kontrollér netværksrespons, cookies, localStorage, sessionStorage, IndexedDB, Cache API og aktive service workers.
- Prøv rester. Brug tilbage- og fremknap, genindlæs, gå offline, åbn et tidligere downloadlink, og genstart browseren.
- Bruger B logger ind. Ingen data, filtre, kladder, forslag eller realtime-opdateringer fra A må kunne ses eller sendes.
- Kontrollér serveren. Forsøg et beskyttet API-kald med den gamle session. Det skal afvises, selv hvis en gammel fane stadig har klientkode og data.
Gem testen som en fast releasekontrol, når login, offline-funktion, service worker, cachepolitik eller domæneopsætning ændres.
Typiske fejl
- Logout ændrer kun skærmbilledet: Refresh-token eller server-session virker stadig fra en gammel fane.
- Kun localStorage ryddes: IndexedDB, service-worker-cache og in-memory state indeholder stadig den gamle brugers data.
- Hele origin ryddes uden analyse: En anden app, nødvendig enhedsopsætning eller usynkroniseret kladde forsvinder.
- no-cache læses som “gem ikke”: Svaret kan fortsat lagres og genbruges efter validering.
- Offlinedata mangler ejer: Konto B overtager en kø eller kladde, som blev oprettet af konto A.
- Kun online-flowet testes: Tilbageknap, genstart og offline-visning afslører gamle data efter logout.
Tjekliste til browserlagring og logout
- ☐ Web Storage, IndexedDB, Cache API, HTTP-cache, cookies, auth-SDK og klientcache er kortlagt.
- ☐ Hver lokal datatype har formål, ejer, brugerkontekst, levetid og oprydningshændelse.
- ☐ Sessions-id'er og andre følsomme tokens ligger ikke ukritisk i JavaScript-læsbar lagring.
- ☐ Usynkroniserede kladder har en synlig og testet politik for logout og kontoskift.
- ☐ Følsomme HTTP-svar har en bevidst cachepolitik, og no-cache forveksles ikke med no-store.
- ☐ Logout stopper session, lyttere, baggrundssynkronisering og sene async-svar.
- ☐ Oprydningen er afgrænset, så den ikke rammer andre apps eller den forkerte bruger.
- ☐ Andre åbne faner reagerer på logout og kontoskift.
- ☐ Bruger A → logout → offline/tilbageknap → bruger B er testet på understøttede browsere.
- ☐ Den gamle server-session afvises, selv hvis browseroprydningen fejler.
Relaterede guides
Officielle kilder
Browseradfærd, SDK-standarder og understøttelse ændrer sig. Kontrollér altid den konkrete browsermatrix, auth-udbyder og service-worker-opsætning, før en logout-politik bruges i produktion.
Kan den gamle bruger stadig ses efter logout?
I Startklar gennemgår vi appens login, lokale lagring, service worker, cache-headere og dataflow på de enheder, medarbejdere eller kunder faktisk bruger. Målet er en afgrænset oprydnings- og testplan, der beskytter data uden at slette arbejde i blinde.
Se Startklar-forløbet