В куки - храним токен, токен - может быть привязан к IP, подсети провайдера, браузеру (User-Agent), разрешению экрана.
При использовании токена с несовпадающими параметрами - токен устанавливается невалидным на сервере и пользователю предлагается снова ввести логин и пароль.
Схема последовательности авторизации: token -> login/pass
Схема линковки на сервере:
userID/login:token1:md5(ip:subnet:user-agent:screen-size):salt1:timestamp1
userID/login:token2:md5(ip:subnet:user-agent:screen-size):salt2:timestamp2
..........
userID/login:tokenN:md5(ip:subnet:user-agent:screen-size):saltN:timestampN
PS: то, что не хотим учитывать в md5-хеше - ставим пустой строкой.
Один токен = одно устройство = один браузер.
Генерация токена: token=hash(md5(...).saltN)
(можно ещё добавить время создания)
БОНУС!