Необходимо ли обновлять токен 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 и "классические" идентификаторы сеанса.