Strona główna >JavaScript >Nowoczesny JavaScript >Zapisywanie danych w przeglądarce (localStorage)

Zapisywanie danych w przeglądarce (localStorage)

Zamknięte powiadomienie, wybrany motyw kolorów, do połowy wypełniony formularz – drobiazgi, które strona ma zapamiętać w przeglądarce, trafiają do localStorage. Jak bezpiecznie pracować z pamięcią, jak zapisywać obiekty i czego do niej nie wkładać.

Funkcje pomocnicze

Pamięć przyjmuje tylko tekst, dlatego obiekty i tablice zamienia się na JSON. Dostęp do pamięci może się też skończyć błędem – gdy pamięć jest pełna albo użytkownik wyłączył ją w ustawieniach przeglądarki. Funkcje pomocnicze rozwiązują oba problemy:

function save(key, value) {
  try {
    localStorage.setItem(key, JSON.stringify(value));
    return true;
  } catch (error) {
    return false;
  }
}
function load(key, fallback) {
  try {
    const text = localStorage.getItem(key);
    return text === null ? fallback : JSON.parse(text);
  } catch (error) {
    return fallback;
  }
}
save("favorites", [2, 5]);
console.log(load("favorites", []).length);   // 2
console.log(load("does-not-exist", "domyślna"));   // domyślna

Funkcja load zwraca wartość domyślną także wtedy, gdy w pamięci jest uszkodzony tekst, którego nie da się odczytać jako JSON.

Przykład: zamknięte powiadomienie

<div id="notice">
  Nowy sklep internetowy jest już otwarty!
  <button type="button" id="close">Zamknij</button>
</div>
const notice = document.querySelector("#notice");
if (load("notice-closed", false)) {
  notice.hidden = true;
}
document.querySelector("#close").addEventListener("click", () => {
  notice.hidden = true;
  save("notice-closed", true);
});

Po kliknięciu Zamknij powiadomienie zniknie i pozostanie ukryte także po wczytaniu innej strony lub zamknięciu przeglądarki.

Warto wiedzieć

  • localStorage zostaje na stałe, dopóki danych nie usunie strona albo użytkownik. sessionStorage ma te same metody, ale dotyczy tylko jednej karty i znika po jej zamknięciu.
  • Pamięć należy do adresu witryny – do połączenia protokołu, domeny i portu. Witryna pod https://www.example.com nie widzi danych witryny pod https://example.com.
  • Przeglądarki dają każdej witrynie mniej więcej 5 MB (stan na: październik 2026, zależnie od przeglądarki). Na większe dane jest IndexedDB.
  • Gdy pamięć zmieni się w innej karcie tej samej witryny, pozostałe otwarte karty dostaną zdarzenie storage – karty mogą się tak nawzajem aktualizować. Safari (silnik WebKit) wysyła je jednak tylko do strony, która już pracowała z localStorage (stan na: październik 2026). Strona czekająca na zmiany powinna więc przynajmniej raz odczytać pamięć, na przykład przy wczytaniu.
  • W odróżnieniu od ciasteczek dane z pamięci nie są wysyłane na serwer. Serwer dowie się o nich dopiero wtedy, gdy wyśle je JavaScript.

Czego nie trzymać w pamięci

Każdy skrypt na stronie może odczytać pamięć, także skrypt wstrzyknięty atakiem XSS. Hasła, tokeny logowania i dane osobowe nie powinny tam trafiać. Logowanie zostaw sesji w PHP z ciasteczkiem HttpOnly, którego JavaScript nie może odczytać.

Powiązane artykuły:
Bezpieczne sesje i logowanie
Zmiana treści i klas bez jQuery