Каков наиболее распространенный способ проверки подлинности современного веб-приложения? - PullRequest
3 голосов
/ 11 октября 2019

Я пишу приложение wep (остальные API), используя Spring, Spring Security. Прямо сейчас у меня есть базовая и действительно простая аутентификация с использованием имени пользователя, пароля и ролей. Я хочу улучшить уровень безопасности, но у меня нет никакого опыта в этом.

Когда я посмотрел на почтальона для возможных методов аутентификации и исследовал Google, я увидел следующие варианты:

  • Ключ API
  • Токен на предъявителя
  • Базовая аутентификация
  • Аутентификация дайджеста
  • OAuth 1.0
  • OAuth 2.0
  • Hawk Auth
  • Подпись AWS
  • NTLM Auth

Дайджест, Hawk, AWS и NTLM кажутся действительно конкретными случаями, поэтому я их опускаю.

В общих чертах я слышал об API-ключе, Bearer Token и OAuth 1.0 \ 2.0, но OAuth 1.0 кажется устаревшим или что-то в этом роде (я имею в виду, что версия 2.0 существует).

Таким образом, в результате кажется, что у меня есть 3 возможных варианта:

  • Ключ API
  • Токен на предъявителя
  • OAuth 2.0

Правильно ли мое предположение? Каков наиболее распространенный случай в современных веб-приложениях для уровня безопасности?

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

На чем мне сосредоточиться?

Какие ошибки в моем описании \ объяснении вы видите?

1 Ответ

1 голос
/ 16 октября 2019

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

И когда мы рассматриваем REST API запросы предпочтительны, чтобы быть без сохранения состояния, но для аутентификации и идентификации пользователя или клиента есть много способов, как упомянуто OP.

Некоторые из наиболее распространенных способов аутентификации в REST API описаны ниже

1. Базовая аутентификация

При обычной аутентификации пользователь отправляет свои учетные данные, закодированные кодировщиком base64.
Учетные данные отправляются в заголовке авторизации с префиксом Basic, как указано ниже.
"Basic "+ encodeUsingBase64(username+":"+password)

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

В идеале базовая аутентификация предназначена только для пользователей приложений

2. Токен JWT / Bearer

Веб-токен JSON (JWT) - это открытый стандарт (RFC 7519), в котором сервер совместно использует токен с цифровой подписью с клиентом, его могут использовать как пользователи приложения, так и не пользователи приложения с сервером. боковая логика, которая извлекает информацию о пользователе из полезной нагрузки токена и проверяет ее записи в базе данных для авторизации. Здесь с JWT вариант использования не ограничен, в некоторых реализациях полезная нагрузка может также содержать информацию авторизации. Single Sign On - это функция, которая в настоящее время широко использует JWT.

По сравнению с базовой аутентификацией

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

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

3. Ключ API

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

4. Oauth2.0

Oauth2 - это другая категория. В одном предложении речь идет не о защите всех прикладных API, а о предоставлении доступа к user resource к third party applications с consent of user.

, состоящему в основном из 4 частей. Возьмем пример Facebook
1. Сервер авторизации [Facebook]
2. Сервер ресурсов [Facebook и ресурс будут вашим профилем]
3. Клиент [Переполнение стека, Quora, Candy crush, Subway Surfer и т. Д.]
4. Владелец ресурса [Вы (если аутентифицирован)]

Сервер ресурсов может состоять как из защищенного, так и из незащищенного API. Для доступа к защищенному API клиента необходим access_token, который выдается сервером авторизации. Выданный access_token является случайной строкой и также сохраняется в базе данных сервера авторизации вместе с соответствующим пользователем, область действия (read, read_profile_info, write).

Здесь владелец ресурса (Вы) дает согласие насервер авторизации для предоставления access_token области действия (read, read-profile, post-to-my-timeline и т. д.) Клиенту (Quora, StackOverflow, Candy-Crush и т. д.)

Преимуществоиз oauth2.0
  1. access_token получит аутентификацию и авторизацию. Так что будет полезно предоставить определенную область для access_token.
    (например, переполнение стека приводит к доступу к основной информации профиля, конфеты крошка обращается к дополнительной информации, включая объем публикации от вашего имени)
  2. срок службы access_token, grant_typeof refresh_token.
    Срок действия маркеров доступа ограничен. Если клиентскому приложению требуется доступ к ресурсу после срока действия одного токена доступа, оно может получить токен обновления. Токен обновления позволяет клиентскому приложению получать новые токены доступа.
    Типы предоставления: (код авторизации, неявный, пароль, клиентский доверенный, токен обновления)
Примечание:

Сервер Oauth2 Auth не только для таких приложений, как Facebook и Google, но и для вашего приложения может быть настроен сервер oauth2, и вы можете предоставить своим клиентам access_token (для интеграции вашего API с их приложением) с различной областью действия, срок службы которого зависит от подписки /лицензия.

5. Digest auth

Я не работал над digest auth. Для получения более подробной информации см. Эту ветку


Основы безопасности транспортного уровня

SSL

Любой изПриведенная выше проверка подлинности относится к безопасности транспортного уровня (SSL), чтобы гарантировать, что учетные данные / токен, которые вы передаете в последующих запросах, не записываются в виде простого текста.

X.509 (имеет преимущество перед SSL)

SSL-сертификат отправляется сервером клиенту (любой клиент, отправляющий запрос на сервер, получает копию SSL. Ограничений нет, любой клиент может получить SSL-сертификат).

Но в случае X.509 клиентский сертификат создается с использованием SSL-сертификата сервера и тайно передается клиенту. Клиент использует сертификат X.509 для связи с сервером. Здесь следует отметить один важный момент: для разных клиентов будут генерироваться разные клиентские сертификаты для идентификации каждого клиента. X.509 гарантирует, что

  • Безопасность (у кого нет сертификата клиента, не могут получить доступ к API)

  • Идентификация (сервер может идентифицироватьклиент на основании предмета сертификата)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...