Автентифікація: використання JWT та сеанс


122

Яка перевага використання JWT над сеансами в таких ситуаціях, як аутентифікація?

Чи використовується в якості самостійного підходу або він використовується в сесії?

Відповіді:


213

JWT не має переваги від використання "сеансів" за висловом. JWT надають засоби для підтримки стану сеансу для клієнта, замість того, щоб це робити на сервері.

Що люди часто мають на увазі, запитуючи це: "Які переваги використання JWT над використанням сеансів на сервері "

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

За допомогою рішення в пам'яті ви обмежуєте горизонтальне масштабування, а на сеанси впливатимуть проблеми з мережею (клієнти роумінгу між Wi-Fi і мобільними даними, перезавантаження серверів тощо)

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

  • Безпечне зберігання маркера
  • транспортуючи його безпечно
  • Сесії JWT іноді важко визнати недійсними.
  • Довіра претензії клієнта.

Ці питання поділяються також JWT та іншими механізмами сеансів на стороні клієнта.

JWT, зокрема, стосується останнього з них. Це може допомогти зрозуміти, що таке JWT:

Це трохи інформації. Для сеансів користувача можна вказати ім’я користувача та час закінчення терміну дії маркера. Але це може бути будь-що, навіть ідентифікатор сеансу або весь профіль користувача. (Будь ласка, не робіть цього, хоча) Він отримав захищений підпис, який запобігає зловмисним сторонам генерувати підроблені жетони (Вам потрібен доступ до приватного ключа сервера, щоб підписати їх, і ви можете переконатися, що вони не були змінені після їх підписання). надсилайте їх із кожним запитом так само, як Authorizationбуде надіслано файли cookie або заголовка. Насправді вони зазвичай надсилаються у Authorizationзаголовку HTTP, але за допомогою файлу cookie теж добре.

Маркер підписаний і сервер може перевірити його походження. Ми будемо вважати, що сервер довіряє своїй власній здатності безпечно підписувати (ви повинні використовувати стандартну бібліотеку: не намагайтеся робити це самостійно та надійно захищайте сервер)

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

Що стосується надійного зберігання маркера в клієнті, вам потрібно переконатися, що погані хлопці не зможуть дістатися до нього. Це (в основному) означає запобігання JS з поганих веб-сайтів читати токен, а також надсилати їм їх назад. Це пом'якшується за допомогою тих же стратегій, що застосовуються для пом'якшення інших видів атак XSS.

Якщо у вас є необхідність визнати недійсними JWT, напевно є способи цього досягти. Зберігання епохи на кожного користувача лише для тих користувачів, які попросили припинити свої "інші сеанси" - це дуже ефективний метод, який, ймовірно, буде досить хорошим. Якщо програмі потрібна ініціалізація за сеанс недійсної, тоді ідентифікатор сеансу можна підтримувати таким же чином, а таблицю "вбитих жетонів" все ще можна підтримувати набагато меншою, ніж повна таблиця користувачів (Вам потрібно зберігати записи, новіші ніж найдовший дозволений термін дії маркера.) Отже, можливість недійсності маркера частково заперечує перевагу сеансів на стороні клієнта, оскільки вам доведеться підтримувати стан сеансу вбитого. Це, швидше за все, буде набагато меншою таблицею, ніж оригінальна таблиця стану сеансу, тому огляди все ще ефективніші.

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

Більш тонка вигода: Оскільки JWT може нести "інформацію", і клієнт може отримати доступ до цього, тепер ви можете почати робити деякі розумні речі. Наприклад, нагадайте користувачеві, що їх сеанс закінчується за кілька днів до виходу з системи, надаючи їм можливість повторної аутентифікації на основі дати закінчення терміну дії в маркері. Що б ви не могли собі уявити.

Отже, коротко: JWT відповідає на деякі питання та недоліки інших методик сеансу.

  1. "Дешевша" автентифікація, оскільки ви можете усунути зворотну поїздку БД (або принаймні мати набагато меншу таблицю для запиту!), Що в свою чергу дає можливість горизонтальної масштабованості.
  2. Вимоги, спрямовані на захист клієнтів.

Хоча JWT не відповідає на інші питання, такі як безпечне зберігання чи транспорт, вони не вводять жодних нових проблем безпеки.

Навколо JWT існує багато негативу, але якщо ви реалізуєте таку ж безпеку, що і для інших типів аутентифікації, вам буде добре.

Останнє зауваження: це також не Cookies проти жетонів. Файли cookie - це механізм зберігання та транспортування бітів інформації, який також може використовуватися для зберігання та транспортування жетонів JWT.


4
Варто зазначити, що сеанси на стороні сервера також не повинні зберігати інформацію на сервері. Сервер може використовувати клієнта як магазину так само, як це робить JWT. Справжня різниця полягає в 1) униканні правил безпеки браузера, передаючи значення як заголовку запиту, відмінному від заголовка файлів cookie, і 2) мати стандартизований формат з JWT.
Xeoncross

1
Ви б сказали, що безпечно зберігати jwt у локальному сховищі? Якщо ні, то де безпечне місце для збереження, щоб користувач залишався ввійшов?
Джессіка

1
Так, локальне зберігання - це, як правило, найбільш правильне місце для зберігання клієнта. Вам потрібно мати справу з XSS - я не експерт з веб-програмування, але подивіться на цю відповідь stackoverflow.com/a/40376819/1810447 та шукайте "Як захистити від XSS"
Tahaan

1
У своєму коментарі ви не говорите про кешоване рішення + маркер сесії. Мені це здається "кращим", ніж таблиця JWT + "вбиті жетони", тому що для цієї таблиці "вбиті жетони" вам так чи інакше потрібен доступ до БД, який у вас також буде з сеансами + кеш (що також мало). І наполегливий JWT є більш легким для впровадження, ніж постійним сеансом, тому що вам потрібно грати з refresh_token (так що два маркери для підтримки) ... Будь-який коментар буде дуже вдячний ... особливо якщо у вас є якась кількість, щоб показати, як JWT + kill_table є більш ефективним, ніж сеанси + кеш ;-)
tobiasBora

2
@Thehaan localStorage не рекомендується зберігати JWT. Також згадується посилання, яким ви поділилися. Цей блог має гарне пояснення, чому JWT не слід зберігати в localStorage.
Харке

40

Коротка відповідь: Ні.

Більш довга версія:

Я реалізував JWT для управління сеансом, прочитавши цю рекомендацію в документах GraphQL :

Якщо ви не знайомі з жодним із цих механізмів аутентифікації, радимо використовувати express-jwt, оскільки це просто, не приносячи при цьому ніякої гнучкості в майбутньому.

Реалізація була дійсно простою, оскільки лише додала трохи складності. Однак через деякий час я (як і ви) почав цікавитись, які переваги. Виявляється, для JWT дуже мало (або, можливо, жодного), що стосується управління сеансами, як це детально пояснює ця публікація в блозі:

Припиніть використовувати JWT для сеансів


0

Мої два центи, які до речі додають контрасту до відомого допису в блозі joepie91.

Зважаючи на те, що сьогоднішні (та завтрашні) програми є (здебільшого) хмарними.
Є економічна вигода від аутентифікації JWT без громадянства , яка масштабується як масштаб додатків:
хмарні програми несуть вартість разом із кожним подихом .
Ця вартість зменшується, коли користувачам більше не доведеться автентифікувати "проти" магазину сеансів.

Обробка
Запуск сеансового магазину цілодобово коштує грошей.
Ви не можете піти з рішень на основі пам'яті у світі K8S, оскільки стручки є ефемерними.
Клейкі сеанси не пройдуть із тієї самої причини.

Зберігання
Зберігання даних коштує грошей. зберігання даних на SSD коштує ще більше.
Операції, пов’язані з сеансом, потрібно вирішити швидко, тому оптичний привід - це не варіант.

Введення / виведення
Деякі постачальники хмарних технологій стягують гроші за пов'язані з диском введення-виведення.

Пропускна здатність
Деякі хмарні провайдери платять за мережеву діяльність між екземплярами сервера.
Це стосується, оскільки майже певно, що API та сховище сесій - це окремі екземпляри.

Кластеризація сесійного магазину
Вартість ще більше збільшує всі вищезгадані витрати.


"Ви не можете піти з рішення, заснованого на пам'яті у світі K8S, оскільки стручки є ефемерними" Не впевнений, що ви маєте на увазі під цим. Redis, безумовно, працює в середовищі K8S, і червоний струмок, який виходить з ладу досить часто, щоб вплинути на ваших користувачів, здається дуже маловірочним.
silentContest

@quietContest Я особисто вважаю за краще не мати справу з вірогідністю створення програмного забезпечення. BTW, стабільність рішення вбік, атака може призвести до виходу з ладу програмного забезпечення, а перезавантаження - що призведе до втрати сеансу. З цієї причини я б обрав рішення, засноване на JWT.
Eyal Perry

1
"Я особисто вважаю за краще не займатися ймовірністю під час створення програмного забезпечення". Я думаю, що всім ми віддамо перевагу саме тому, і саме тому ми не повинні архітектувати системи, які покладаються на сховища даних пам'яті, які ніколи не виходять з ладу, тому що ймовірність цього здається досить високою. Що стосується іншого пункту, якщо у вас є зловмисник, який здатний послідовно відключати ваш екземпляр redis, рішення цього, ймовірно, не потребує використання JWT.
silentContest

@quietContest послідовно або подія один раз у житті для мене однакові в цьому аспекті. тобто добре розміщена DDoS-атака може призвести до того, що сервер "виходитиме з користувачів". Це не дуже добре для репутації програмного забезпечення. Я думаю, що Redis все-таки є надмірним для управління сеансом. Це коштує та потребує масштабування, тоді як (безпечно) зберігання JWT у файлі cookie не робить.
Eyal Perry

1
@quietContest дякую за ваш внесок, люблю дискусію!
Eyal Perry

0

У мене було подібне питання, вибираючи JWT і token + кеш для автентифікації користувача.

Прочитавши ці статті, мені зрозуміло, що переваги обіцянок JWT не випереджають проблем, які він приносить. Тож маркер + кеш (Redis / Memcached) - це шлях для мене.

Auth Headers vs JWT vs Sessions - Як правильно вибрати техніку Auth для API

Методи аутентифікації для API

Перестаньте використовувати jwt для сеансів

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.