Когда и как использовать Access Token и Refresh Token
Что проверяют
Понимаете ли вы, зачем токенов два, и знаете ли, где их безопасно хранить.
Как отвечать
Токен доступа короткоживущий, обычно от нескольких минут до часа. Отправляется с каждым запросом, содержит идентификатор пользователя и права. Сервер проверяет подпись и не ходит в базу, поэтому проверка дешёвая.
Токен обновления долгоживущий, дни или недели. Используется только для получения нового токена доступа и никуда больше не отправляется.
Зачем разделение: короткий срок жизни первого ограничивает ущерб от утечки, а его отзыв не нужен, потому что он скоро протухнет сам. Второй хранится в более защищённом месте, отправляется редко и может быть отозван на сервере, что мгновенно завершает сессию.
Где хранить, это ключевая часть ответа:
- токен доступа в памяти приложения. Не в локальном хранилище: оттуда его достанет любой межсайтовый скрипт;
- токен обновления в куке с флагами недоступности из скриптов, передачи только по защищённому соединению и ограничения на межсайтовую отправку. Тогда скрипт до него не доберётся вовсе.
Как реализуется на клиенте: перехватчик запросов. Получили ответ об истёкшем токене, значит идём обновляться, повторяем исходный запрос. Обязательная деталь: при нескольких параллельных запросах обновление не должно запускаться несколько раз. Обычно держат один общий промис обновления, к которому подстраиваются все ожидающие.
Что стоит добавить про безопасность: ротация, когда при каждом обновлении выдаётся новый токен обновления, а старый становится недействительным. Повторное использование старого означает, что его украли, и все сессии пользователя завершаются. Это стандартная рекомендация современных руководств.
Где спотыкаются
Хранят оба токена в локальном хранилище.
Не защищаются от лавины параллельных обновлений.
Делают срок жизни токена доступа сутки, теряя весь смысл схемы.
Не предусматривают отзыв и не могут завершить сессию.