Как защитить API с JWT: пошаговое руководство

Как защитить API с JWT: пошаговое руководство

Если ваш API доступен извне, его нужно защищать. Рассказываем, как использовать JWT: от выдачи токена до его отзыва.

Введение

Если API открыт для внешнего мира, его обязательно нужно защищать — иначе любой желающий сможет забраться в ваши эндпоинты и сделать с данными что угодно. Один из самых простых и при этом рабочих способов — аутентификация через JWT. Токен хранит в себе нужную информацию, легко проверяется и не требует постоянных запросов к базе, что особенно удобно при работе с VPS, где важна производительность и независимость от сессионного хранилища.

В статье рассказали, как устроена авторизация с JWT, объяснили, как раздавать токены, ограничивать доступ к API, где хранить ключи и что делать, когда токен истекает.

Аренда VPS/VDS от 219 руб/месяц

Преимущества VPS в AdminVPS:

✓ Бесплатное администрирование

✓ Только быстрые NVMe-диски

✓ Защита от DDoS-атак

✓ Быстрая техподдержка

Аренда VPS/VDS виртуального сервера от AdminVPS — это прозрачная и честная услуга с доступной ценой

Основы JWT и принцип работы аутентификации

JWT (JSON Web Token) — это компактный способ передавать информацию о пользователе между клиентом и сервером. Внутри токена три части: заголовок, полезная нагрузка и подпись. Заголовок указывает тип токена и алгоритм шифрования, например, HS256. В нагрузке всё, что нужно: ID пользователя, роли, права. Подпись подтверждает, что токен не подделан. Она создаётся на основе первых двух частей и секретного ключа, который знает только сервер.

Когда пользователь входит в систему, сервер проверяет данные и выдаёт токен с нужной информацией и сроком действия. Клиент сохраняет его, например, в cookie или памяти приложения. При каждом запросе к API токен отправляется в заголовке Authorization, а сервер проверяет подпись и срок, чтобы убедиться, что перед ним тот самый пользователь.

В отличие от сессий, JWT не требует ничего хранить на сервере, всё уже внутри токена. Это упрощает масштабирование и ускоряет работу. Но есть нюанс: если токен украдут, отозвать его не получится. Поэтому задайте короткий срок действия, например, 15 минут, и сразу настройте механизм обновления.

JWT совместим не только с браузерами, но и с мобильными приложениями, микросервисами и другими клиентами, где удобно передавать токен через заголовки.

ЭтапЧто происходитПримечания
1. АутентификацияПользователь вводит логин и парольСервер проверяет и создаёт JWT
2. Формирование токенаJWT = Заголовок + Нагрузка + ПодписьНапример, HS256, {"user_id": 42}, HMAC
3. Отправка токенаСервер отправляет токен клиентуХранится в localStorage, sessionStorage или cookie
4. Использование токенаПри каждом запросе токен отправляется в заголовкеAuthorization: Bearer <токен>
5. Проверка на сервереСервер проверяет подпись и срок действияНет обращения к базе — всё в токене
6. Обновление токенаКлиент получает новый токен по refresh-механизмуОбязательно для безопасности
7. Истечение срокаТокен становится недействительнымПользователь проходит аутентификацию заново
Таблица. Как работает JWT на практике

Создание сервера аутентификации и выдача токенов

Для начала создайте сервер, который выдаёт JWT. Проще всего начать с Python и Flask, но принцип тот же и для Node.js или других языков.

Сначала примите логин и пароль из тела POST-запроса. Сравните их с данными из базы или конфигурационного файла. Пароли обязательно храните в хеше, например, с bcrypt или Argon2.

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

Для создания токена в Python удобно использовать библиотеку PyJWT. Пример:

import jwt
import datetime

def create_token(user_id, secret_key):
    payload = {
        'user_id': user_id,
        'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1)
    }
    token = jwt.encode(payload, secret_key, algorithm='HS256')
    return token

Готовый токен отправьте клиенту в JSON. Приложение должно сохранить его и передавать в заголовке Authorization при каждом запросе. Если логин или пароль неверны, верните код 401 и понятное сообщение об ошибке. Это поможет клиенту среагировать правильно.

Такой сервер — это только начало. Позже добавьте регистрацию, обновление токенов и сброс пароля. Но в основе всегда остаётся логика: проверить логин, выдать токен, отправить его клиенту.

Настройка защиты API с проверкой JWT

Проверка JWT-токена — важная часть защиты API, которая позволяет убедиться, что доступ получают только те, кто действительно авторизован. Для этого нужно добавить на сервер специальный слой, который будет проверять каждый запрос, извлекать токен и смотреть, всё ли с ним в порядке.

Токен обычно отправляют в заголовке Authorization в формате «Bearer токен». Когда сервер получает запрос, этот слой смотрит на заголовок, и если токена нет или он оформлен неправильно, сервер сразу отвечает ошибкой 401 с сообщением о запрете доступа. Если токен есть, его распаковывают, проверяют подпись и срок действия, используя секретный ключ, который должен совпадать с тем, что применялся при создании токена.

Если проверка не прошла, сервер сообщает об ошибке и не пускает дальше. Если проверка успешна, информация из токена, например ID пользователя или его роль, передаётся в обработчик запроса. Так программа понимает, кто именно обращается и какие у него права.

Во многих популярных фреймворках есть готовые инструменты, которые помогают проводить эту проверку. Они берут на себя задачи по извлечению токена, проверке подписи и формированию ошибок. Например, для Python с Flask существует расширение Flask-JWT-Extended, а в Node.js часто используют passport-jwt.

Очень важно продумать, что делать, когда срок действия токена заканчивается. Клиент должен получить понятное сообщение и возможность получить новый токен через механизм обновления. Если пользователь вышел из системы или его аккаунт заблокировали, нужно уметь отзывать токены. Для этого обычно хранят список недействительных токенов.

Как правильно хранить, обновлять и отзывать JWT-токены

Работа с JWT-токенами требует внимания к тому, как их хранить, когда обновлять и как отзывать в случае необходимости.

На клиенте токен должен лежать в защищённом месте. Для веб-приложений подойдут secure cookie с флагами HttpOnly и Secure. Они не доступны из JavaScript и передаются только по HTTPS. В мобильных или десктопных приложениях используйте встроенное хранилище, предназначенное для секретных данных. Не кладите токены в localStorage, особенно если страница работает со сторонними скриптами.

Жизнь токена ограничьте по времени, например, от 15 минут до пары часов. Это снижает риски в случае утечки токена. Чтобы не просить пользователя логиниться заново, добавьте refresh token — отдельный токен с большим сроком действия. По нему можно выдать новый JWT без повторной авторизации. Refresh token хранится отдельно и в более защищённом месте.

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

Рекомендации по безопасной работе с JWT

  1. Минимизируйте срок действия access-токена. Не задавайте срок дольше, чем нужно. Чем короче живёт токен, тем меньше времени у злоумышленника в случае утечки.
  2. Используйте refresh-токены с ограниченным сроком и одноразовой активацией. После каждого использования обновляйте refresh-токен и сразу инвалидируйте старый.
  3. Храните access- и refresh-токены в разных местах. Например: access — в HttpOnly cookie, refresh — в зашифрованном cookie с отдельным флагом или в нативном хранилище приложения.
  4. Реализуйте принудительный выход пользователя. При logout записывайте время выхода или метку сессии. При проверке токена сравнивайте его iat (время выпуска) с этим временем.
  5. Не доверяйте клиенту.
    Всегда проверяйте подпись, срок действия, структуру и полезную нагрузку токена на сервере.
  6. Ограничьте количество refresh-операций. Установите TTL на каждый refresh и лимит на частоту обновлений — это защитит от атак повторного использования.
  7. Включите двухфакторную аутентификацию. Особенно для действий с высокой степенью риска — даже при компрометации токена это даст дополнительную защиту.

Рекомендации по тестированию и поддержке безопасности API

Чтобы убедиться, что защита API с помощью JWT-токенов работает как надо, нужно регулярно проверять её и отслеживать возможные уязвимости. Начните с тестирования сценариев аутентификации: попробуйте отправить запрос без токена, с просроченным или поддельным токеном. Сервер должен отказать в доступе и выдать конкретные ошибки. Убедитесь, что при обновлении токена клиент получает новый валидный токен и старый больше не работает, если реализован отзыв.

Следите за логами сервера, они помогут увидеть подозрительную активность, например, повторные попытки доступа с некорректными токенами или необычные запросы. Также полезно включить мониторинг времени отклика API, чтобы вовремя заметить сбои, которые могут говорить о попытках взлома или ошибках в коде.

Никогда не используйте в коде простые секретные ключи, особенно те, которые легко угадать или взять из открытых репозиториев. Секретный ключ должен быть длинным, в идеале случайно сгенерированным. Его лучше хранить в защищённых настройках сервера, а не в исходниках. Также регулярно меняйте ключ и обновляйте токены пользователей, чтобы снизить риски компрометации.

Обязательно проверяйте, что HTTPS включён и все данные передаются по защищённому каналу. Даже самый надёжный JWT потеряет смысл, если токены перехватят злоумышленники через незащищённые соединения.

Поддержка безопасности — это постоянный процесс. Следите за обновлениями используемых библиотек и фреймворков, вовремя устраняйте уязвимости, следите за новыми методами атак на JWT и адаптируйте систему под современные требования.

Заключение

JWT сам по себе не сделает систему безопасной, но в надёжных руках поможет выстроить простой и понятный процесс: пользователь подтверждает свою личность, получает токен и работает с API, не нагружая сервер лишними проверками.

Важно не просто выдать токен, а научиться обращаться с ним бережно. Следите за сроками, продумывайте обновление и не оставляйте дверь открытой, если пользователь уже ушёл. Чем яснее логика аутентификации, тем меньше шансов на случайные уязвимости.

Настройте JWT один раз честно и продуманно, и он будет работать как часы, не напоминая о себе и не мешая тому, ради чего всё создавалось.

Читайте в блоге:

Loading spinner
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

VPN на VPS-сервере

Узнайте, как создать собственный VPN на VPS-сервере для защиты ваших конфиденциальных данных!

Что будем искать? Например,VPS-сервер

Мы в социальных сетях