Как вы делаете jwt аутентификацию в server-side react приложении?

Куда вы помещаете токен, отправляемый сервисом авторизации(например aws cognito) в localStorage, в cookie?
Какие шаги предпринимаете, чтобы защититься от Cross-Site Request Forgery, Man-in-the-Middle, Cross-Site Scripting атак.
Насколько мне известно подобная система аутентификации менее подвержена XSRF атакам, поскольку браузер при запросах не устанавливает Authorization token в заголовке запроса автоматически.
Однако эта система более подвержена MITM и XSS атакам чем session-based auth система.

В общем вот я залогинился и получил токен от aws cognito.

Учитывая, что приложение делает первичный рендеринг на сервере (server-side rendering), какие шаги применить дальше(типа best practices)?
Не могу найти в инете состоявшегося паттерна для кейса server-side react app + token - based authentication?
Если вы уже делали нечто подобное поделитесь опытом, дайте ссылку на репозиторий, на какой-нибудь туториал. Или хотя бы пошагово объясните как сделать, какие детали учесть? Вообщем хоть чем-нибудь подсобите.
  • Вопрос задан
  • 4305 просмотров
Решения вопроса 1
@Ilkon
Поделюсь своим решением. Хотя у меня на сервере стоят рельсы, а реакт только на морде. Но тем не менее, вдруг будет полезно.

При авторизации сервер генерит:
- access token
- cookie
- refresh token
которые затем гоняются между клиентом и сервером.

Refresh token может отсутствовать. Вообще говоря он нужен только для обновления access token, и клиент добавляет его в запрос только когда истекает срок действия access token. В этом случае сервер генерит новый access и refresh token.

Cookie отдается с пометкой HTTP only, то есть клиент их прочитать никак не может. Cookie нужны только для проверки валидности access token, то есть никаких сессий по ним нет (вообще приложение полностью stateless).

Оба токена (access и refresh) клиент хранит в local storage, откуда извлекает их для каждого запроса на сервер.

Любой запрос от клиента, содержащий валидный access token, считается авторизованным, только если в нем есть соответствующие токену куки (не совпадающие, а соответствующие, то есть закодированные по какому-то алгоритму с access token в качестве базы). Ну и если есть refresh token, то также смотрим, подходит ли он к нашему access token.

Такая схема, в совокупности с HTTPS, неплохо защищает от XSS или от CSRF уязвимостей (оговорка: но не от обеих сразу).

Немного теории, почему это работает, можно прочитать здесь: www.redotheweb.com/2015/11/09/api-security.html
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@LiguidCool
От MitM вас защитят только SSL сертификаты и иконки на сервере.
Где хранить? Ну вообще это не так важно, но я бы хранил в LocalStorage. Хз почему, просто левая пятка говорит.
Хотя если у вас не совсем REST, то можно хранить токен в кукисах и отправлять "по классике" (в заголовках).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы