DEV Community

Cover image for A Guide to Web Storage: LocalStorage, Sessions, Cookies & More
Austin W
Austin W

Posted on

A Guide to Web Storage: LocalStorage, Sessions, Cookies & More

👋 Let's Connect! Follow me on GitHub for new projects.


Introduction

When building web applications, choosing the right storage mechanism is crucial for performance, security, and user experience. Web developers often juggle multiple storage options such as LocalStorage, SessionStorage, Cookies, IndexedDB, SQLite, Web SQL, and Cache API. Each has its own strengths, weaknesses, and ideal use cases.

In this article, we’ll explore the various storage types available in modern web applications, with examples demonstrating how to use them effectively.


1. LocalStorage

Overview

LocalStorage is a key-value storage mechanism available in browsers that allows data to persist even after the user closes the browser.

Characteristics

✔ Stores up to 5MB per origin.

✔ Data persists indefinitely unless explicitly removed.

Synchronous API, which may block the main thread on large operations.

✔ Accessible via window.localStorage.

Usage Example

// Storing data
localStorage.setItem("username", "Austin");

// Retrieving data
const user = localStorage.getItem("username");
console.log(user); // Output: Austin

// Removing data
localStorage.removeItem("username");

// Clearing all localStorage
localStorage.clear();
Enter fullscreen mode Exit fullscreen mode

Best Use Cases

✅ Storing user preferences (e.g., theme settings).

✅ Caching small application data.

Not recommended for sensitive data due to lack of encryption.


2. SessionStorage

Overview

SessionStorage is similar to LocalStorage but persists only for the duration of the session.

Characteristics

✔ Stores up to 5MB per origin.

✔ Data expires when the user closes the tab or browser.

Synchronous API, just like LocalStorage.

Usage Example

// Storing session data
sessionStorage.setItem("sessionID", "123456");

// Retrieving data
const sessionId = sessionStorage.getItem("sessionID");
console.log(sessionId); // Output: 123456

// Removing session data
sessionStorage.removeItem("sessionID");

// Clearing all sessionStorage
sessionStorage.clear();
Enter fullscreen mode Exit fullscreen mode

Best Use Cases

Temporary session data (e.g., form drafts, multi-step forms).

✅ Data that should not persist across sessions.


3. Cookies

Overview

Cookies store small pieces of data that can be sent back to the server with HTTP requests. They are commonly used for authentication and tracking.

Characteristics

✔ Maximum size: 4KB per cookie.

✔ Data persists based on expiration settings.

✔ Accessible both on the client and server side.

✔ Automatically sent with HTTP requests.

Usage Example

Setting a Cookie

document.cookie = "user=John; expires=Fri, 31 Dec 2025 23:59:59 GMT; path=/";
Enter fullscreen mode Exit fullscreen mode

Retrieving a Cookie

console.log(document.cookie); // Output: user=John
Enter fullscreen mode Exit fullscreen mode

Deleting a Cookie

document.cookie = "user=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/";
Enter fullscreen mode Exit fullscreen mode

Best Use Cases

Authentication tokens (when using HttpOnly and Secure flags).

User preferences that need to be sent to the server.

Session tracking for analytics.


4. IndexedDB

Overview

IndexedDB is a client-side NoSQL database that enables structured data storage, including objects and files.

Characteristics

Asynchronous API, preventing UI blocking.

✔ Stores up to hundreds of MBs per origin.

✔ Supports transactions, indexes, and queries.

✔ Works well for large-scale data storage.

Usage Example

const request = indexedDB.open("myDatabase", 1);

request.onupgradeneeded = function(event) {
    let db = event.target.result;
    db.createObjectStore("users", { keyPath: "id" });
};

request.onsuccess = function(event) {
    let db = event.target.result;
    let transaction = db.transaction("users", "readwrite");
    let store = transaction.objectStore("users");

    store.add({ id: 1, name: "Austin" });

    store.get(1).onsuccess = function(event) {
        console.log(event.target.result); // Output: {id: 1, name: "Austin"}
    };
};
Enter fullscreen mode Exit fullscreen mode

Best Use Cases

Offline applications (e.g., Progressive Web Apps - PWAs).

Storing large structured data.

Replacing LocalStorage for complex storage needs.


5. SQLite

Overview

SQLite is a lightweight relational database that runs as a single file, often used in desktop, mobile, and server applications.

Characteristics

SQL-based, providing relational storage.

Works offline without requiring a database server.

✔ Used in Electron apps, mobile apps (React Native, Flutter), and some browser extensions.

Usage Example (Node.js)

const sqlite3 = require('sqlite3').verbose();
let db = new sqlite3.Database(':memory:');

db.serialize(() => {
    db.run("CREATE TABLE users (id INT, name TEXT)");
    db.run("INSERT INTO users (id, name) VALUES (1, 'Austin')");

    db.each("SELECT id, name FROM users", (err, row) => {
        console.log(row.id + ": " + row.name);
    });
});

db.close();
Enter fullscreen mode Exit fullscreen mode

Best Use Cases

Persistent structured storage in desktop and mobile apps.

Lightweight database needs without requiring a server.


6. Web SQL (Deprecated)

Overview

Web SQL provided SQL-based storage in browsers but was deprecated due to lack of adoption.

Characteristics

🚫 Deprecated by the W3C and not recommended for new projects.

🚫 Only supported in Chrome and Safari (not Firefox or Edge).


7. Cache API (Service Workers)

Overview

The Cache API allows service workers to store and retrieve HTTP responses, enabling offline-first experiences.

Characteristics

✔ Stores HTTP responses, making apps load faster.

✔ Works offline with Service Workers.

✔ Used in Progressive Web Apps (PWAs).

Usage Example

caches.open("my-cache").then(cache => {
    cache.add("/styles.css");
});

// Retrieving cached data
caches.match("/styles.css").then(response => {
    if (response) {
        console.log("Cached response found!", response);
    }
});
Enter fullscreen mode Exit fullscreen mode

Best Use Cases

Caching assets for performance (e.g., stylesheets, images).

Offline capabilities in PWAs.


Comparison Table

Storage Type Size Limit Persistence Accessible by Server? Asynchronous? Best Use Case
LocalStorage 5MB Permanent ❌ No ❌ No User settings, caching
SessionStorage 5MB Until tab closes ❌ No ❌ No Temporary data
Cookies 4KB Configurable ✅ Yes ❌ No Authentication, tracking
IndexedDB Hundreds of MBs Permanent ❌ No ✅ Yes Large structured data
SQLite GBs Permanent ✅ Yes (for apps) ✅ Yes Database storage
Cache API Varies Configurable ❌ No ✅ Yes Caching assets

Conclusion

Choosing the right storage method depends on data size, persistence needs, security, and performance.

  • For small user data: Use LocalStorage or SessionStorage.
  • For authentication & tracking: Use Cookies.
  • For large structured data: Use IndexedDB or SQLite.
  • For offline caching: Use Cache API.

Meta Description

Explore LocalStorage, Cookies, IndexedDB, SQLite, and more! Learn how each web storage solution works with real-world examples.


TLDR – Highlights for Skimmers

  • LocalStorage & SessionStorage for simple key-value storage.
  • Cookies for authentication and server communication.
  • IndexedDB for structured, offline storage.
  • SQLite for database-like storage in apps.
  • Cache API for offline-first strategies.

What storage solution do you use the most? Let us know in the comments!

Top comments (0)