Какой самый безопасный способ сохранить jwt и при этом иметь к нему доступ из javascript?

Я работаю с Flask и restful API для обработки вызовов управления пользователями. Пример сценария: допустим, я использую JWT для защиты конечной точки сброса пароля. Сейчас я экспериментировал с менее безопасным методом, где я извлекаю токен как часть ответа от предыдущей конечной точки и передаю его как токен-носитель, но я все еще получаю ошибку 401 Несанкционированный. Хотя из отладки на стороне клиента видно, что токен передается в заголовке. В идеале я хочу отправить почтовый запрос с HTTP-заголовком авторизации и схемой аутентификации на предъявителя и передать этот токен из файла cookie httponly.

Вот вопросы, которые у меня есть:

Должен ли я хранить токен в HttpOnly Cookie или Localalstorage? Если я использую куки HttpOnly, как я могу получить доступ к своему токену из вызова ajax? Как лучше всего использовать JWT для пользовательских функций (таких как сброс пароля, подтверждение по электронной почте и т. Д.), Кроме аутентификации?

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

1 ответ

Решение

Чтобы использовать JWT безопасно, вы должны использовать уровень защищенных сокетов для защиты его при передаче по сети (вы знаете, соединения https, а не обычный http). Вы также можете зашифровать содержимое JWT, но достаточно сохранить его в файле cookie, отправить его только по зашифрованным каналам, пометить только как http и пометить как защищенное. Я считаю, что это стандартная практика в отношении безопасности файлов cookie. Обратите внимание, что файлы cookie отправляются в заголовках вместе с каждым запросом. Это действительно технология на стороне сервера. Более того, cookie только для http не может быть прочитан в любом современном браузере скриптом, записанным только в некоторых браузерах.

Если ваши данные в основном нужны на стороне клиента, переключитесь на локальное хранилище для его преимуществ. Это не должно идти с каждым сетевым запросом. Вам не нужно беспокоиться об истечении срока действия данных. Вы должны явно удалить его. Хорошо или плохо? Решите для вашего собственного случая использования. Это соблюдает ту же политику происхождения. Поскольку вы помещаете токен в заголовок запроса, я не вижу требования, согласно которому вы должны хранить их в cookie-файле. Вы можете просто прочитать токен из локального хранилища и поместить его в токен-носитель при каждом сетевом запросе.

Куки хранят 4 КБ, локальное хранилище до 5 МБ на момент написания. Чтобы получить больше уверенности, прочитайте это:

Локальное хранилище против файлов cookie
Если вы можете декодировать JWT, как они защищены?
Сохранить Auth-токен в Cookie или заголовке?

Я добавлю jsfiddle в последующий комментарий, чтобы вы могли видеть код, который создает, читает, обновляет и удаляет файлы cookie. Это все, что вам нужно, чтобы иметь возможность прочитать его и использовать в заголовке аутентификации. Однако я не установил httponly и безопасный флаг. По иронии судьбы, скрипта не работает как фрагмент стека из-за ошибки безопасности.

Другие вопросы по тегам