Вопрос или проблема
Можно ли использовать токен доступа как сессионную кукурузу в браузере? И как его защитить?
Сценарий таков: у вас есть обновляющий токен, который действителен в течение более длительного периода времени, и токен доступа, который действителен в течение более короткого времени.
Настройка: Есть клиент, сервер приложений и сервер аутентификации.
Клиент хранит токен доступа в браузере. Сервер приложений хранит обновляющий токен. Сервер аутентификации выдает обновляющий и токен доступа. Одним из преимуществ является то, что украденный токен доступа можно использовать только в течение времени, в течение которого он действителен.
Предположим, хакер украл токен доступа, который действителен 30 минут. Когда хакер делает запрос с действительным, но просроченным украденным токеном доступа через 30 минут, сервер приложений обновляет его с помощью обновляющего токена, таким образом, хакер получает новый действительный и не просроченный токен доступа.
Если хакер использует действительный, но просроченный токен, сервер аутентификации не должен возвращать новый действительный токен. Вместо этого сервер аутентификации должен вернуть сообщение “Ошибка аутентификации”.
С другой стороны, приложение должно обновлять токен до его истечения. Если ваш токен истекает через 30 минут, действующее приложение должно обновить его до этого срока.
В зависимости от требований и чувствительности информации в вашем приложении, вы также должны рассмотреть возможность полного завершения сеанса, если от пользователя не было активности в течение 30 минут.
Безопасно хранить токен доступа, обновляющий токен и ID-токен в сессионных куках, при условии, что вы используете аутентифицированное шифрование перед их хранением в куках. Из RFC 6265 HTTP State Management Mechanism:
Серверы ДОЛЖНЫ шифровать и подписывать содержимое куков (используя любой формат по усмотрению сервера) при их передаче пользовательскому агенту (даже при отправке куков по защищенному каналу).
Вы можете использовать AES-GCM-256 для аутентифицированного шифрования сессионных куков, а ключ хранится сервером. Когда пользователь отправляет запрос, вы проверяете действительность токена. Если токен доступа истек, вы должны использовать Тихую аутентификацию, чтобы получить новый токен доступа от поставщика идентификации.
Если у вас есть одностраничное приложение (SPA), то тихая аутентификация может стать прерывающей для пользовательского опыта, поэтому преемником решения для SPA является использование Ротации обновляющих токенов, которое выдает новый токен доступа и новый обновляющий токен каждый раз, когда токен доступа обновляется.
Если злоумышленник способен перехватывать сессионные куки, то считайте это устройство постоянно скомпрометированным. Вы не можете предотвратить перехват сессионных куков, просто меняя токен доступа и обновляющий токен. Злоумышленник просто снова перехватит сессионные куки.
Ответ или решение
Использование токена доступа в качестве сеансового куки в браузере возможно, но требует строгого соблюдения мер безопасности для предотвращения кражи и несанкционированного доступа. В данном сценарии ключевыми элементами являются токен доступа, который обычно имеет короткий срок действия, и токен обновления с более длительным сроком действия.
Основные моменты использования токена доступа в куки:
-
Хранение токенов в куки:
- Токены доступа, обновления и идентификации могут быть безопасно сохранены в сеансовых куки, если они подвергаются аутентифицированному шифрованию. Используйте алгоритмы, такие как AES-GCM-256, для шифрования перед их передачей в браузер.
- Важно, чтобы сервер также подписал куки, что позволит предотвратить формирование поддельных токенов.
-
Проверка токенов на стороне сервера:
- При получении запроса от клиента сервер должен проверять действительность токена доступа. Если токен истек, сервер должен инициировать процесс обновления токена. Вы можете использовать механизм "тихой аутентификации" для получения нового токена доступа, если у вас есть действующий токен обновления.
- Если злоумышленник пытается использовать истекший токен доступа, сервер должен реагировать сообщением "Ошибка аутентификации" и не выдавать новый токен доступа.
-
Обновление токена доступа:
- Важно обновлять токен доступа до его истечения. Если токен истекает через 30 минут, приложение должно запрашивать новый токен заранее, чтобы предотвратить прерывание сеанса для пользователя.
- Для одностраничных приложений (SPA) следует рассмотреть возможность использования ротации токенов обновления, где новый токен доступа и новый токен обновления выдаются каждый раз при обновлении токена доступа.
-
Постоянные риски и компрометация устройства:
- Если злоумышленник получил доступ к сеансовым кукам, рекомендуется считать это устройство скомпрометированным. Ротация токенов доступа и обновления не защитит от повторной кражи токенов, если злоумышленник уже обладает возможностью перехвата куков.
- Управление сеансами:
- В зависимости от чувствительности приложения рекомендуется завершать сеанс пользователя, если не было активности в течение определенного времени (например, 30 минут). Это позволит снизить риск несанкционированного доступа в случае, если человек покинул устройство без выхода из системы.
Заключение
Использование токена доступа в качестве сеансового куки возможно при соблюдении строгих мер безопасности. Аутентифицированное шифрование, надлежащая проверка токенов и управление сессиями играют критическую роль в обеспечении защищенности данных. Также следует учитывать возможность компрометации устройства и готовиться к соответствующим действиям в таких ситуациях.