Преимущества JWT перед простыми случайно сгенерированными токенами в базе данных? - PullRequest
2 голосов
/ 13 января 2020

Допустим, у меня есть типичный CRUD API для веб-приложения. Мне нужно авторизовать пользователей с помощью токена, проверить роли пользователей и т. Д. c.

. Есть ли какая-либо причина, по которой мне следует рассмотреть JWT, а не хранить случайно сгенерированный токен в таблице, такой как tokens(token, refresh_token, expiration_date)?

По моему мнению, JWT добавляет здесь больше сложности:

  1. Дополнительный код для обработки кодирования / декодирования

  2. Необходимо хранить секреты и ключи JWT

  3. Проблема отзыва токена

Мне нужно обратиться к базе данных, чтобы проверить роли пользователей (хотя я могу включить их в полезная нагрузка, есть и другие вещи, которые я должен проверить в моем приложении), поэтому здесь нет никаких преимуществ. Единственное преимущество, которое я вижу здесь, это то, что я могу проверять данные об истечении срока действия токена, не обращаясь к базе данных.

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

Я что-то упустил?

Ответы [ 2 ]

3 голосов
/ 14 января 2020

JWT часто неправильно понимают. Основное преимущество, которое они предоставляют, - это безгражданство. Если вы go в своей базе данных будете запрашивать привилегии по каждому запросу в любом случае, это в значительной степени потеряно, если не с теоретической, а с практической точки зрения.

Они обычно не хранятся только в http куки, что делает их уязвимыми для XSS, но в то же время позволяет Javascript клиентам читать полезную нагрузку (например, кто вошел в систему, какие привилегии они имеют и так далее). Отсутствие сохранения в файлах cookie также позволяет отправлять их из разных источников, что является практически единственной причиной, по которой они не должны храниться в режиме «только для http» ie (если и только если вы понимаете и принимаете риски этого) .

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

Если вам не нужны описанные выше функции (без сохранения состояния, доступ с javascript) у вас просто не должно быть дополнительной сложности JWT, вам просто нужен простой старый сеанс.

0 голосов
/ 14 января 2020

Первое, что вам нужно учитывать, это кто генерирует токен. В случае JWT токен будет создан действующим поставщиком OAUTH. Преимущества заключаются в следующем:

  1. . Вы можете проверить легитимность токена, которая будет включать проверку следующих,

    a. аудитория

    б. срок действия

    c. выдан в

    д. не ранее даты

    e. Эмитент

  2. вы можете проверить эмитента на основе только ключа publi c, который позволит избежать сетевого отключения на другом удаленном сервере, таком как база данных.
  3. вы можете внедрить любую полезную нагрузку, которая может включать в себя userinfo, email, роль или любые пользовательские атрибуты.
  4. для стандартного OAUTH JWT, вы можете протестировать с помощью распространенных поставщиков, таких как 'Okta'. В отличие от вашего собственного генератора, где вам нужно будет предоставить пользователю механизм для извлечения такого токена.

в отношении кода для проверки, JWT довольно просто с 3 частями, разделенными "периодом". Но есть библиотеки на java и других языках, которые могут выполнить анализ для вас - com.auth0, в частности jwt и rsa, которые позволят вам выполнить анализ и проверку.

ваш код будет быть совместимым и легко переносимым на другого поставщика.

...