У меня новый SPA с моделью аутентификации без сохранения состояния с использованием JWT. Меня часто просят направить OAuth для потоков аутентификации, например, просить меня отправлять «токены-носители» для каждого запроса вместо простого заголовка токена, но я действительно думаю, что OAuth намного сложнее, чем простая аутентификация на основе JWT. Каковы основные отличия, должен ли я заставить аутентификацию JWT вести себя как OAuth?

Я также использую JWT в качестве XSRF-TOKEN для предотвращения XSRF, но меня просят хранить их отдельно? Должен ли я держать их отдельно? Любая помощь здесь будет принята с благодарностью и может привести к набору руководящих принципов для сообщества.

Ответы (8)

TL; DR Если у вас очень простые сценарии, такие как одно клиентское приложение, один API, тогда переход на OAuth 2.0 может не окупиться, с другой стороны, множество разных клиентов (браузерные, собственные мобильные, серверные и т. Д.) тогда соблюдение правил OAuth 2.0 может сделать его более управляемым, чем попытки развернуть собственную систему.


Как указано в другом ответе, JWT (Learn JSON Web Tokens) - это просто формат токена, он определяет компактный и автономный механизм для передачи данных между сторонами способом, который можно проверить и доверенный, потому что он имеет цифровую подпись. Кроме того, правила кодирования JWT также делают эти токены очень простыми в использовании в контексте HTTP.

Будучи самодостаточными (фактический токен содержит информацию о данном предмете), они также являются хорошим выбором для реализации механизмов аутентификации без сохранения состояния (также известных как Посмотри, никаких сессий!). При переходе по этому маршруту единственное, что сторона должна предоставить для предоставления доступа к защищенному ресурсу, - это сам токен, данный токен можно назвать токеном-носителем.

На практике то, что вы делаете, уже можно классифицировать по токенам на предъявителя. Однако учтите, что вы не используете токены-носители, как указано в спецификациях, связанных с OAuth 2.0 (см. RFC 6750). Это подразумевает использование HTTP-заголовка Authorization и использование схемы аутентификации Bearer.

Что касается использования JWT для предотвращения CSRF, не зная точных деталей, трудно установить обоснованность этой практики, но, честно говоря, это не кажется правильным и / или стоящим. Следующая статья (Cookies vs Tokens: The Definitive Guide) может быть полезной для чтения по этой теме, особенно раздел XSS и XSRF Protection.

Последний совет, даже если вам не нужно использовать полный OAuth 2.0, я настоятельно рекомендую передавать ваш токен доступа в заголовок Authorization вместо использования настраиваемых заголовков.. Если они действительно являются токенами-носителями, следуйте правилам RFC 6750. Если нет, вы всегда можете создать собственную схему аутентификации и по-прежнему использовать этот заголовок.

Заголовки авторизации распознаются и специально обрабатываются прокси и серверами HTTP. Таким образом, использование таких заголовков для отправки токенов доступа на серверы ресурсов снижает вероятность утечки или непреднамеренного хранения аутентифицированных запросов в целом, и особенно заголовков авторизации.

(источник: RFC 6819, раздел 5.4.1)

OAuth 2.0 определяет протокол, т.е. указывает, как передаются токены, JWT определяет формат токена.

OAuth 2.0 и «аутентификация JWT» имеют схожий вид, когда дело доходит до (2) стадии, когда Клиент представляет токен серверу ресурсов: токен передается в заголовке.

Но «JWT-аутентификация» не является стандартом и не указывает , как Клиент получает токен в первую очередь (1-й этап). Вот откуда возникает воспринимаемая сложность OAuth: он также определяет различные способы, которыми Клиент может получить токен доступа от того, что называется Сервером авторизации.

Таким образом, реальная разница в том, что JWT - это просто формат токена, а OAuth 2.0 - это протокол (может использовать JWT в качестве формата токена).

JWT (JSON Web Tokens)- это просто формат токена. Токены JWT представляют собой структуры данных в кодировке JSON, содержащие информацию об эмитенте, субъекте (утверждениях), сроке действия и т. Д. Он подписан для защиты от несанкционированного доступа и подлинности, и он может быть зашифрован для защиты информации токена с использованием симметричного или асимметричного подхода. JWT проще, чем SAML 1.1 / 2.0, поддерживается всеми устройствами, и он более мощный, чем SWT (простой веб-токен).

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

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

CSRF protection - You don't need implement the CSRF protection if you do not store token in the browser's cookie.

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

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

Подробнее об этом можно прочитать здесь

OAuth или JWT? Какой использовать и почему?

Во-первых, нужно различать JWT и OAuth. По сути, JWT - это формат токена. OAuth - это протокол авторизации, который может использовать JWT в качестве токена. OAuth использует хранилище на стороне сервера и на стороне клиента. Если вы хотите полностью выйти из системы, вы должны использовать OAuth2. Аутентификация с помощью токена JWT фактически не позволяет выйти из системы. Потому что у вас нет сервера аутентификации, который отслеживает токены. Если вы хотите предоставить API сторонним клиентам, вы также должны использовать OAuth2. OAuth2 очень гибкий. Реализация JWT очень проста и не занимает много времени. Если вашему приложению нужна такая гибкость, вам следует использовать OAuth2. Но если вам не нужен этот сценарий использования, внедрение OAuth2 - пустая трата времени.

Токен XSRF всегда отправляется клиенту в каждом заголовке ответа. Не имеет значения, отправлен ли токен CSRF в токене JWT или нет, потому что токен CSRF защищен самим собой. Поэтому отправка токена CSRF в JWT не требуется.

найдите основные различия между JWT и OAuth

  1. OAuth 2.0 определяет протокол, а JWT определяет формат токена.

  2. OAuth может использовать либо JWT в качестве формата токена, либо токен доступа, который является токеном-носителем.

  3. OpenID connect в основном использует JWT в качестве формата токена.

Похоже, что все, кто здесь ответил, пропустили спорный вопрос OAUTH

Из Википедии

OAuth - это открытый стандарт делегирования доступа, обычно используемый как способ для пользователей Интернета предоставлять веб-сайтам или приложениям доступ к своей информации на других веб-сайтах, но без предоставления им паролей. [1] Этот механизм используется такими компаниями, как Google, Facebook, Microsoft и Twitter, чтобы пользователи могли делиться информацией о своих учетных записях со сторонними приложениями или веб-сайтами.

Ключевым моментом здесь является делегирование доступа. Зачем кому-либо создавать OAUTH, когда есть аутентификация на основе id / pwd, поддерживаемая многофакторной аутентификацией, например OTP, и, кроме того, может быть защищена JWT, которые используются для защиты доступа к путям (например, области в OAUTH) и устанавливают истечение срока действия доступ

Нет смысла использовать OAUTH, если потребители получают доступ к своим ресурсам (вашим конечным точкам) только через свои доверенные веб-сайты (или приложения), которые снова размещены вами на ваших конечных точках

Вы можете использовать только аутентификацию OAUTH , если вы являетесь поставщиком OAUTH в тех случаях, когда владельцы ресурсов (пользователи) хотят получить доступ к своим (вашим) ресурсам (конечным точкам) через третью -party client (внешнее приложение). И он создан именно для той же цели, хотя вы можете злоупотреблять им в целом

Еще одно важное примечание:
Вы свободно используете слово authentication для JWT и OAUTH, но ни одно из них не обеспечивает механизма аутентификации. Да, один из них - механизм токена, а другой - протокол, но после аутентификации они используются только для авторизации (управления доступом). Вы должны поддерживать OAUTH либо с аутентификацией типа OPENID, либо с вашими собственными учетными данными клиента

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

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

Примечание oauth2 может работать с jwt, гибкая реализация, расширяемая для различных приложений

2022 WebDevInsider