Клиент Redis ios с безопасным использованием веб-сокета

В настоящее время я связываюсь с моим экземпляром Redis из моего клиента iOS с помощью веб-сокета. Я указываю адрес хоста и порт прослушивания и выполняю некоторые команды Redis напрямую из моего клиента IOS.

Причина, по которой я делаю это, потому что я выполняю реальное отслеживание геолокации в реальном времени и выполняю эти команды из моего бэкэнда, который находится на php, приведет к задержке.

Я боюсь, что это не самый безопасный способ, потому что, если кто-то знает мой адрес хоста и порты, он сможет получить доступ к моему экземпляру Redis.

У меня вопрос, как я могу общаться с моим экземпляром Redis из моего клиента iOs с помощью веб-сокета, но более безопасным способом.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
521
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Есть несколько способов сделать это, в зависимости от того, как настроен ваш проект. Вы можете добавить балансировщик нагрузки NGINX перед своими контейнерами php / redis, который принимает веб-токены JSON для аутентификации. https://www.nginx.com/blog/authentication-content-based-routing-jwts-nginx-plus/

Redis также может выполнять аутентификацию, но, похоже, это не лучшая практика, но вы также можете найти дополнительную информацию об этом здесь: https://redis.io/commands/auth

У меня есть сервер NGINX. Проблема, которую я хочу напрямую общаться с REDIS без участия php из-за задержки. Если я использую балансировщик нагрузки NGINX, мне нужно отправить HTTP-запрос в NGINX, верно?

Ahmed 07.07.2018 05:47

Похоже, вы могли бы взаимодействовать с redis с помощью команд HTTP-запроса, дайте мне знать, что вы думаете об этом: nginx.com/resources/wiki/modules/redis

ThatCampbellKid 07.07.2018 06:04

@ThatCampbellKid - добавление HTTP-запросов увеличит задержку, а не минимизирует ее из-за накладных расходов (например, заголовков и т. д.).

Myst 07.07.2018 07:12
Ответ принят как подходящий

@ Ахмед,

Я прочитал ответ @ThatCampbellKid и комментарии и понимаю ваше желание, чтобы клиент iOS напрямую взаимодействовал с сервером Redis.

Однако Redis НЕ был разработан для этого подхода. Как указано в документации (курсив добавлен):

Redis is designed to be accessed by trusted clientsinsidetrusted environments.

Интернет - это нет, доверенная среда, и прямой доступ позволяет получить доступ к Redis для недоверенных клиентов.

В той же документации приводится следующий пример (выделено мной):

In the common case of a single computer directly exposed to the internet, such as a virtualized Linux instance (Linode, EC2, ...), the Redis port should be firewalled to prevent access from the outside. Clients will still be able to access Redis using the loopback interface.

Правильный подход - использовать динамическое приложение для аутентификации клиентов и моста между клиентами и сервером Redis.

Вы можете использовать JWT (модуль nginx, предложенный @ThatCampbellKid), PHP, Ruby, node.js, Java, C или что угодно, но вам нужно будет что-то использовать.

Мне жаль это говорить, но любой другой ярлык подвергнет вашу систему угрозе безопасности.


РЕДАКТИРОВАТЬ:

Да, вы все еще можете использовать WebSocket.

Разница в том, что эта архитектура небезопасна:

Client <=(WebSockets)=> Redis

И эта архитектура безопасна (при правильной реализации):

Client <=(WebSockets)=> Authentication Layer <=(TCP)=> Redis

так что это означает, что я не могу использовать веб-сокеты для прямого подключения к Redis. Я должен использовать http, и это увеличит задержку. Если это единственный вариант, как можно уменьшить задержку?

Ahmed 07.07.2018 07:22

Вы можете использовать WebSockets. Нет необходимости добавлять в смесь задержку HTTP. Вам просто нужно подключить WebSockets через уровень аутентификации.

Myst 07.07.2018 07:29

@ Ахмед, пожалуйста. Я обновил ответ, чтобы пояснить, что я имел в виду. Я желаю вам успеха.

Myst 07.07.2018 07:34

просто чтобы убедиться. Под уровнем аутентификации вы подразумеваете сертификат SSL или другую форму аутентификации.

Ahmed 14.07.2018 07:17

@Ahmed, под уровнем аутентификации я имею в виду уровень, который проверяет учетные данные клиента. Учетные данные клиента могут быть основаны на TLS / SSL (с клиентом, представляющим определенный доверенный сертификат), на основе пароля / токена или чего-то еще. Важной частью является то, что только доверенным клиентам будет разрешено подключаться к серверу Redis.

Myst 14.07.2018 08:57

Как вы сказали, вы уже используете Nginx, посмотрите Модуль веб-сокетов nchan

Затем ваша установка Nginx может обслуживать соединения через веб-сокеты напрямую, и она поддерживает несколько методов аутентификации клиента, а также прямую интеграцию с Redis.

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