Хобрук: Ваш путь к мастерству в программировании

JWT - Как лучше всего использовать jsonwebtoken? я потерялся

Я учусь программировать уже год. В основном я научился работать с остальным API (Node/Express на бэкенде и Vue на фронтенде).

Я дошел до того, что хочу развить идеи, которые у меня есть для приложения.

Для этого я сначала хотел разработать серверную часть, чтобы иметь процесс аутентификации, который я мог бы использовать в качестве шаблона для другого проекта, который у меня был бы.

Но теперь я полностью потерялся в Jsonwebtoken и в том, как именно его использовать, чтобы сделать что-то безопасным и удобным для пользователя.

До сих пор я понимаю, что API для отдыха должен быть без гражданства (т.е. ничего не должно храниться на стороне сервера и, следовательно, не должно иметь вызовов БД - как и для сеансов - для предоставления доступа к данным).

В этом отношении я отметил разные стратегии:

  • Недолговечный JWT: (+) это очень безопасно, поскольку теоретически вам нужно входить в систему каждый раз, когда вы хотите получить доступ к серверу (-) очень плохой пользовательский интерфейс

  • Долгоживущий JWT: (+) удобный для пользователя (постоянный вход в систему) (-) очень небезопасный (нет возможности проверить, был ли JWT украден)

  • Недолговечный JWT с долгоживущим токеном обновления…

Вот я и путаюсь…

Из всех статей/учебников, которые я читал, токен обновления должен быть каким-то образом связан с БД (например, для хранения ключа токена обновления или токена из черного списка…). Я также видел учебник, который частично связывал секретный ключ (для проверки токена) с хешированным паролем, хранящимся в БД. Это довольно умно, так как предыдущий токен будет автоматически считаться недействительным с момента изменения пользователем своего пароля… Но это снова означает вызов БД…

Суть в том, что я прихожу к выводу, что (1) не существует идеального способа обработки процесса аутентификации безопасным и удобным для пользователя способом… (2) нельзя избежать вызовов БД, чтобы иметь что-то более безопасное…

И учитывая этот вывод, я определенно не могу понять использование токена обновления…

Если бы токены обновления требовали вызовов БД, вы могли бы получить тот же результат только с одним основным токеном…

Например, вы можете сохранить идентификатор JWT в токене и в БД... Если эти два идентификатора совпадают при проверке токена, вы выдаете новый токен с новым идентификатором, который перезаписывает предыдущий... Теперь, если вы используете старый, он никогда не будет проверен... Затем, поскольку вы вызвали БД для проверки токена (скорее всего, таблицы USER), вы можете одновременно проверить, является ли пользователь, например, администратором или нет (нет необходимости хранить его в JWT)… Наконец, вы можете использовать описанный выше трюк с «хешированием пароля» для повышения безопасности…

Итак… Что я упускаю? Какая лучшая стратегия?

Буду рад вашим комментариям по этому поводу (или ссылке на очень хорошую статью — хотя у меня их много…)

Большое спасибо за Вашу помощь

PS: и я даже не говорю о том, как отправить токен на сервер (с куки, но с риском присоединения CSRF или с заголовком, но с учетом XSS-атаки, если токен хранится на стороне клиента)… В этом отношении я видел несколько учебников, которые используют JWT через файл cookie с ключом cerf, хранящимся на стороне клиента, а также внутри самолета => оба должны быть отправлены.

PS2: Надеюсь, я понял, так как я франкоязычный :-)


Ответы:


1

Таким образом, вы задали довольно много вопросов в этом вопросе. Кому-то будет довольно сложно дать здесь вдумчивый ответ, но я попытаюсь. Перед этим полный отказ от ответственности, что я являюсь автором новой библиотеки под названием SuperTokens, которая, как я считаю, предоставит вам лучшее решение для управления сеансом. Возможно, вы уже читали наш блог: https://hackernoon.com/all-you-need-to-know-about-user-session-security-ee5245e6bdad. Будет лучше, если мы сможем поговорить об этом, чтобы я мог дать вам полное подробное объяснение обо всем, что вы спросили (я был бы рад помочь). Присоединяйтесь к нашему раздору: https://discord.gg/zVcVeev

Теперь, чтобы ответить на ваш вопрос (ы):

  • Вы всегда должны использовать только недолговечные JWT

  • Выполнение вызова базы данных для аутентификации не является проблемой, но, как и все остальное, мы пытаемся оптимизировать вещи, поэтому лучше делать меньше вызовов базы данных. Если вы используете токены доступа JWT и токены Opaque Refresh, то для большинства API вам не нужно выполнять вызов базы данных. Однако, если вы свяжете секретный ключ JWT с хэшированным паролем, вам придется вызывать БД для каждого API, что нормально, но я чувствую себя ненужным, поскольку вы все равно собираетесь использовать недолговечные JWT (несколько часов). максимум сутки)

  • Вы упомянули кражу токена — это сложная проблема, но, согласно RFC 6819, вы можете использовать концепцию ротации токена обновления для обнаружения кражи. Конечно, сделать это на самом деле может быть сложно, так как вам придется позаботиться о многих условиях гонки и проблемах сбоя сети — см. https://hackernoon.com/the-best-way-to-securely-manage-user-sessions-91f27eeef460

  • О том, зачем нам нужны токены обновления: скажем, у вас нет токена обновления, тогда у вас будет только один токен, который вы можете рассматривать как токен доступа и токен обновления. Вы все еще можете сделать его недолговечным (когда это токен доступа), а затем, после истечения срока его действия, рассматривать его как токен обновления, который также имеет некоторое время жизни. Проблема с этим заключается в том, что он не очень чистый (срок действия токена заключается в том, что он впоследствии бесполезен), и что вы предоставляете токен обновления по сети при каждом вызове API, что снижает безопасность. Я знаю, что у вас может быть HTTPS, но есть и HTTPS MITM-атаки — см. сообщение в блоге, часть 1.

  • С точки зрения хранения, один изящный трюк может состоять в том, чтобы разделить токен доступа на два: один для хранения в безопасном файле cookie только для http, а другой для хранения в локальном хранилище. Для каждого вызова API отправьте оба на сервер (файлы cookie в любом случае будут отправлены автоматически), а затем сервер объединит их и приступит к аутентификации. Это предотвратит атаки CSRF и XSS на сеансы!

Теперь вы можете либо реализовать все это самостоятельно, либо использовать нашу библиотеку, которая делает все это из коробки: https://github.com/supertokens/supertokens-node-mysql-ref-jwt.

Чтобы обсудить это подробнее или задать любые другие вопросы, присоединяйтесь к нашему серверу разногласий.

PS: я знаю, что использовал это для рекламы своей библиотеки, но надеюсь, что ответил на ваш вопрос. Действительно трудно дать хорошее объяснение вашим вопросам без разговора.

22.06.2019
  • Спасибо за ваш ответ. Очень поучительно, как и статьи. Я посмотрел на супертокены, которые кажутся очень хорошими. На самом деле, как новичок, я хочу сделать это сам сначала для целей обучения и пытаясь лучше понять, что я должен поставить на место... Пока что я пришел к этому (пока еще не улучшенному) результату: github.com/HackinoSelov/authentification/tree/master/server Если вы проверите это, вы я увижу (базовую) логику, которую я использовал с токенами (с токенами обновления :-)). Не стесняйтесь комментировать, если у вас есть несколько раз (но я, конечно, понимаю, что вы не можете ;-) 01.07.2019
  • Привет. Я частично просмотрел ваш гитхаб. У меня есть несколько вопросов к вам, чтобы я мог дать вам хороший отзыв. Пожалуйста, найдите меня в Discord. Мое имя пользователя rp#5569. Кроме того, вы можете присоединиться к моему серверу Discord на discord.gg/zVcVeev, а затем написать мне в Директ. 02.07.2019
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..