Позвольте мне перейти к вашим вопросам чуть позже и начать с обсуждения всей цели токена обновления.
Итак, ситуация такова:
Пользователь открывает приложение и предоставляет свои учетные данные. Теперь, скорее всего, приложение взаимодействует с серверной службой REST. REST не имеет состояния, нет способа авторизовать доступ к API. Следовательно, до сих пор в обсуждении нет способа проверить, получает ли авторизованный пользователь доступ к API или просто поступают какие-то случайные запросы.
Теперь, чтобы решить эту проблему, нам нужен способ узнать, что запросы поступают от авторизованного пользователя. Итак, мы представили так называемый токен доступа. Итак, теперь, когда пользователь успешно аутентифицирован, ему выдается токен доступа. Этот токен должен быть длинным и очень случайным (чтобы его нельзя было угадать). Здесь на сцену выходит JWT. Теперь вы можете / можете не захотеть хранить какие-либо пользовательские данные в токене JWT. В идеале вы хотели бы просто хранить в JWT очень простые, крайне нечувствительные детали. Манипуляции с хешем JWT для получения сведений о других пользователях (IDOR и т. Д.) Выполняются самим JWT (используемой библиотекой).
Итак, на данный момент наша проблема с авторизованным доступом решена.
Теперь поговорим о сценарии атаки. Скажем, используя всех перечисленных выше пользователей, Алиса, использующая приложение, имеет авторизованный токен доступа, и теперь ее приложение может делать запросы ко всем API и извлекать данные в соответствии с ее авторизацией.
Предположим, КАК Алиса теряет токен доступа или, другими словами, злоумышленник, Боб, получает доступ к токену доступа Алисы. Теперь Боб, несмотря на то, что он не авторизован, может делать запросы ко всем API, к которым Алиса была авторизована.
ЧТО-ТО МЫ ИДЕАЛЬНО НЕ ХОЧЕМ.
Теперь решение этой проблемы:
- Либо обнаружите, что что-то в этом роде происходит.
- Уменьшите само окно атаки.
Используя только токен доступа, трудно достичь условия 1, описанного выше, потому что, будь то Алиса или Боб, используется один и тот же авторизованный токен, и, следовательно, запросы от двух пользователей не различимы.
Итак, мы пытаемся достичь 2 выше, и, следовательно, мы добавляем истечение срока действия токена доступа, скажем, токен доступа действителен в течение 't' (кратковременного) времени.
Как это помогает? Что ж, даже если у Боба есть токен доступа, он может использовать его, только пока он действителен. Как только он истечет, ему придется забрать его снова. Теперь, конечно, можно сказать, что он может получить это так же, как и в первый раз. Но опять же, нет ничего лучше 100% безопасности!
Вышеупомянутый подход все еще имеет проблему, а в некоторых случаях является неприемлемой. Когда срок действия токена доступа истекает, пользователю потребуется ввести свои учетные данные для входа и снова получить авторизованный токен доступа, что, по крайней мере, в случае мобильных приложений, является плохим (неприемлемым) пользовательским интерфейсом.
Решение. Здесь на помощь приходит токен обновления. Это снова случайный непредсказуемый токен, который также выдается приложению вместе с токеном доступа в первую очередь. Этот токен обновления является очень долгоживущим специальным токеном, который гарантирует, что, как только срок действия токена доступа истечет, он запрашивает у сервера новый токен доступа, тем самым избавляя пользователя от необходимости повторно вводить свои учетные данные для получения новый маркер авторизованного доступа после истечения срока действия существующего.
Теперь вы можете спросить, Боб также может иметь доступ к токену обновления, аналогично тому, как он скомпрометировал токен доступа. ДА. Он может. Однако теперь становится легко выявить такой инцидент, что было невозможно в случае использования одного только токена доступа, и предпринять необходимые действия для уменьшения нанесенного ущерба.
Как?
Для каждого аутентифицированного пользователя (в случае мобильного приложения, как правило) приложению выдается один к одному сопоставленный токен обновления и пара токенов доступа. Таким образом, в любой момент времени для одного аутентифицированного пользователя будет только один токен доступа, соответствующий токену обновления. Теперь предположим, что если Боб скомпрометировал токен обновления, он будет использовать его для создания токена доступа (поскольку токен доступа - единственное, что разрешено для доступа к ресурсам через API). Как только Боб (злоумышленник) запрашивает вновь сгенерированный токен доступа, потому что токен доступа Алисы (подлинного пользователя) все еще действителен, сервер будет рассматривать это как аномалию, потому что для одного токена обновления может быть только один авторизованный токен доступа в время. Выявив аномалию, сервер уничтожит соответствующий токен обновления, и вместе со всем этим связанные с ним токены доступа также станут недействительными. Таким образом предотвращается любой дальнейший доступ, подлинный или злонамеренный, к авторизации, требующей ресурсов. Пользователь, Алиса, должен будет снова пройти аутентификацию с использованием своих учетных данных и получить действительную пару токенов обновления и доступа.
Конечно, вы все равно можете утверждать, что Боб может снова получить доступ как к токенам обновления, так и к токенам доступа и повторить всю историю, описанную выше, что может привести к DoS-атаке на Алисе, фактическом подлинном клиенте, но опять же, нет ничего лучше 100% безопасности. .
Также рекомендуется, чтобы токен обновления имел срок действия, хотя и довольно долгий.
person
qre0ct
schedule
29.03.2016