1

Тема: Що треба зберігати на клієнті, щоб ідентифікувати користувача

Припустимо, що користувач пройшов автентифікацію. Тепер я хочу впізнавати його при кожному наступному запиті. Що мені треба зберігати у нього. Я так міркую, що реп'яшки, але що саме записати туди? Припустимо, що я запишу туди закодований і підписаний його ідентифікатор/утотожнювач. Припустимо, що я використав HttpOnly, але що заважає Мелорі скопіювати файл з реп'яшками собі на комп і зайти в обліковку цього користувача?

Додаткове запитання: чи треба підписувати, якщо криптографічно закодував?

ЗІ. Оце писав-писав і зрозумів, що це дурне питання, якщо вже зловмисник дістався до файлів на компі, то як то кажуть згорів сарай, гори і хата.

Подякували: 0xDADA11C7, leofun012

2

Re: Що треба зберігати на клієнті, щоб ідентифікувати користувача

Yola написав:

то як то кажуть згорів сарай, гори і хата.

Не обов'язково, можна ідентифікатор машини додати, паролі ж у відкритому вигляді ніхто не зберігає

3

Re: Що треба зберігати на клієнті, щоб ідентифікувати користувача

І щодо додаткового питання, то так треба підписувати, бо інакше, якщо я приміром зберігаю ціле число як ідентифікатор, то навіть якщо воно закодоване, то якщо закодований варіант має не набагато більше бітів ніж відкритий текст, то можна навмання змінювати біти і отримати чийсь інший ідентифікатор.

4 Востаннє редагувалося Yola (02.08.2020 18:42:16)

Re: Що треба зберігати на клієнті, щоб ідентифікувати користувача

Chemist-i написав:

Не обов'язково, можна ідентифікатор машини додати, паролі ж у відкритому вигляді ніхто не зберігає

Не второпав, в реп'яшках зберігати ідентифікатор машини? Тобто мати окреме сховище/таблицю де зберігати всі машини з яких заходив користувач?

І як цей ідентифікатор сформувати?

5 Востаннє редагувалося bunyk (02.08.2020 19:17:49)

Re: Що треба зберігати на клієнті, щоб ідентифікувати користувача

Yola написав:

Не второпав, в реп'яшках зберігати ідентифікатор машини? Тобто мати окреме сховище/таблицю де зберігати всі машини з яких заходив користувач?

І як цей ідентифікатор сформувати?

Остання мода - це JWT (JSON Web Token). Містить інформацію "даю такі-то права. Дійсно до такого то моменту. (Можна ще додати що дійсно для таких-то IP, але не бачив аби так хтось робив). Підпис.

При отриманні запиту за публічним ключем перевіряється підпис, перевіряється чи не вийшов термін дії, і якщо все ок - дається доступ. Якщо ні  - посилають користувача туди де він може отримати дійсний токен.

Перевага такого способу в тому що приватний ключ треба зберігати лише на сервері що видає токени, всім сервісам до яких треба отримати доступ роздати по публічному ключу (або вони самі собі скачують з сервера аутентифікації за адресою на зразок .well-known/jwks.json). І серверу не треба зберігати взагалі нічого про користувача, досить того що те що про нього пише в JWT підписано, тому можна вірити.

Подякували: Yola, leofun01, itakal, ostap34PHP4

6 Востаннє редагувалося Yola (02.08.2020 22:57:29)

Re: Що треба зберігати на клієнті, щоб ідентифікувати користувача

bunyk написав:

Остання мода - це JWT

Мм.. це майже і є шифрувати і підписувати. Тільки замість дайджеста зберігати шифровану версію всього повідомлення.

bunyk написав:

І серверу не треба зберігати взагалі нічого про користувача, досить того що те що про нього пише в JWT підписано, тому можна вірити.

Ну, так не вийде, бо якщо кор. захоче вилогінитись і, скажімо, через рік знов залогінитись, то сервер має пам'ятати, скажімо, його день народження. Але так, треба зберігати лише постійні дані, перехідні не треба.

---

Тут питання було про можливість крадіжки реп'яшків з компа користувача. Але, я так розумію, що не від усього можна захиститись. Наприклад, якщо користувачу затиснути пальці між дверима, то можна і пароль дізнатись не те, що реп'яшки забрати.

Подякували: itakal1

7

Re: Що треба зберігати на клієнті, щоб ідентифікувати користувача

Ви можете додати додаткову інформації до JWT, як от IP чи відбитки бравзера, та перевіряти їх на сервері. Не забезпечить на 100%, проте додасть клопоту проти копіювання токену на інші клієнти.

8

Re: Що треба зберігати на клієнті, щоб ідентифікувати користувача

Yola написав:

Ну, так не вийде, бо якщо кор. захоче вилогінитись і, скажімо, через рік знов залогінитись, то сервер має пам'ятати, скажімо, його день народження. Але так, треба зберігати лише постійні дані, перехідні не треба.

Ну так, треба щонайменше пам'ятати кому можна видавати JWT, а кому - ні. Хоча можна делегувати це завдання якомусь Google і змушувати користувачів логінитись через їхній OAuth.

Але якщо треба пам'ятати день народження користувача, аби показати йому привітання з днем народження, абощо, то таки це треба десь на сервері зберігати, факт.

Щодо крадіжки токена - то якраз для цього напевне і зроблене поле "exp" - тут можна налаштовувати баланс між безпекою і зручністю для користувача.

Подякували: Yola1

9

Re: Що треба зберігати на клієнті, щоб ідентифікувати користувача

bunyk написав:

Щодо крадіжки токена - то якраз для цього напевне і зроблене поле "exp" - тут можна налаштовувати баланс між безпекою і зручністю для користувача.

Можна ж використовувати схеми з двома токенами: один JWT коротко живучий, інший для рестарту (вже має зберігатись на сервері), він довгоживучий. І схема рестарту має бути хитра.