Я хотел бы добавить к этому еще одну точку зрения.
Аутентификация без сохранения состояния без обращения к БД при каждом запросе
Предположим, вы хотите создать механизм безопасности без сохранения состояния (без сеанса), который может выполнять аутентификацию миллионов пользователей без необходимости выполнять вызов базы данных для аутентификации. Со всем трафиком, который получает ваше приложение, сохранение вызова БД при каждом запросе дорого стоит! Кроме того, он не должен иметь состояния, чтобы его можно было легко кластеризовать и масштабировать до сотен или даже тысяч серверов.
В старомодных сеансах пользователь входит в систему, и в этот момент мы считываем информацию о пользователе из базы данных. Чтобы не читать его снова и снова, мы сохраняем его в сеансе (обычно в памяти или в каком-то кластерном кеше). Мы отправляем клиенту идентификатор сеанса в файле cookie, который прикрепляется ко всем последующим запросам. В последующих запросах мы используем идентификатор сеанса для поиска сеанса, который, в свою очередь, содержит информацию о пользователе.
Поместите информацию о пользователе прямо в токен доступа
Но нам не нужны сеансы. Поэтому вместо того, чтобы хранить информацию о пользователе в сеансе, давайте просто поместим ее в токен доступа. Мы подписываем токен, чтобы никто не мог его подделать, и готово. Мы можем аутентифицировать запросы без сеанса и без необходимости искать информацию о пользователе в БД для каждого запроса.
Нет сеанса ... нет возможности банить пользователей?
Но отсутствие сеанса имеет большой недостаток. Что, если этого пользователя забанят, например? В старом сценарии мы просто удаляем его сеанс. Затем он должен снова войти в систему, что он не сможет сделать. Запрет завершен. Но в новом сценарии сеанса нет. Так как же мы можем его забанить? Нам придется попросить его (очень вежливо) удалить его токен доступа. Проверять каждый входящий запрос на список запретов? Да, сработает, но теперь мы снова должны сделать тот вызов БД, который нам не нужен.
Компромисс с недолговечными токенами
Если мы считаем приемлемым, что пользователь все еще может использовать свою учетную запись, скажем, в течение 10 минут после блокировки, мы можем создать ситуацию, которая представляет собой компромисс между проверкой БД при каждом запросе и только при входе в систему. И здесь на помощь приходят токены обновления. Они позволяют нам использовать механизм без сохранения состояния с недолговечными токенами доступа. Мы не можем отозвать эти токены, поскольку для них не выполняется проверка базы данных. Мы проверяем только дату истечения срока их действия по сравнению с текущим временем. Но по истечении срока их действия пользователю потребуется предоставить токен обновления, чтобы получить новый токен доступа. На этом этапе мы проверяем БД и видим, что пользователь был забанен. Таким образом, мы отклоняем запрос токена доступа, и запрет вступает в силу.
person
Stijn de Witt
schedule
24.10.2016