Обеспечивают ли токены обновления JWT большую безопасность? Где их хранить?

Я изо всех сил пытаюсь понять, почему токены обновления JWT безопаснее, чем просто использование обычных токенов доступа JWT с длительным сроком службы. Я понимаю, что, сокращая срок службы токенов доступа JWT, он ограничивает окно возможностей для злоумышленников злоупотреблять ими. Это предполагает, что уровень SSL HTTPS каким-то образом был обойден злоумышленником, чтобы в первую очередь получить токен доступа JWT.

Как именно токены обновления JWT решают эту проблему? По истечении срока действия токена доступа вам придется передать токен обновления, который также может быть взломан, если мы предположим, что HTTPS недостаточно безопасен. Если злоумышленник получает контроль над токеном обновления, то теперь у него есть доступ к большому количеству токенов доступа, поскольку токены обновления обычно имеют длительный срок службы. В качестве расширения можно также сказать, что первоначальная аутентификация по имени пользователя и паролю может быть украдена, если протокол HTTPS будет скомпрометирован.

Поскольку токен обновления должен храниться во внешнем интерфейсе (я создаю загрузочное приложение Angular / Spring), мы должны проявлять особую осторожность, чтобы токен обновления также не мог быть украден на стороне клиента. LocalStorage явно не подходит для хранения токена обновления, поскольку он не предназначен для использования в качестве безопасного хранилища. Они также не подходят для отправки каждого запроса, поскольку в противном случае они были бы украдены вместе с токеном доступа, что в первую очередь противоречит цели наличия коротких токенов доступа. Где хранить токен обновления?

Если я хочу предоставить функцию запомнить на странице входа, могу ли я просто установить токен обновления с бесконечным сроком службы?

Я уже просмотрел несколько хорошо написанных ответов по следующим ссылкам (и другим):

Что, если JWT украден? Рекомендации SPA для аутентификации и управления сеансами https://security.stackexchange.com/questions/119371/is-refreshing-an-expired-jwt-token-a-good-strategy

Но эти 3 вопроса меня не удовлетворяют.


person Babyburger    schedule 22.06.2019    source источник


Ответы (2)


Я постараюсь ответить на все вопросы в вашем вопросе

  • Не используйте токены обновления JWT. Используйте непрозрачные токены обновления. Обычно JWT должны иметь очень короткий срок службы. Причина в том, что отменить их может быть невозможно, если у вас нет черного списка.

  • Вы можете хранить токены обновления в защищенных файлах cookie HttpOnly. Если вы хотите избежать CSRF и XSS, вы можете разделить токен доступа и сохранить половину в файлах cookie, а другую половину - в localstorage.

  • Если вы предполагаете, что https скомпрометирован (что на самом деле возможно), лучшая защита здесь - принять меры для обнаружения украденных токенов обновления. Вы можете сделать это, реализовав ротацию токенов обновления. Это также можно использовать для простой реализации функции «запомнить меня» с высочайшим уровнем безопасности.

Вообще, это довольно сложная тема, и я не смогу здесь все объяснить. Итак, вот запись в блоге Мне нравится это объяснять все, что нужно сделать с безопасностью сеанса. У них также есть библиотека с открытым исходным кодом под названием SuperTokens, которую вы можете использовать, это безусловно, самая безопасная реализация, которую я когда-либо видел. У них есть это в различных технических стеках, а также они могут реализовать один для вашего технического стека.

person Rishabh Poddar    schedule 23.06.2019
comment
Мне нравится ваша идея разделить токен доступа на хранилище файлов cookie и localStorage для смягчения последствий CSRF и XSS. Но как это отвечает на вопрос OP относительно токена обновления? - person Nathan; 26.07.2020
comment
Спасибо! Я считал, что ответил на вопрос OP (отсюда и галочка). Материал CSRF должен был дать полный ответ. - person Rishabh Poddar; 10.08.2020

Вы уже получили ответ и выбрали его, но я подумал, что добавлю еще одну перспективу.

Я начну с небольшого мифа с одним из ваших предположений:

LocalStorage явно не подходит для хранения токена обновления, поскольку он не предназначен для использования в качестве безопасного хранилища.

Я уверен, что некоторые не согласятся со мной по этому поводу, но для меня LocalStorage так же безопасно, как хранилище файлов cookie, если не больше.

Файлы cookie подвержены атакам CSRF, в то время как LocalStorage не так сильно. И LocalStorage, и файлы cookie подвержены атакам XSS (даже файлы cookie httpOnly, поскольку внедренный код может выполнять любую операцию с учетными данными).

Таким образом, с этой точки зрения файлы cookie предлагают большую поверхность для атак, чем LocalStorage.

Поэтому я не вижу никаких проблем с хранением токенов обновления NOR доступа в LocalStorage исключительно с точки зрения безопасности.

Помимо соображений безопасности, вам может потребоваться хранить их в LocalStorage (или в хранилище без файлов cookie) в зависимости от платформы (платформ), на которой вы развертываете развертывание, например: некоторые мобильные платформы не поддерживают файлы cookie.

И наоборот, если вы планируете запускать веб-приложение JS, которое выполняет рендеринг на стороне сервера, вам могут потребоваться файлы cookie, поскольку обычно серверный процесс не имеет доступа к LocalStorage.

Так что вопрос не только в безопасности.

Что касается основной сути вашего вопроса, который я понял как:

Если маркеры доступа подвержены атакам, что делает маркеры обновления полезными, поскольку они тоже должны быть подвержены тем же атакам?

Ты прав. И токены доступа, и токены обновления могут быть скомпрометированы. Вопрос в том ... что ваш сервер может с этим поделать, когда узнает?

Идея токенов доступа и токенов обновления заключается в том, что токены доступа недолговечны, а токены обновления - долгоживущие.

Лично я не вижу особой пользы в токенах обновления, если только вы не используете JWT в качестве токена доступа, что вы и уклонились в своем сообщении.

Как вы, вероятно, знаете, JWT не имеют состояния (хотя вы можете реализовать белые / черные списки, которые сделают их с отслеживанием состояния, но такого рода поражение цели). Поэтому сервер ничего не может сделать, чтобы отключить JWT без сохранения состояния.

В связи с этим некоторые считают рискованным иметь длинные истечения срока действия JWT, поскольку их нелегко отключить в случае компрометации. Я согласен с этим.

Таким образом, чтобы получить лучшее из обоих миров, можно использовать JWT с коротким сроком действия (10 минут или около того) с токенами обновления с длинным сроком действия (многие реализации OAuth никогда не истекают токенами обновления).

Эта стратегия возвращает вашему серверу некоторый контроль, позволяя ему отказывать в выдаче новых токенов обновления, тем самым запрещая новые токены доступа, а также извлекая выгоду из некоторых преимуществ JWT.

person Nathan    schedule 11.08.2020
comment
Спасибо, что написали такое подробное объяснение! Я задал этот вопрос некоторое время назад и после дополнительных исследований пришел к такому же выводу: токены обновления не более защищены от атак, но они возвращают контроль серверу. Мы не согласны с использованием LocalStorage, но это уже другая тема. :) - person Babyburger; 11.08.2020