Необходимо ли обновлять токен CSRF в токене JWT для каждого запроса / ответа?

Я занимаюсь разработкой веб-приложения с использованием Symfony и токена JWT для аутентификации. Для предотвращения XSS токен JWT хранится в файлах cookie с атрибутом HttpOnly. А для предотвращения CSRF я использовал случайный токен csrf. Этот токен хранится в cookie и токене JWT (в зашифрованном виде). Я хочу знать, нужно ли обновлять токен csrf в каждом ответе? Какова лучшая реализация?

Вот мои настройки в деталях:

  • У нас есть одностраничное приложение. Большинство запросов будет отправлено с использованием ajax.
  • Пользователь аутентифицируется с помощью POST.
  • При успешной аутентификации сервер сгенерирует случайный токен csrf, а затем сохранит его в файлах cookie (HttpOnly) и внутри полезной нагрузки JWT. Перед сохранением в полезной нагрузке JWT токен csrf будет зашифрован.
  • После того, как токен JWT закодирован, он будет сохранен в куки (HttpOnly)
  • Когда пользователь всегда запрашивает доступ к другой странице, сервер проверяет токен csrf в куки-файлах и JWT-токене при декодировании токена JWT.
  • LocalStorage не используется, потому что он доступен через JavaScript

1 ответ

Обычно нет необходимости обновлять токен CSRF при каждом запросе.

НО давайте посмотрим, что происходит в вашей настройке:

  • Вы сохраняете свой JWT, а также токен CSRF в cookie,
  • вы посещаете вредоносный веб-сайт, который вызывает вредоносный запрос с вредоносными данными на ваш сайт,
  • ваш браузер прикрепляет cookie к этому запросу с помощью JWT+CSRF,
  • ваша безопасность нарушена.

Таким образом, вы не должны помещать токен CSRF в cookie, потому что это бесполезно, продлеваете ли вы его или нет.

Если вы используете "одностраничное приложение", было бы лучше передать JWT в Authorization заголовок. Это делает CSRF-атаку невозможной (остерегайтесь других угроз).

Если вы используете "классическое веб-приложение", было бы лучше использовать "классические" токены CSRF и "классические" идентификаторы сеанса.

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