#2 passage à localStorage, avec fallback cookie