Почему истекает срок действия токенов доступа?

Я только начинаю работать с Google API и OAuth2. Когда клиент авторизует мое приложение, мне выдается «токен обновления» и недолговечный «токен доступа». Теперь каждый раз, когда срок действия токена доступа истекает, я могу ОТПРАВИТЬ свой токен обновления в Google, и они предоставят мне новый токен доступа.

У меня вопрос: какова цель истечения срока действия токена доступа? Почему не может быть просто токен доступа с длительным сроком действия вместо токена обновления?

Кроме того, истекает ли срок действия токена обновления?

См. Использование OAuth 2.0 для доступа к API Google для получения дополнительной информации о рабочем процессе Google OAuth2.


person levi    schedule 11.08.2011    source источник


Ответы (4)


Это в значительной степени зависит от реализации, но общая идея состоит в том, чтобы позволить поставщикам выпускать краткосрочные токены доступа с долгосрочными токенами обновления. Почему?

  • Многие провайдеры поддерживают токены на предъявителя, которые очень слабы с точки зрения безопасности. Делая их недолговечными и требующими обновления, они ограничивают время, в течение которого злоумышленник может злоупотребить украденным токеном.
  • При крупномасштабном развертывании не требуется выполнять поиск в базе данных при каждом вызове API, поэтому вместо этого они выдают самокодируемый токен доступа, который можно проверить с помощью дешифрования. Однако это также означает, что нет возможности отозвать эти токены, поэтому они выпускаются на короткое время и должны быть обновлены.
  • Маркер обновления требует аутентификации клиента, что делает его более надежным. В отличие от вышеупомянутых токенов доступа, это обычно реализуется с помощью поиска в базе данных.
person Eran Hammer    schedule 12.08.2011
comment
Два вопроса: 1) В случае мобильных приложений, усиливает ли требование аутентификации клиента вообще? Поскольку client_secret является частью исходного кода приложения, это вовсе не секрет. Предполагая, что токен доступа также распространяется только через TLS (и ваш первый пункт маркера не применяется), есть ли дополнительная безопасность? 2) Предполагая, что все это выполняется в нашем сценарии (только TLS, без самокодируемых безотзывных токенов), можно ли выпускать токены доступа с неограниченным сроком действия? - person Thilo; 06.07.2012
comment
Что такое токен на предъявителя и какое отношение он имеет к токенам обновления и доступа? - person allyourcode; 12.11.2012
comment
@Thilo Я думаю, что идея в том, что токены доступа не должны быть отзывными. Как указывает Эран, это позволяет запрашиваемой службе решить, обслуживать ли запрос ‹em›, без необходимости искать токен доступа в какой-либо базе данных ‹/em›. AFAICT, это реальное преимущество разделения токенов обновления и токенов доступа. - person allyourcode; 12.11.2012
comment
Как недолговечен токен доступа (предъявителя?)? Если я сделаю запрос с истекшим токеном на предъявителя, токен обновления вернет новый токен на предъявителя. Точно так же, если я украду чей-то токен из их файлов cookie и подделываю свой собственный файл cookie с помощью этого токена, я отправляю его на сервер, он обновится и отправит мне новый. Что это остановить? Не называйте IP-адрес или даже MAC, потому что это неразумно. - person Suamere; 24.09.2015
comment
@Suamere, это уже объяснялось. Токены-носители проверяются криптографическим процессом, который не затрагивает базу данных аутентификации, что делает их гораздо более эффективными для частого доступа к ресурсам. Токены обновления проверяются в процессе, который включает проверку базы данных, чтобы убедиться, что она все еще действительна. А теперь подумайте, как работает Gmail. Если кто-то войдет в вашу учетную запись из неожиданного географического местоположения, вы можете получить предупреждение. Вы можете увидеть все местоположения, в которых могут быть действующие токены обновления. Вы можете выйти из всех местоположений, сделав недействительными все остальные токены обновления. - person Bon; 05.12.2015
comment
@klatzib Хотя вы правы в том, что то, что вы сказали, уже было объяснено и что у вас есть хорошая информация, это не является отдаленным ответом на мой вопрос. Если мой сосед украдет мой токен, он может отправлять его провайдеру каждую минуту, и провайдер с радостью обновит их и каждый раз будет возвращать им новый токен. Что этому мешает? - person Suamere; 07.12.2015
comment
Что мешает, так это то, что я набрал последние два предложения в своем ответе. Сделайте украденный токен обновления недействительным, и их запас токенов доступа иссякнет, как только истечет срок их действия. Задача состоит в том, чтобы идентифицировать аномальное поведение, сообщающее пользователю, что может быть проблема, требующая выхода из других мест, как это делает Gmail. - person Bon; 07.12.2015
comment
Запросы @Suamere Refresh выполняются клиентом отдельно от обычных запросов ресурсов. Токен обновления не включается в обычные запросы ресурсов (серверы ресурсов не могут обновлять токены!), Поэтому, если токен доступа украден, а затем истекает срок его действия, вор не сможет получить новый токен доступа, если ему также не удалось украсть токен обновления ( который был передан только тогда, когда токен доступа был первоначально получен клиентом). Даже в этом случае им также потребуются действительные учетные данные клиента для успешного обновления. Все основано на документации OAuth2, хотя, как сказал Эран, реализация может отличаться. - person talrnu; 19.01.2016
comment
@talrnu Срок действия AccessToke (AT) составляет ~ 5 минут, но всякий раз, когда я выполняю действие с графическим интерфейсом (даже переключение страниц), я получаю новый AT. Либо это, либо сеанс поддерживается с помощью периодического HTTP-вызова javascript KeepAlive на веб-сервер, который постоянно обновляет мой AT. В любом случае, если я украду AT, я могу использовать один из этих двух механизмов для выполнения действий до тех пор, пока срок действия токена обновления на веб-сервере не истечет (обычно долгое время). Цель этого (этих) комментариев заключается в том, что, если я прав, пункт 1 этого ответа недействителен. Я никогда ничего не говорил о краже жетона обновления. - person Suamere; 20.01.2016
comment
@Suamere Вы хотите сказать, что ваш клиент выполняет запрос на обновление для каждого вашего действия с графическим интерфейсом пользователя? Или вы говорите, что каждый запрос ресурса, сделанный вашим клиентом, возвращает новый токен без отдельного запроса на обновление? Последний случай несовместим со спецификацией OAuth 2, это совсем другое дело, поэтому он не подходит для этого обсуждения. В первом случае не очень эффективно используется эффективность, которую обеспечивают прерывистые запросы на обновление, но он по-прежнему не позволяет использовать AT после истечения срока его действия, поэтому точка 1 в ответе действительна. Или я неправильно понимаю ваше описание вашего клиента? - person talrnu; 20.01.2016
comment
@Suamere Между прочим, в OAuth 2 токен обновления не находится на веб-сервере, он передается клиенту вместе с AT при первой аутентификации клиента. Если ваша система не работает, значит, это не OAuth 2. - person talrnu; 20.01.2016
comment
@talrnu Не так, как читал спец. Клиент не означает Владелец ресурса. Владелец ресурса является пользователем собственного приложения, а клиент в OAuth обычно не означает, что человек входит в систему, но приложение (служба, сервер и т. Д.) Может просматривать ресурсы или проходить аутентификацию. В спецификации говорится, что AT и RT отправляются обратно клиенту. В спецификации намеренно не упоминается, как и что отправлять Владельцу ресурса, потому что это деталь реализации. Некоторые люди отправляют токен обновления обратно в RO, некоторые - нет. Работая в очень крупных компаниях, я еще не видел, чтобы RT отправлялся обратно в cookie. - person Suamere; 20.01.2016
comment
@Suamere Если я не упускаю чего-то тонкого, похоже, вы только что описали именно то, что я описал. Я был бы рад продолжить это обсуждение в чате, если вы все еще считаете, что часть этого ответа неверна. - person talrnu; 21.01.2016

Несколько сценариев могут помочь проиллюстрировать цель доступа и обновления токенов и инженерные компромиссы при разработке системы oauth2 (или любой другой аутентификации):

Сценарий веб-приложения

В сценарии веб-приложения у вас есть несколько вариантов:

  1. если у вас есть собственное управление сеансом, сохраните как access_token, так и refresh_token для вашего идентификатора сеанса в состоянии сеанса в вашей службе состояния сеанса. Когда страница запрашивается пользователем, который требует от вас доступа к ресурсу, используйте access_token, а если срок действия access_token истек, используйте refresh_token, чтобы получить новый.

Представим, что кому-то удалось захватить вашу сессию. Единственное, что можно - это запросить свои страницы.

  1. если у вас нет управления сеансом, поместите access_token в файл cookie и используйте его как сеанс. Затем, когда пользователь запрашивает страницы с вашего веб-сервера, отправляйте access_token. При необходимости сервер приложений может обновить access_token.

Сравнение 1 и 2:

В 1 access_token и refresh_token перемещаются только по сети на пути между сервером авторизации (в вашем случае google) и сервером вашего приложения. Это будет сделано по безопасному каналу. Хакер может захватить сеанс, но он сможет взаимодействовать только с вашим веб-приложением. На этапе 2 хакер может забрать access_token и сформировать свои собственные запросы к ресурсам, к которым пользователь предоставил доступ. Даже если хакер получит access_token, у него будет только короткое окно, в котором он сможет получить доступ к ресурсам.

В любом случае refresh_token и clientid / secret известны только серверу, что делает невозможным получение долгосрочного доступа через веб-браузер.

Представим, что вы реализуете oauth2 и устанавливаете длительный тайм-аут для токена доступа:

В 1) Здесь нет большой разницы между коротким и длинным токеном доступа, поскольку он скрыт на сервере приложений. Во 2) кто-то может получить access_token в браузере, а затем использовать его для прямого доступа к ресурсам пользователя в течение длительного времени.

Мобильный сценарий

На мобильных устройствах я знаю несколько сценариев:

  1. Храните клиентские / секретные данные на устройстве и позволяйте устройству управлять получением доступа к ресурсам пользователя.

  2. Используйте внутренний сервер приложений для хранения клиента / секрета и управления им. Используйте access_token как своего рода ключ сеанса и передавайте его между клиентом и сервером приложений.

Сравнение 1 и 2

В 1) Как только у вас есть клиент / секрет на устройстве, они больше не являются секретом. Любой может декомпилировать, а затем начать действовать так, как если бы он был вами, конечно, с разрешения пользователя. Access_token и refresh_token также находятся в памяти и могут быть доступны на взломанном устройстве, что означает, что кто-то может действовать как ваше приложение без предоставления пользователем своих учетных данных. В этом сценарии длина access_token не влияет на возможность взлома, поскольку refresh_token находится в том же месте, что и access_token. Во 2) ни клиент / секрет, ни токен обновления не скомпрометированы. Здесь длина срока действия access_token определяет, как долго хакер может получить доступ к пользовательским ресурсам, если он их получит.

Срок годности

Здесь зависит от того, что вы защищаете с помощью своей системы аутентификации, как долго должен быть срок действия вашего access_token. Если это что-то особенно ценное для пользователя, оно должно быть коротким. Что-то менее ценное, может быть и дольше.

У некоторых людей, таких как Google, не истекает срок действия refresh_token. Некоторым нравится stackflow. Решение об истечении срока действия - это компромисс между простотой использования и безопасностью. Длина токена обновления связана с длиной, возвращаемой пользователем, т. Е. Задайте для обновления, как часто пользователь возвращается в ваше приложение. Если срок действия токена обновления не истекает, единственный способ их отзыва - это явный отзыв. Обычно вход в систему не отменяется.

Надеюсь, этот довольно длинный пост будет полезен.

person Ed Sykes    schedule 10.10.2013
comment
о МОБИЛЬНОМ СЦЕНАРИИ не имеет значения, храните ли вы идентификатор клиента на своем сервере. поэтому любое другое приложение может просто отправить запрос на ваш сервер и получить доступ к ресурсам пользователей через ваш сервер, так что это то же самое - person Amir Bar; 01.12.2014
comment
true, но тогда у них будет доступ только к предоставляемым вами средствам, а не к полному доступу к базовому токену. Т.е. они могут выдавать себя за ваше приложение. Часто токены могут иметь широкие права доступа, тогда как вам требуется только подмножество. Удержание токена в серверной части дает дополнительные ограничения, если вам это нужно. - person Ed Sykes; 30.07.2015

В дополнение к другим ответам:

После получения токены доступа обычно отправляются вместе с каждым запросом от клиентов на защищенные серверы ресурсов. Это вызывает риск кражи и воспроизведения токенов доступа (конечно, при условии, что токены доступа относятся к типу Bearer (как определено в исходном RFC6750).

Примеры таких рисков в реальной жизни:

  • Серверы ресурсов обычно представляют собой распределенные серверы приложений и обычно имеют более низкие уровни безопасности по сравнению с серверами авторизации (меньшая конфигурация SSL / TLS, меньшая защита и т. Д.). С другой стороны, серверы авторизации обычно считаются критически важной инфраструктурой безопасности и подлежат более серьезному усилению.

  • Токены доступа могут отображаться в HTTP-трассировках, журналах и т. Д., Которые законно собираются для диагностических целей на серверах ресурсов или клиентах. Этими следами можно обмениваться в общественных или полуобщественных местах (средства отслеживания ошибок, служба поддержки и т. Д.).

  • Backend RS-приложения могут быть переданы более или менее надежным сторонним организациям.

С другой стороны, токен обновления обычно передается только дважды по проводам и всегда между клиентом и сервером авторизации: один раз при получении клиентом и один раз. когда используется клиентом во время обновления (фактически "истекает" предыдущий токен обновления). Это резко ограниченная возможность для перехвата и воспроизведения.

Последняя мысль: токены обновления предлагают очень слабую защиту от скомпрометированных клиентов.

person Guillaume    schedule 12.06.2017
comment
Вы несколько затронули этот вопрос, но я хотел бы подчеркнуть, что большая поверхность атаки для получения (или, наоборот, непреднамеренного разглашения) токенов находится в журналах приложений или злонамеренно добавленных ресурсных службах (сегодня это не MITM-атака). Практически везде в обычном бэкэнде API есть доступ к используемому токену доступа (если у него есть доступ к объекту HttpRequest и т. Д.). Только ДВА кодовых пути в системе имеют доступ к токену обновления - тот, который его генерирует в первую очередь, и тот, который обменивает его на новый токен доступа. Это значительная разница в поверхности атаки. - person Tom Dibble; 05.06.2019

По сути, это мера безопасности. Если ваше приложение скомпрометировано, злоумышленник получит доступ только к краткосрочному токену доступа и не сможет создать новый.

Срок действия токенов обновления также истекает, но предполагается, что они живут намного дольше, чем токен доступа.

person Claudio Cherubino    schedule 11.08.2011
comment
Но разве у злоумышленника не будет доступа к токену обновления? и чем можно использовать это для создания нового токена доступа? - person levi; 12.08.2011
comment
Вы отправляете токен доступа только со своими запросами, поэтому злоумышленник сможет только его перехватить. Если они получат ваш токен обновления, вы все равно можете его отозвать. - person Claudio Cherubino; 12.08.2011
comment
@levi, хакер не может использовать токен обновления для создания нового токена доступа, потому что идентификатор клиента и секрет клиента необходимы вместе с токеном обновления для создания нового токена доступа. - person Spike; 09.02.2012
comment
@Spike Верно, но разве в приложении нет встроенного идентификатора клиента и секрета? - person Andy; 25.07.2012
comment
Таким образом, он обеспечивает некоторую защиту от перехвата пакетов, если перехват только улавливает обычные запросы данных (Чак получает только токен доступа)? Это звучит немного слабо; черная шляпа просто должна немного подождать, пока пользователь не запросит новый токен доступа, а затем он получит идентификатор клиента, секрет и токен обновления. - person ; 14.02.2013
comment
Это может просто меня задерживать здесь, но если это отправлено через SSL, это не добавляет еще одного возможного уровня безопасности. Я предполагаю, что все знают, что такое SSL. - person Damon Drake; 19.06.2013
comment
Да, вы должны использовать ssl с вызовами, чтобы получить токен доступа. Многие сервисы даже этого требуют. - person Igor Čordaš; 02.06.2014
comment
@DamonDrake SSL распространяется только на транспорт, поэтому вероятным сценарием является кража этих токенов из клиентского хранилища. - person m0s; 16.09.2016