Как определить клиентское приложение, которое выполняет запрос - PullRequest
4 голосов
/ 15 апреля 2020

Я пишу Java (Spring-Boot) сервис, который могут использовать несколько клиентских приложений. Для обслуживания / статистики я хотел бы регистрировать, какие приложения получают доступ к сервису. Как идентифицировать клиентское приложение, не доверяя клиенту?

Дополнительная информация

  • Несколько таких клиентских приложений находятся в docker контейнерах за обратным прокси-сервером ( traefik ).
  • Несколько таких клиентских приложений написаны / поддерживаются одними и теми же лицами. Это актуально, поскольку код запроса, используемый клиентским приложением, можно повторно использовать для другого приложения без изменения идентификатора клиента.
  • Я только хочу мешать людям копировать код запроса, потому что это быстрее. Это решение не может быть безопасным в моих глазах и не должно быть. Было бы достаточно признать, что два приложения используют один и тот же идентификатор.

Подход

Идея может состоять в том, чтобы использовать аутентификацию с помощью ключа publi c и связать закрытый ключ с чем-то вроде комбинации протокола / IP / порта. Первая часть (publi c key auth.) Поможет клиентам, которые заинтересованы в хорошем обслуживании / статистике. Вторая часть (связывание) - это тупик в моих глазах, потому что я не знаю, что я мог бы использовать для связывания:

  • Протокол: почти всегда один и тот же.
  • IP : Часто то же самое из-за нескольких docker хостов.
  • Порт: Я сейчас не уверен, думаю, случайный для запроса клиента.
  • Ma c: Сегмент сети непредсказуем .

Есть идеи?

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

Вы также можете добавить авторизацию через токен в заголовках http. И переписать весь клиентский код, чтобы получить токены из среды при развертывании (не жестко кодировать токены в коде в хранилище).

Таким образом, даже если новый клиент появляется путем копирования-вставки кода, он должен получить токен от вас. Кроме того, вы можете управлять доступом к различным приложениям, а также в случае аномальной загрузки одного из приложений вы можете «заблокировать» это приложение (или снизить его, уменьшив скорость отклика для данного конкретного токена) /

0 голосов
/ 24 апреля 2020

Ну, у меня есть сомнения, но мне кажется, что это цель заголовок запроса User-Agent .

Если запросы выполняются из браузера (Firefox, Chrome, et c.), Вы должны получить подробную информацию (при условии, что прокси-сервер не удалит ее в пути).

Однако для других программ это, вероятно, будет не столь полезным. Например, при использовании стандартных API-интерфейсов Java HTTP будет установлено значение «Java / Xx». Для его настройки требуется аргумент командной строки при запуске (или вызов System.property("http-agent", ...), и я понятия не имею, сколько людей беспокоится о его настройке.

Для справки, я связываю следующая статья . Это учебное пособие по обнаружению новых устройств клиентов из контекста Spring Security, основанное частично на User-Agent .

Также в Spring Загрузочная справочная документация , есть упоминание о следующем свойстве приложения:

server.compression.excluded-user-agents= # list of user-agents to exclude from compression

Похоже, что разработчики Spring считают User-Agent жизнеспособным вариантом для определения некоторых особенностей клиента.

...