Gdy użytkownik wylogowuje się ze strony, sygnalizuje, że chce całkowicie zrezygnować ze spersonalizowanych funkcji. Dlatego ważne jest, aby jak najdokładniej odzwierciedlać model mentalny użytkownika. Na przykład prawidłowe wylogowanie powinno uwzględniać karty, które użytkownik mógł otworzyć przed podjęciem decyzji o wylogowaniu.
Kluczem do zapewnienia użytkownikom pozytywnych wrażeń podczas wylogowywania jest zachowanie spójności pod względem wizualnym i stanu. Ten przewodnik zawiera konkretne porady dotyczące tego, na co należy zwrócić uwagę i jak zapewnić użytkownikom wygodę podczas wylogowywania.
Najważniejsze kwestie
Wdrażając funkcję wylogowywania w witrynie, zwróć uwagę na te aspekty, aby zapewnić płynny, bezpieczny i intuicyjny proces wylogowywania:
- Jasny i spójny interfejs użytkownika do wylogowywania się: udostępnij wyraźny i stale widoczny przycisk lub link do wylogowywania się, który jest łatwo rozpoznawalny i dostępny w całej witrynie. Unikaj używania niejednoznacznych etykiet lub ukrywania funkcji wylogowywania w niejasnych menu, podstronach lub innych nieintuicyjnych miejscach.
- Potwierdzenie: przed zakończeniem procesu wylogowywania wdróż potwierdzenie. Może to zapobiec przypadkowemu wylogowaniu się użytkowników i umożliwić im ponowne rozważenie, czy naprawdę muszą się wylogować – na przykład jeśli starannie blokują urządzenie silnym hasłem lub innym mechanizmem uwierzytelniania.
- Obsługa wielu kart: jeśli użytkownik otworzył kilka stron z tej samej witryny na różnych kartach, upewnij się, że wylogowanie się z jednej karty powoduje aktualizację wszystkich innych otwartych kart z tej witryny.
- Przekierowanie na bezpieczną stronę docelową: po wylogowaniu się użytkownika przekieruj go na bezpieczną stronę docelową, która wyraźnie wskazuje, że nie jest już zalogowany. Unikaj przekierowywania użytkowników na strony zawierające spersonalizowane informacje. Podobnie sprawdź, czy na innych kartach nie widać już stanu zalogowania. Upewnij się też, że nie tworzysz otwartego przekierowania, które mogą wykorzystać osoby atakujące.
- Czyszczenie sesji: po wylogowaniu użytkownika całkowicie usuń wszystkie poufne dane sesji użytkownika, pliki cookie lub pliki tymczasowe powiązane z sesją użytkownika. Zapobiega to nieautoryzowanemu dostępowi do informacji o użytkowniku lub aktywności na koncie, a także uniemożliwia przeglądarce przywracanie stron z informacjami poufnymi z różnych pamięci podręcznych, w szczególności z pamięci podręcznej przycisków „Wstecz” i „Dalej”.
- Obsługa błędów i informacje zwrotne: wyświetlaj użytkownikom jasne komunikaty o błędach lub informacje zwrotne, jeśli podczas wylogowywania wystąpią problemy. Jeśli proces wylogowywania się nie powiedzie, poinformuj użytkowników o potencjalnych zagrożeniach dla bezpieczeństwa lub wyciekach danych.
- Ułatwienia dostępu: upewnij się, że mechanizm wylogowywania jest dostępny dla użytkowników z niepełnosprawnościami, w tym dla osób korzystających z technologii wspomagających, takich jak czytniki ekranu lub nawigacja za pomocą klawiatury.
- Zgodność z różnymi przeglądarkami: przetestuj funkcję wylogowywania w różnych przeglądarkach i na różnych urządzeniach, aby mieć pewność, że działa spójnie i niezawodnie.
- Ciągłe monitorowanie i aktualizacje: regularnie monitoruj proces wylogowywania pod kątem potencjalnych luk w zabezpieczeniach. Wprowadzaj aktualizacje i poprawki na czas, aby rozwiązywać wykryte problemy.
- Federacja tożsamości: jeśli użytkownik jest zalogowany przy użyciu tożsamości sfederowanej, sprawdź, czy wylogowanie się z usługi dostawcy tożsamości jest obsługiwane i potrzebne. Jeśli dostawca tożsamości obsługuje automatyczne logowanie, nie zapomnij zapobiec jego działaniu.
DO
- Jeśli w ramach procesu wylogowywania (lub innych procesów unieważniania dostępu) unieważnisz plik cookie na serwerze, pamiętaj, aby usunąć go również z urządzenia użytkownika.
- Usuń wszelkie dane wrażliwe, które mogły zostać zapisane na urządzeniu użytkownika: pliki cookie, localStorage, sessionStorage, indexedDB, CacheStorage i inne lokalne magazyny danych.
- Upewnij się, że wszystkie zasoby zawierające dane wrażliwe, w szczególności dokumenty HTML, są zwracane z nagłówkiem HTTP
Cache-control: no-store
, aby przeglądarka nie przechowywała tych zasobów w pamięci trwałej (np. na dysku). Podobnie wywołania XHR/fetch
, które zwracają dane wrażliwe, powinny też ustawiać nagłówek HTTPCache-Control: no-store
, aby zapobiec zapisywaniu w pamięci podręcznej. - Upewnij się, że wszystkie otwarte karty na urządzeniu użytkownika są aktualne w zakresie cofnięcia dostępu po stronie serwera.
Usuwanie danych wrażliwych po wylogowaniu
Po wylogowaniu rozważ wyczyszczenie efemerycznych i lokalnie przechowywanych danych wrażliwych. Skupienie się na danych wrażliwych wynika z faktu, że wyczyszczenie wszystkich danych spowodowałoby znacznie gorsze wrażenia użytkownika, ponieważ może on wrócić. Jeśli na przykład usuniesz wszystkie dane przechowywane lokalnie, użytkownicy będą musieli ponownie potwierdzić zgody na pliki cookie i przejść inne procesy tak, jakby nigdy wcześniej nie odwiedzili Twojej witryny.
Jak usunąć pliki cookie
W odpowiedzi dotyczącej strony, która potwierdza wylogowanie, dołącz nagłówki HTTP Set-Cookie
, aby wyczyścić wszystkie pliki cookie powiązane z danymi wrażliwymi lub je zawierające. Ustaw wartość expires
na datę w odległej przeszłości, a wartość pliku cookie na pusty ciąg znaków.
Set-Cookie: sensitivecookie1=; expires=Thu, 01 Jan 1970 00:00:00 GMT; secure
Set-Cookie: sensitivecookie2=; expires=Thu, 01 Jan 1970 00:00:00 GMT; secure
...
Scenariusz offline
Opisane powyżej podejście jest wystarczające w przypadku ogólnych zastosowań, ale nie działa, gdy użytkownik pracuje w trybie offline. Aby śledzić stan zalogowania, możesz wymagać 2 plików cookie: jednego bezpiecznego pliku cookie dostępnego tylko przez HTTPS i jednego zwykłego pliku cookie dostępnego przez JavaScript. Jeśli użytkownik próbuje się wylogować w trybie offline, możesz wyczyścić plik cookie JavaScript i w miarę możliwości przeprowadzić inne operacje czyszczenia. Jeśli masz service worker, możesz też skorzystać z interfejsu Background Fetch API, aby ponowić żądanie wyczyszczenia stanu na serwerze, gdy użytkownik będzie później online.
Jak zwolnić miejsce na dane
W odpowiedzi na stronie, która potwierdza stan wylogowania, usuń dane wrażliwe z różnych magazynów danych:
sessionStorage: chociaż jest on czyszczony, gdy użytkownik zakończy sesję w Twojej witrynie, warto aktywnie usuwać dane wrażliwe, gdy użytkownik się wyloguje, na wypadek gdyby zapomniał zamknąć wszystkie karty otwarte w Twojej witrynie.
// Remove sensitive data from sessionStorage sessionStorage.removeItem('sensitiveSessionData1'); // ... // Or if everything in sessionStorage is sensitive, clear it all sessionStorage.clear();
localStorage, indexedDB, interfejsy API pamięci podręcznej/Service Worker: gdy użytkownik się wyloguje, usuń wszystkie dane wrażliwe, które mogły zostać zapisane za pomocą tych interfejsów API, ponieważ dane te są przechowywane między sesjami.
// Remove sensitive data from localStorage: localStorage.removeItem('sensitiveData1'); // ... // Or if everything in localStorage is sensitive, clear it all: localStorage.clear();
// Delete sensitive object stores in indexedDB: const name = 'exampleDB'; const version = 1; const request = indexedDB.open(name, version); request.onsuccess = (event) => { const db = request.result; db.deleteObjectStore('sensitiveStore1'); db.deleteObjectStore('sensitiveStore2'); // ... db.close(); }
// Delete sensitive resources stored with the Cache API: caches.open('cacheV1').then((cache) => { await cache.delete("/personal/profile.png"); // ... } // Or better yet, clear a cache bucket that contains sensitive resources: caches.delete('personalizedV1');
Jak wyczyścić pamięć podręczną
- Pamięć podręczna HTTP: jeśli w przypadku zasobów zawierających dane wrażliwe ustawisz
Cache-control: no-store
, pamięć podręczna HTTP nie będzie przechowywać żadnych informacji wrażliwych. - Pamięć podręczna „wstecz/dalej”: jeśli zastosujesz się do zaleceń dotyczących
Cache-control: no-store
i czyszczenia poufnych plików cookie (np. bezpiecznych plików cookie HTTPS, które są związane z uwierzytelnianiem i dostępne tylko w tym protokole) po wylogowaniu się użytkowników, nie musisz się martwić, że poufne dane będą przechowywane w pamięci podręcznej „wstecz/dalej”. Funkcja pamięci podręcznej stanu strony internetowej usuwa strony z tej samej domeny wyświetlane z nagłówkiem HTTPCache-control: no-store
, jeśli wykryje co najmniej jeden z tych sygnałów:- Co najmniej 1 bezpieczny plik cookie, który może być używany tylko w przypadku połączeń HTTPS, został zmodyfikowany lub usunięty.
- Co najmniej jedna odpowiedź na wywołania XHR/
fetch
wysłane przez stronę zawierała nagłówek HTTPCache-control: no-store
.
Spójność działania na różnych kartach
Użytkownicy mogli otworzyć wiele kart z Twoją witryną, zanim zdecydowali się wylogować. Do tego czasu mogą zapomnieć o innych kartach, a nawet o innych oknach przeglądarki. Najlepiej nie polegać na użytkownikach, że zamkną wszystkie odpowiednie karty i okna. Zamiast tego zadbaj o to, aby stan logowania użytkownika był spójny na wszystkich kartach.
Instrukcje
Aby uzyskać spójny stan zalogowania na wszystkich kartach, rozważ użycie kombinacji zdarzeń pageshow
/pagehide
i interfejsu Broadcast Channel API.
pageshow
event: po utrwaleniupageshow
sprawdź stan logowania użytkownika i wyczyść dane wrażliwe lub nawet całą stronę, jeśli użytkownik nie jest już zalogowany. Zdarzeniepageshow
zostanie wywołane przed pierwszym renderowaniem strony po przywróceniu jej z pamięci podręcznej stanu strony internetowej. Dzięki temu sprawdzenie stanu logowania umożliwi zresetowanie strony do stanu nieobejmującego informacji poufnych.window.addEventListener('pageshow', (event) => { if (event.persisted && !document.cookie.match(/my-cookie)) { // The user has logged out. // Force a reload, or otherwise clear sensitive information right away. body.innerHTML = ''; location.reload(); } });
Broadcast Channel API: użyj tego interfejsu API, aby przekazywać zmiany stanu logowania między kartami i oknami. Jeśli użytkownik jest wylogowany, usuń wszystkie dane wrażliwe lub przekieruj go na stronę wylogowania na wszystkich kartach i we wszystkich oknach zawierających dane wrażliwe.
// Upon logout, broadcast new login state so that other tabs can clean up too: const bc = new BroadcastChannel('login-state'); bc.postMessage('logged out'); // [...] const bc = new BroadcastChannel('login-state'); bc.onMessage = (msgevt) => { if (msgevt.data === 'logged out') { // Clean up, reload or navigate to the sign-out page. // ... } }
Podsumowanie
Postępując zgodnie z wskazówkami zawartymi w tym dokumencie, możesz zaprojektować świetne środowisko wylogowywania, które zapobiega niezamierzonemu wylogowaniu i chroni dane osobowe użytkownika.