Варианта 2 (можно использовать как по-отдельности, так и все сразу):1. Самый простой (и лучше не забывать!) вариант:
Всегда ставить флаги HttpOnly и Secure в http-заголовки, когда устанавливаете данные, которые не должны быть доступны из JS-скриптов.
Ссылки:
1.
https://www.php.net/manual/en/session.configuratio...
2.
https://www.owasp.org/index.php/HttpOnly2. Обмен токена (перевыписка) делается цепочкой:
1. Вы зарегились на сайте. Запрос на выписку НОВОГО токена генерирует JS-код браузера, обменивая хэш валидации, зависящий от IP и ClientID (User-Agent и ещё какие-то параметры) сервером на рабочий токен (
лучше - обменивать ещё и временный токен, который приходит в письме по электронной почте сразу после регистрации). Т.е., браузер НЕ ПЕРЕДАЁТ IP и ClientID в чистом виде на сервер.
2. Вы работаете и вдруг у Вас меняется IP-адрес (сессия - та же): посылается команда обмена старого токена на новый сервером на клиент (или переаутентификация/перевыписка токена в "прозрачном" режиме). До окончания успеха этой операции - все запросы от текущего клиента будут невалидны!
3. Клиент посылает в ответ HASH: CliendID, текущий (устаревший) токен и предыдущий IP-адрес, и подписывает всё какой-либо частью устаревшего токена.
4. После получения хеша от клиента, сервер анализирует хеши: если клиентский и серверный хеши верны, то сервер одобряет перевыписку (обмен устаревшего токена на новый) и возвращает новый токен. Иначе - генерирует процедуру ручной аутентификации.
Вы не испытываете неудобств, т.к. для пользователя это всё проходит незаметно, не отвлекая его от работы.