Автор оригинала: Rahul Golwalkar.
Для приложений, которые требуют реализации Sever-Side, клиенты (мобильное приложение или веб-браузер) обычно должны доказать свою личность на сервере. Пользователь, использующий Chrome для открытия Facebook.com (FB), который он был ранее вошел в систему, отправляет некоторые данные на FB-сервере, подтверждая его идентичность.
Это необходимо, поскольку HTTP-вызовы (и даже исходные подключения Websocket) являются нестандартными. До недавнего времени он был сделан с использованием сеансов боковых серверов, которые хранятся в БД. Теперь появился новый стандарт JWT и используется довольно несколькими системами.
Здесь мы сравниваем традиционные сессии VS JWT.
Мое сравнение будет предвзято к сессиям, так как JWT относительно новой для меня, и я использовал сеансы для моих архитектур, которые нельзя использовать вместе с JWT Отказ Кроме того, я немного безопасности, и у JWT есть свои недостатки Отказ
Как каждый работает
В обоих случаях, как только пользователь впервые аутентифицирован, сервер отправляет кажущийся случайным строка К клиенту, который клиентские магазины в постоянном хранении (например, веб-хранилище, файлы cookie, nsuserdefaults) и с каждым последующим запросом, он отправит строка Это используется для идентификации идентификатора пользователя на сервере.
Сессия : Это обычно включает в себя таблицу БД, которая имеет все токены сеанса, отображаемые с помощью идентификатора пользователя. Токен сеанса строка генерируется случайным образом Отказ Всякий раз, когда пользовательские запросы, например, самопрофиля, сервер выбирает идентификатор пользователя из таблицы и возвращает профиль из таблицы профиля.
Любые другие детали, такие как тип устройства, срок действия и т. Д., Можно хранить в таблице. В случае, если кто-то хочет уменьшить нагрузку на БД и улучшить время отклика, можно использовать базы данных в памяти, такие как Redis на сервере.
Jwt : Это определенно умный способ надежно получить удостоверение личности клиента. На простом языке есть секрет Ключ используется для шифрования JSON отформатированного Данные , который в основном включает в себя идентификатор пользователя.
Теперь шифрование данные с Ключ генерирует токен который отправляется клиенту и используется в каждом запросе. Каждый раз, когда клиент отправляет в запрос с токен Сервер пытается расшифровать его с Ключ Отказ Если это может, он получает идентификатор пользователя от JSON Данные , что соответствует пользователю.
Плохо созданный JWT GIF
Примечание : Фактическая работа JWT не такая простая: на самом деле она включает в себя публичные/секретные ключи, где полезная нагрузка подписана секретом. Для реальных деталей, пожалуйста, Google или Вики Отказ
Плюс
- Нет таблицы базы данных : Это подразумевает меньше запросов БД, что подразумевает более быстрое время отклика. Если вы используете платные услуги, такие как DynamOdb, который заряжается на основе запроса, JWT может снизить расходы незначительно. Однако они могут быть разрешены с использованием таких инструментов, как Redis в случае сеансов.
- Проще использовать, если вы осторожны : Если ваша архитектура не использует клиентские сеансы, и ваши основы безопасности ясны, время разработки в случае JWT быстрее с использованием существующих библиотек.
- Используется через услуги: Вы можете иметь один сервер авторизации, который касается входа в систему/регистрацию и генерирует токен. Ни одна из последующих запросов не нужно будет перейти на сервер авторизации, так как только автосистемный сервер будет иметь закрытый ключ, а остальные серьеры будут иметь открытый ключ для проверки подписи. Это действительно полезно в случае корпоративных систем, где сервер авторизации находится в безопасной среде, например, пользователю необходимо подключить к интрасете для входа в систему, но после выполнения общедоступные серверы могут проверить и продолжить. Аналогичная настройка может быть использована для реализации ОАУТ. Лучшая часть состоит в том, что нет соединения между сервером auth-сервера и остальными серверами, отличными от заранее определенного открытого ключа.
Господин
- Сломанный секретный ключ: Лучшие и худшие вещи о JWT – это то, что он зависит только один Ключ Отказ Подумайте, что если Ключ просочивается небрежным или мошенническим разработчиком/администратором, вся система скомпрометирована! Злоумышленник (у которого есть доступ к Key ) может легко получить доступ к всем пользователям пользовательские данные, если у него есть идентификатор пользователя, который может быть легко приобретен. Единственный способ восстановить из этого состоит в том, чтобы генерировать новый ключ (ключевой пара), который будет использоваться между системами здесь. Это будет означать, что все существующие токены клиентов являются недействительными, и каждый пользователь должен будет войти в систему снова. Представьте себе, что один день 100% пользователей в Facebook будут вытеснены. Ну, вы можете задаться вопросом, почему то же самое невозможно, если разработчик/администратор устанавливает таблицу сеанса? Это возможно, но это связано с практичностью ситуации. Помните, что большинство онлайн нарушений проводятся с социальной инженером, а не сложными техническими хаками. а) Практически, действительно трудно утерить весь стол. В случае одного ключа администратор просто должен притворяться, что фотографировать своего друга в офисе Aaaaaand в секрете на Reddit. На следующее утро вы его уворите. б) также рассмотрим Openssl sharebleed ошибка. Очень легко извлечь секретный ключ от пары свалок памяти с простой сценарием спинки String.
- Не удается управлять клиентом с сервера: У нас было несколько случаев, когда мы хотели, чтобы пользователи в Helptap Чтобы выйти, очищая куки, но мы не можем попросить их сделать это каждый раз. Также рассмотрим этот случай, когда мобильный мобильный телефон украден, и он хочет выйти из системы всех существующих сессий (E.g., выхода из системы Gmail Другие сеансы). Ну, это невозможно в случае JWT. В нашем случае он использовался для мошенников. Нам нужно было выбрать их. Ну, в случае Helptap, это было довольно легко, так как мы просто должны были удалить жетоны сеанса. Не было никакого способа сделать то же самое в случае Боттр Потому что мы использовали JWT в этом случае. Вы можете поспорить, почему бы не просто удалить существующий идентификатор пользователя из таблицы … Но это означает создание нескольких висных указателей … и никто не любит висящие указатели в базе данных NO-SQL.
- Невозможно выдвигать сообщения клиентам: (идентифицирующие клиенты с сервера) Поскольку у нас нет записи о записываемых клиентах на концах БД, мы не можем нажать сообщения всем клиентам. В Helptap Мы реализовали платформу в чате, в которой клиент выбирает сервер для новых сообщений. У каждого клиента есть очередь AWS SQS для себя, где мы нажимаем какие-либо новые сообщения. В случае JWT это не было бы возможно, чтобы идентифицировать каждого клиента на пользователя невозможно. Можно использовать идентификатор устройства, но не у всех клиентов есть идентификатор устройства – это означает создание другой таблицы, которая параллельна таблице сеанса. Эта точка перекрывает точку два.
- Crypto-Algo может быть устаревшим : JWT полностью опирается на алгоритм подписания. Теперь, хотя в прошлом не часто, в прошлом многие алгоритмы шифрования/подписи были устарены. Это Статья Показывает, как вы можете взломать пароль Wi-Fi из зашифрованного WEP WiFi, который был наиболее распространенным типом шифрования не более года назад. Хак был основан на слабости криптоалгоритма. Итак, в случае JWT, если такое событие происходит, еще раз, каждый пользователь на платформе придется снова войти в систему. Еще снова нужно будет подождать до всех библиотек JWT с последними крипто-алгорами.
- Накладные расходы на данные: Размер токена JWT будет больше, чем у обычного токена сеанса. Чем больше данных вы добавляете в токен JWT, тем дольше она становится линейно. Помните, каждый запрос нужен токен в нем для проверки запроса. Так сказать, 1 КБ JWT Token Подразумевает каждый запрос будет иметь 1КБ загрузку над головой, которая действительно плохо в случаях низкоскоростного подключения к сети. В случае плохих разработчиков кто-то может поставить больше данных в JSON, и это увеличит длину. Длина жетонов сеансов может быть столь же маленькой, она может быть и все еще была безопасной, например, возможные комбинации для 5-го буквенно-цифровой строки сеанса составляет почти 1 миллиарда комбинаций (62 ⁵)
- Сложный, чтобы понять: JWT использует алгоритмы криптографической подписи для проверки данных и получить идентификатор пользователя из токена. Понимание подписания Algo само по себе требует основы криптографии. Таким образом, если если разработчик не полностью образован, он может ввести лазейки безопасности в системе. Мой сотрудник был удивлен, когда декодировал JWT Token без использования секретного ключа. Он ожидал, что весь токен был зашифрованным. Я наткнулся на веб-сайт, который сохранил весь объект пользователя в токене JWT. Это включало в себя пароль пользователя. Токены сеансов довольно просты, чтобы понять, и такие вопросы могут быть легко избежать.
Как JWT – это довольно новая концепция, можно не найти библиотеки на всех языках там. Добавление к нему, ни JWT, ни сеансы не решают проблемы CSRF или XSS, так как он полностью зависит от того, как вы отправляете данные.
TL; DR: JWT быстро (разработка), хотя и менее настраиваемым, рискованным и немного сложным для понимания.