Васильев Андрей Михайлович, 2022
Версии презентации
Доступ к данным должен осуществляться только уполномоченными лицами
Задача аутентификации возникла давно и в рамках стандарта HTTP утверждено несколько способов аутентификации: IANA
sequenceDiagram participant cli as Клиент participant serv as Сервер cli ->> serv : GET-запрос по пути PATH serv ->> cli : Ответ 401, Unauthorized, заголовок WWW-Authenticate cli ->> cli : Формирует ответ cli ->> serv : GET-запрос по пути PATH с заголовком Authorization alt Данные введены верно serv ->> cli : Ответ 200 с указанным документом else serv ->> cli : Ответ 403, Forbidden end
WWW-Authenticate
Authorization
sequenceDiagram actor user as Пользователь participant brow as Браузер participant serv as Сервер user ->> brow : Открывает ссылку в интерфейса brow ->> serv : Посылает GET-запрос на ссылку serv ->> brow : Ответ с кодом 401, Unauthorized brow ->> user : Окно для ввода имени имени и пароля user ->> brow : Вводит имя пользователя и пароль brow ->> serv : Передаёт данные в заголовке Authorization serv ->> serv : Выполняет проверку введённых данных serv ->> brow : Возвращает результат запроса
https://username:password@example.com/
HTTP cookie — это небольшой фрагмент данных, отправляемый сервером на браузер пользователя, который может сохранить и отсылать обратно с новым запросом к серверу
Используются в веб-приложениями для:
sequenceDiagram participant cli as Браузер participant ser as Сервер cli ->> ser : Запрос данных ser ->> cli : Ответ с заголовком(ами) `Set-Cookie` cli ->> ser : Запрос с заголовком `Cookie`
Set-Cookie
и Cookie
#
Простой заголовок может выглядит так:
Set-Cookie: <имя cookie>=<значение cookie>
Таких заголовков в ответе сервера может быть несколько:
Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry
Браузер будет передавать их клиенту в рамках заголовка Cookie
:
Cookie: yummy_cookie=choco; tasty_cookie=strawberry
Set-Cookie: id=5aoeu; Expires=Wed, 20 Nov 2010 10:15:00 GMT;
HttpOnly
Domain
и Path
Нет строгого стандарта, RFC, который определял бы процедуру авторизации с помощью формы, каждый разработчик может реализовать логику самостоятельно
Ключевая задача — сформировать токен аутентификации и сохранить его в куки
sequenceDiagram participant cli as Браузер participant ser as Сервер cli ->> ser : GET-запрос на аутентификацию ser ->> cli : 200, HTML-документ с формой cli ->> cli : Пользователь заполняет форму и нажимает кнопку «отправить» cli ->> ser : POST-запрос с данными формы, именем пользователя и паролём ser ->> cli : 302, с заголовком `Set-Cookie`, содержащим токен аутентификации cli ->> ser : GET-запрос с заголовком `Cookie` и токеном аутентификации
flowchart TB app[Веб-приложение] ca[Центр сертификации] cli[Клиент] app -- Доверяет центру --> ca ca -- Выдаёт сертификат --> cli cli -- Передаёт сертификат приложению при запросе --> app
Приложение может использовать содержимое сертификата для выполнения авторизации
Ключевая проблема: сертификат надо создать, передать пользователю и, главное, не передать другим пользователям
Обычно применяется для реализации двухфакторной аутентификации:
Источниками одноразовых паролей могут быть:
В веб-приложениях обычно используется:
Данный способ часто применяется для аутентификации устройств, сервисов или других приложений при обращении к веб-сервисам
Ключи можно передавать в параметрах запроса, в теле запроса, в заголовках запроса
Данную схему можно сравнить со схемой аутентификации по сертификатам, только выдачей сертификата занимается разработчик приложения
В рамках данной схемы на сервере выделяется отдельное веб-приложение, выполняющее задачу аутентификации, а другие приложения делегируют эту первому
sequenceDiagram participant cli as Клиент participant iden as Провайдер идентификации participant ser as Поставщик услуг cli ->> iden : Запрос на получение токена для поставщика услуг iden ->> cli : Формирует и возвращает токен cli ->> ser : Запрос к услуге, включающий токен ser ->> cli : Проверяет токен и возвращает ответ на запрос
Предыдущий процесс можно реализовать в специализированных клиентах, однако при использовании браузера процедура становится более сложной
sequenceDiagram participant brow as Веб-браузер participant iden as Провайдер идентификации participant ser as Поставщик услуг brow ->> ser : Посылает GET-запрос по адресу ser ->> brow : Ответ с перенаправлением на службу идентификации brow ->> iden : GET-запрос по указанному адресу iden ->> brow : Страница для ввода аутентификационных данных brow ->> iden : Передача данных с формы iden ->> brow : Отправка HTML-формы с введённым токеном brow ->> ser : Автоматическая отправка формы после открытия ser ->> brow : Показ запрошенной страницы
Существует множество стандартов, среди наиболее популярных: OAuth, OAuth 2.0, OpenID Connect, SAML, WS-Federation
Внутри токена содержится дополнительная информация:
При получении токена его необходимо проверить на соответствие требованиям приложения
Набор пар имя-значение в формате кодирования HTML form, описывает стандартные ключи Issuer, Audience, ExpiresOn и HMACSHA256. Токен подписывается симметричным ключом
Содержит три блока, разделённых точками: заголовок, набор полей и подпись. Первые два блока закодированы в JSON-формате и закодированы в base64. Подпись может быть сформирована как симметричными, так и ассиметричными алгоритмами шифрования
Определяет токены в XML-формате, включающем информацию об эмитенте, субъекте, необходимые условия для проверки токена. Подпись осуществляется при помощи ассиметричной криптографии. Содержат механизм для подтверждения владения токеном
Данные стандарты предназначены в первую очередь для решения задачи по предоставлению доступа одного приложения к другому от имени пользователя
Приложению для своей работы могут потребоваться данные другого:
В рамках стандарта OpenID Connect на основе OAuth разработан слой учётных данных, в рамках которого сервер авторизации предоставляет идентификационный токен
Большие технологические компании и государство предоставляет возможности по аутентификации с помощью данных протоколов: Госуслуги, VK, Яндекс, Сбербанк
Для упрощения данной задачи в промышленных приложениях лучше всего делегировать задачи идентификации и аутентификации внешним приложениям с использованием протоколов OpenID Connect и OAuth 2.0
Для решения задачи аутентификации своими силами необходимо:
В рамках приложения необходимо организовать хранилище для зарегистрированных пользователей. Данное хранилище должно включать объекты с полями:
Пароль пользователя нельзя хранить в открытом виде, т.к. при потере данных (которая точно случится) вся защищённая информация станет доступна
Для защиты пароля рекомендуется использовать схему с добавлением соли
flowchart LR salt("Соль") pass("Пароль") com["Объединение"] full("Соль + пароль") hashing["Хеш-функция"] hashed("Хеш пароля") salt --> com pass --> com com --> full full --> hashing hashing --> hashed
Для верификации сессионных токенов необходимо:
Первая схема сложна в реализации, особенно в распределённых системах. В настоящее время рекомендуется формировать токены по второй схеме, например JWT
При получении токена необходимо его проверить. Если он неверен, то необходимо перенаправить пользователя на страницу аутентификации