Browser Storage: Cookie, LocalStorage, SessionStorage and IndexedDB
In browser there are several types of built-in data storage that can be used to save user state, cache, settings, etc.
Main Storage Types
| Storage | Volume | Availability | Lifetime | Sent to Server | Support |
|---|---|---|---|---|---|
| Cookie | ~4 KB | Server and client | Depends on Expires | Yes | All browsers |
| LocalStorage | ~5–10 MB | Client only | Until deletion | No | All browsers |
| SessionStorage | ~5–10 MB | Client only | While tab is open | No | All browsers |
| IndexedDB | 100+ MB | Client only | Until deletion | No | All browsers |
Cookie
- Allow transferring data between client and server
- Used for authorization, sessions, personalization
- Sent in every HTTP request, so should be compact
- Configured via
Set-Cookieheader ordocument.cookie
document.cookie = "theme=dark; path=/; max-age=3600";
LocalStorage
- Suitable for long-term data storage (theme, tokens, settings)
- Available only on client
- Survives browser restart
localStorage.setItem("theme", "dark");
const theme = localStorage.getItem("theme");
localStorage.removeItem("theme");
SessionStorage
- Similar to
localStorage, but lives only within one tab - After closing tab — data is deleted
sessionStorage.setItem("step", "2");
sessionStorage.getItem("step");
IndexedDB
- Asynchronous database in browser (key-value + indexes)
- Allows storing structured objects, even files
- Suitable for offline-first applications, PWA, large data
const db = indexedDB.open("MyDB", 1);
Easier to use via wrappers:
When to Use What?
| Scenario | Recommended Storage |
|---|---|
| Authorization, tokens | cookie (with Secure + HttpOnly flags) |
| User settings | localStorage |
| Temporary data | sessionStorage |
| Offline data cache, PWA | indexedDB |
Security:
Never store access tokens in LocalStorage or SessionStorage if they can be stolen via XSS. Use HttpOnly cookie.
Conclusion
- Use
cookiefor transferring between client and server - Use
localStoragefor permanent client data - Use
sessionStoragefor temporary, one-time data - Use
IndexedDBfor complex and large storage