Коротко
Все три хранят данные на клиенте, но отличаются временем жизни, доступностью и отправкой на сервер.
Сравнение
| cookie | localStorage | sessionStorage |
|---|
| Уходит на сервер | да (если не ограничено) | нет | нет |
| Размер | ~4 KB | ~5+ MB | ~5+ MB |
| Срок | expires/max-age | пока не удалят | вкладка/сессия |
| Доступ из JS | document.cookie (если не HttpOnly) | да | да |
document.cookie = 'theme=dark; Secure; SameSite=Lax';
localStorage.setItem('theme', 'dark');
sessionStorage.setItem('step', '2');
Итог
Сессия auth — httpOnly cookie; клиентские настройки — Storage; не храните секреты в Storage.