Я создаю сайт React Js с бэкэндом Node.js.Я пытался выяснить реализацию аутентификации пользователя, чтобы предотвратить CSRF-атаки, однако я действительно не понимаю, где хранить токены Anti-CSRF.
Мой мыслительный процесс безопасной реализации выглядит следующим образом ...
- Пользователь отправляет запрос на вход с учетными данными.
- Учетные данные аутентифицируются.
- Сервер создает сеанс.
- Сервер создает JWT для использования в качестве токена Anti-CSRF.
- Сервер сохраняет JWT (токен Anti-CSRF) в хранилище сеанса.
- Сервер отправляетответ клиенту.
- Ответ имеет заголовок для хранения идентификатора сеанса в файле cookie HttpOnly на стороне клиента.
- Полезная нагрузка ответа включает JWT (токен Anti-CSRF).
- Клиент получает ответ.
- Идентификатор сеанса cookie HttpOnly хранится на стороне клиента.
- Клиент сохраняет JWT (токен Anti-CSRF) в localStorage.
IЕсли пользователю необходимо запросить информацию, клиент может отправить JWT (токен Anti-CSRF) через заголовок или полезную нагрузку, и идентификатор сеанса будет отправлен автоматически, поскольку он является файлом cookie.Затем сервер может проверить, существует ли JWT (токен Anti-CSRF) в хранилище сеанса.
Я знаю, что JWT (токен Anti-CSRF) нужно будет обновить в какой-то момент.
Моя путаница связана с хранением JWT (токена Anti-CSRF) на стороне клиента.,Я продолжаю читать, что он должен храниться только на сервере.Но если он хранится только на сервере, то, похоже, он вообще ничего не делает.
Я подумал об использовании как файлов cookie, так и localStorage, потому что кажется, что для запроса к серверу нужны и файл cookie HttpOnly, иЧто-то из localStorage, чтобы отправить обратно «авторизованный» ответ, злоумышленнику потребуется как успешно запустить сеанс, так и успешно осуществить атаку XSS, чтобы получить токен Anti-CSRF.
Я только начал изучать CSRF и XSSнедавно, так что я могу быть совершенно неправ, и в моей реализации может быть огромный недостаток, который я пропускаю.Но мой главный вопрос ... не нужно ли токены Anti-CSRF хранить на клиенте И на сервере?