Как лучше всего хранить токены в React Native для обеспечения безопасности и эффективной работы с аутентификацией?

Каковы безопасные способы хранения refresh_token и access_token на мобильных устройствах, если бэкенд возвращает их в виде httpOnly cookies, а React Native имеет проблемы с их хранением? Могу ли я сохранить эти токены в Async Storage или есть более безопасные альтернативы?
  • 7 февраля 2024 г. 21:18
Ответы на вопрос 2
Для хранения токенов в React Native следует выбирать способы, которые обеспечивают их защиту от возможных угроз. Async Storage в React Native не является безопасным местом для хранения чувствительных данных, таких как токены аутентификации, поскольку данные в Async Storage хранятся в незашифрованном виде и могут быть доступны при рутинге устройства или других видах атак.

Вот несколько рекомендаций по безопасному хранению токенов в React Native:

1. Secure Storage:
   - Используйте нативные механизмы, такие как Keychain для iOS и Keystore для Android, где данные хранятся в зашифрованном виде.
   - Для доступа к этим механизмам можно использовать сторонние библиотеки такие как `react-native-keychain` или `react-native-sensitive-info`, которые обеспечивают интерфейс для безопасного хранения данных на обеих платформах.

2. HTTP-Only Cookies:
   - Если бэкенд использует httpOnly cookies, это означает, что фронтенд (в нашем случае React Native приложение) не сможет напрямую доступ к этим куки. Cookies будут автоматически отправляться с каждым HTTP-запросом к серверу и являются одним из способов удерживать сессию без явного хранения токенов на клиенте.
   - Тем не менее, хранение в cookies не полностью застраховано от атак, таких как CSRF (Cross-Site Request Forgery). Для предотвращения такого вида атак обычно используют токены защиты CSRF.

3. WebView для Cookies:
   - Если бэкенд исключительно использует куки, можно работать с ними через WebView, что позволит просматривать и управлять куками, устанавливаемыми сервером.
   - Тем не менее, этот подход может быть менее комфортным для разработки, так как придется иметь дело не только с нативным кодом, но и с WebView как компонентом приложения.

4. Использование Refresh Tokens:
   - Храните refresh_token в защищенном хранилище (например, Keychain или Keystore), чтобы использовать его для обновления access_token, который может храниться в памяти приложения и периодически обновляться.

5. Обработка просроченных токенов:
   - Реализуйте логику обновления access_token при помощи refresh_token, как только access_token истек. Это позволяет минимизировать время жизни access_token и уменьшить риск его компрометации.

Помните, что безопасность - это не только вопрос хранения токенов, но и общая архитектура вашей системы аутентификации, включая безопасную передачу данных, обращение к API, обработку ошибок и регулярное обновление токенов. Всегда важно следить за последними лучшими практиками безопасности и регулярно просматривать и обновлять свои системы в ответ на новые угрозы.
https://www.npmjs.com/package/expo-secure-store - если юзаете expo 
https://www.npmjs.com/package/react-native-keychai... - если чистый react-native
Похожие вопросы