Что можно использовать для обеспечения безопасности API
Что проверяют
Раскладываете ли вы безопасность по слоям: кто обратился, что ему можно, что пришло на вход, сколько можно и что уходит в ответ. И знаете ли, чем это делается в экосистеме Java, а не только по названиям стандартов.
Как отвечать
Пройтись по слоям:
- транспорт: только HTTPS, никаких токенов в строке запроса и в логах;
- аутентификация: OAuth 2 и OpenID Connect, сервис проверяет подпись токена по JWKS, а также поля
iss,aud,exp; между внутренними сервисами уместен взаимный TLS; - авторизация: проверка прав на каждом запросе на сервере,
@PreAuthorizeи проверка владения объектом, иначе подстановка чужого идентификатора отдаёт чужие данные; - вход: Bean Validation, строгая схема, параметризованные запросы вместо склейки SQL, запрет небезопасной десериализации;
- лимиты: ограничение частоты по клиенту, максимальный размер тела, таймауты на все внешние вызовы;
- ответ: никаких стектрейсов наружу, отдельные DTO вместо сущностей, чтобы случайно не отдать лишнее поле;
- эксплуатация: секреты в хранилище, а не в свойствах приложения в репозитории, аудит без персональных данных, регулярная проверка зависимостей на известные уязвимости.
Хороший финал: сослаться на OWASP API Security Top 10 как на чеклист, по которому это всё и проверяется.
Где спотыкаются
Сводят ответ к одному слову: поставим JWT. Токен отвечает на вопрос, кто пришёл, но не на вопрос, что ему можно, и без проверки прав на конкретный объект любой авторизованный пользователь читает чужие данные. Отдельно стоит помнить, что такой токен нельзя отозвать, отсюда короткий срок жизни и обновление.
Называют CORS защитой. Это правило для браузера, чужой клиент его просто не смотрит, а запрос из консоли уходит как ни в чём не бывало. Туда же уверенность, что закрытая документация делает эндпоинт невидимым.
Предлагают шифровать пароли, например AES. Пароли не шифруют, а хэшируют медленной функцией с солью, bcrypt или Argon2: расшифровываемый пароль означает утечку всей базы вместе с ключом. Рядом живёт самописная криптография вместо стандартных библиотек.