#4 – Безопасность API: токены, JWT, auth, rate limits
Видеоурок
API и его особенности
Итак, напомним кратко, что такое API. API — это интерфейс, через который клиент (браузер, приложение, другой сервер) общается с серверной частью. У API нет формы — он работает через запросы: POST, GET, PUT, DELETE и другие.
Почему важно его защищать? Сегодня практически каждый сайт, мобильное приложение или сервис работает через API. А это значит, что если ваше API не защищено должным образом, злоумышленник может:
- обойти авторизацию,
- подобрать логины и пароли,
- получить доступ к чужим данным,
- или просто заспамить сервер миллионом запросов.
Классические ошибки в API
Теперь давайте поговорим об ошибках. Они простые, но из-за них страдают даже крупные компании.
1. Отсутствие проверки прав доступа.
Представим, что пользователь отправляет GET-запрос к ресурсу:
GET /api/users/5Если нет проверок, он может получить данные чужого аккаунта. По аналогии можно получить и другие ресурсы.
2. Отсутствие ограничения на количество запросов.
Если не ограничить частоту обращений, злоумышленник может отправлять 1000 запросов в секунду и устроить brute-force или DDoS. Это может не украсть данные, но выведет сайт из строя.
3. Отсутствие токенов или слабая авторизация.
Если API открыт для всех или авторизация базируется на простой cookie без защиты, то злоумышленнику легко получить доступ и украсть данные.
4. Уязвимость к enumeration-атакам.
Если API выглядит так: /api/users/1, /2, /3, злоумышленник просто перебирает ID и собирает данные.
Что такое JWT и зачем он нужен?
JWT (JSON Web Token) — это стандарт авторизационных токенов. При входе сервер генерирует токен из трёх частей: заголовка, полезной нагрузки и подписи:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MX0.signature123Клиент передаёт токен в заголовке запроса:
Authorization: Bearer <токен>Как JWT может быть уязвим?
Представьте, что кто-то перехватил токен, расшифровал payload (вторую часть токена), поменял роль с "user" на "admin" и пересобрал токен.
Если сервер не проверяет подпись или использует слабый ключ — он примет подделанный токен.
Поэтому нельзя:
- использовать слабые секреты,
- принимать токены без проверки подписи,
- доверять полезной нагрузке без валидации.
Что такое brute-force и enumeration?
Brute-force — это атака перебором паролей. Злоумышленник отправляет 1000 запросов в минуту на:
POST /api/loginЕсли нет ограничений по частоте — он подбирает пароль и входит.
Enumeration — это перебор ID:
GET /api/users/1
GET /api/users/2
GET /api/users/3Если авторизация не проверяется — злоумышленник получает данные всех пользователей.
Rate Limiting — первая линия обороны
На помощь приходит Rate Limiting — ограничение количества запросов с одного IP за заданный промежуток времени.
Примеры:
- не более 10 запросов в минуту на
/api/login - не более 100 запросов в час с одного IP
При превышении лимита сервер возвращает: 429 Too Many Requests.
Реализовать можно через:
- Nginx
- Cloudflare
- Express middleware
- и другие инструменты
Это избавит от возможности автоматического перебора и повысит стабильность API.
Пример: атака на API
Рассмотрим пример на PHP (Laravel). Допустим, у нас есть маршрут:
Route::get('/api/user/{id}', function($id) {
return User::find($id);
});Злоумышленник отправляет:
GET /api/user/1
GET /api/user/2
GET /api/user/3Если не проверять, что $id == auth()->id(), то он видит чужие данные. Исправленный код:
Route::middleware('auth:sanctum')->get('/api/user/{id}', function($id) {
if ($id != auth()->id()) {
abort(403);
}
return User::find($id);
});Конкретные реализации могут отличаться в зависимости от проекта и фреймворка. Главное — всегда проверяйте права доступа, а не просто отдавайте данные по ID.
Задание к уроку
Необходимо оформить подписку на проект, чтобы получить доступ ко всем домашним заданиям
Большое задание по курсу
Вам необходимо оформить подписку на сайте, чтобы иметь доступ ко всем большим заданиям. В задание входит методика решения, а также готовый проект с ответом к заданию.
PS: подобные задания доступны при подписке от 1 месяца
Также стоит посмотреть