Где угодно, но в зашифрованном виде и с флагами secure и http-only.
Доп.защита: Можно разместить в localStorage контрольную сумму полученного токена и тупо проверять его наличие в js и на соответствие конкретному значению, привязанному к клиенту. Любое обращение без подписи запроса этой КС - фиксировать как нарушение и блокировать учётку.
Главное - привяжите токен к клиенту через fingerprint2.js при двухфакторной аутентификации клиента.
Чтобы при хищении даже всех кук (например, через сторонние расширения), они были бы попросту бесполезны, "отпечаток" клиента передавайте при:
1. Авторизации (только двухфакторная аутентификация: почта, смс, GA и т.п.),
2. При смене ip-адреса
3. При смене user-agent
4. По истечению срока давности
И обязательно это всё через шифрование своим публичным "ключом" сервера (помимо https!).