Авторизация: от основ до технической реализации
Ключевые тезисы
- Авторизация — это многоступенчатый процесс, включающий идентификацию, аутентификацию и собственно авторизацию.
- Технически доступ к ресурсам делится на публичные и приватные запросы.
- Для приватных запросов используются схемы авторизации: Basic, Bearer (JWT) и протокол OAuth 2.0.
- Современные распределённые системы часто используют внешние сервисы (Identity Provider, Authorization Server) или готовые решения (Keycloak, сервисы Google, Яндекс).
Основное содержание
Три этапа процесса доступа
Процесс, который в быту называют "авторизацией", состоит из трёх последовательных этапов:
Идентификация
- Процедура, позволяющая системе понять, "кто стучится".
- Пользователь предоставляет идентификатор (логин, email, телефон, ИНН компании).
- Система проверяет, есть ли такой идентификатор в базе. На этом этапе не проверяются права или подлинность.
Аутентификация
- Процедура проверки подлинности.
- Пользователь доказывает, что он — это тот, за кого себя выдал на этапе идентификации.
- Использует доказательные механизмы: знание (пароль, пин-код), владение (телефон для SMS, токен, электронная подпись), биометрию (отпечаток, лицо).
- Многофакторная аутентификация — комбинация нескольких механизмов (например, пароль + SMS-код).
Авторизация
- Процедура наделения аутентифицированного пользователя определёнными правами и ролями в системе.
- Определяет, что пользователь может делать (просматривать, редактировать, удалять).
- Примеры ролей: гость, пользователь, администратор.
- Если пользователь не авторизован, ему обычно присваивается роль "гость" с минимальными правами.
Типы запросов
- Публичные (Public) запросы: доступны всем, ограничений нет (например, просмотр каталога без входа).
- Приватные (Private) запросы: требуют прохождения процесса авторизации для получения доступа к защищённым ресурсам.
Технические схемы авторизации
Basic-авторизация
- Простейшая схема. Логин и пароль кодируются (например, в Base64) и передаются в заголовке (
Authorization) каждого запроса. - Сервер декодирует данные, проводит аутентификацию и авторизацию.
- Недостаток: учётные данные передаются с каждым запросом. Подходит для простых систем или внутренней интеграции.
Bearer-авторизация (JWT)
- Использует JWT-токен (JSON Web Token) — компактную строку для безопасной передачи данных.
- Алгоритм:
- Клиент обращается к сервису авторизации с логином и паролем.
- Получает JWT-токен.
- Передаёт этот токен в заголовке (
Authorization: Bearer <token>) при запросах к другим сервисам.
- Структура JWT (три части, разделённые точками):
- Header: тип токена и алгоритм подписи.
- Payload (полезная нагрузка): содержит клеймы (claims) — данные о пользователе, его роли и права.
- Signature (подпись): нужна для проверки подлинности токена.
- Преимущество: не нужно передавать логин/пароль каждый раз. Токен имеет время жизни.
Протокол OAuth 2.0 и OpenID Connect
Стандарты для безопасного делегирования доступа в распределённых системах.
OAuth 2.0
- Протокол авторизации без аутентификации.
- Позволяет получить доступ к ресурсам, не передавая пароль.
- Выдаёт access token (часто JWT) для доступа к API.
- Может выдавать refresh token для обновления access token'а без повторного ввода логина и пароля.
- Пример: "Войти через Google/VK" — сторонний сервис получает доступ только к разрешённым данным (email), но не к паролю от аккаунта.
OpenID Connect (OIDC)
- Надстройка над OAuth 2.0 для аутентификации.
- Позволяет клиенту убедиться в личности пользователя и получить базовую информацию о нём.
- Добавляет к процессу OAuth ID-токен с данными пользователя.
Компоненты архитектуры OAuth/OIDC
- Identity Provider (IDP): отвечает за идентификацию, аутентификацию и хранение учётных записей. Возвращает информацию о пользователе.
- Authorization Server (AS): отвечает за выдачу токенов (access, refresh, ID) и проверку разрешений клиентов.
Готовые решения и выбор технологии
- Провайдеры: Google Accounts, Microsoft Active Directory, Яндекс.
- Open-source: Keycloak — популярное решение, объединяющее IDP и AS, с возможностями управления пользователями.
- Выбор схемы зависит от архитектуры:
- Монолит/Single Page Application: может быть достаточно Basic-авторизации.
- Микросервисная/распределённая архитектура: необходим отдельный сервис аутентификации (OAuth 2.0, OIDC) или готовое решение (Keycloak).
- Решение принимается архитектором и заказчиком с учётом политик безопасности, существующей инфраструктуры и требований.
Дополнительные аспекты безопасности
Капча (CAPTCHA)
- Используется на этапе аутентификации (чаще при регистрации или входе).
- Цель — отличить человека от робота и защититься от автоматических атак.
- Необходима для публичных сервисов; для внутренних порталов может не требоваться.
Многофакторная аутентификация (MFA)
- Частота использования зависит от стандартов безопасности компании и уровня обрабатываемых данных.
- Обязательна для сервисов, работающих с чувствительной информацией (банки, медицинские данные, госуслуги), и регулируется стандартами вроде PCI DSS.
Хранение токенов на клиенте
- JWT-токены для веб-приложений часто хранятся в куках (cookies) или локальном хранилище (localStorage).
- Хранение в куках обычно безопаснее (защита от некоторых видов XSS-атак). Удаление куки приводит к разрыву сессии.
Выводы
- Авторизация — это комплексный процесс, начинающийся с идентификации пользователя и заканчивающийся выдачей ему конкретных прав.
- JWT-токены и протокол OAuth 2.0 стали стандартом для авторизации в современных распределённых и микросервисных архитектурах.
- Выбор конкретной схемы и инструментов (Basic, Keycloak, облачный провайдер) является архитектурным решением и зависит от масштаба, требований безопасности и существующей инфраструктуры проекта.