Токен привязывется к браузеру.
Как именно?
1. При аутентификации, отпечаток клиента (fingerprint) шифруется парольным хешем пользователя (на стороне клиента!) и сверху, "оборачивается": шифруется публичным ключом сервера, и затем, пересылается серверу.
2. Сервер открывает своим приватным ключом пакет, расшифроввывает с помощью своего парольного хеша (для этого конкретного юзера, из БД), и получает данные fingerprint.
3. Сервер привязывает данные fingerprint к токену и отправляет токен и функцию хеширования fingerprint'а клиенту.
4. При каждом запросе, клиент отправляет свой токен и подписываем запрос хешем fingerprint'а.
5. Сервер сверяет токен и подпись запроса (хешем fingerprint'а).
6. При их несовпадении - токен становится невалидным (сессия завершается).
Чтобы сохранить хеш fingerprint'а ещё более надёжно, его можно привязать к IP-адресу.
При смене IP - произойдёт "прозрачная" переинициализация сессии (и с запросом реального fingerprint'а клиента), незаметная для конечного пользователя (если у него валидный токен для вновь определённого fingerprint'а).
При краже кук или перехватие трафика - злоумышленник не знает реального fingerprint.
А без него - он не сможет подделать подпись, чтобы воспользоваться текущим токеном.