Всем привет, это Роза, Flutter Dev Friflex💫
Представьте: у вас есть данные, которые нужно защитить и передать через API. Как это сделать безопасно?
Здесь можно использовать JWT (JSON Web Token).
Веб-токены JSON (JWT) — это компактный и безопасный способ передачи информации между сторонами в виде JSON-объекта. JWT подписывается секретным ключом или парой ключей (RSA/ECDSA), что позволяет убедиться в целостности данных.
Почему JWT лучше логина/пароля?
✔️ Ограниченный срок жизни: пароль может «утечь» и жить вечно, а токен живет, например, всего 15 минут. Даже если его украдут, через короткое время он станет бесполезным.
✔️ Нет нагрузки на БД: проверка пароля требует похода в базу. JWT-сервер проверяет «на месте», без лишних запросов.
❕ Если вы используете «черный список» для отзыва токенов, то придётся обращаться к базе или Redis для проверки, не был ли токен отозван.
Виды JWT
▪️Access token — токен для доступа к API, живет недолго (~15 мин). При истечении срока сервер возвращает 401. По умолчанию — многоразовый
▪️ Refresh token — токен для обновления пары токенов, живет дольше (несколько дней). Используется на эндпоинте ~/auth/refresh, когда истекает срок access токена
Структура JWT
Токен состоит из 3 частей, разделенных точкой: xxxxx.yyyyy.zzzzz.
1. Header — заголовок, который хранит тип токена (JWT) и алгоритм подписи (например, HMAC SHA256)
2. Payload — данные о пользователе и токене. Стандартные поля:
▫️ iss — кто выдал токен (issuer)
▫️ sub — идентификатор пользователя (subject)
▫️ aud — для кого предназначен токен (audience)
▫️ exp — время, в течение которого токен считается валидным (expiration)
▫️ iat — время создания токена (issued at)
▫️ jti — уникальный идентификатор токена (JWT ID)
3. Signature — подпись, гарантия целостности
⚠️ Важно: данные в payload видны всем. JWT подписывается, а не шифруется
Как JWT защищает наши данные?
JWT нельзя подделать без секретного ключа, но содержимое токена можно прочитать. Поэтому не стоит хранить там пароли или чувствительные данные.
Black-list токенов
При выходе из аккаунта или смене пароля токены нужно отзывать. Для этого используют «черный список».
При проверке сервер сначала смотрит, не попал ли токен туда, и только потом валидирует его. Если токен найден в «черном списке» → возвращается 401.
Аутентификация с JWT
Когда говорят об аутентификации с помощью JWT, то имеют в виду, как приложения подтверждают личность пользователя. Устроено это примерно таким образом:
✔️ Пользователь вводит логин и пароль
✔️ Сервер проверяет данные и, если они верны, генерирует access и refresh токены
✔️ Клиент сохраняет токены (например, в Secure Storage)
✔️ При каждом запросе к защищенному API клиент отправляет access token в заголовке Authorization: Bearer <token>
✔️ Сервер проверяет подпись и срок действия токена
✔️ Если access token истек, клиент использует refresh token для получения новой пары токенов
Таким образом, серверу не нужно хранить сессии и пользователь остается аутентифицированным, пока токены действуют.
❤️ — и в следующем посте разберем, как реализовать авторизацию во Flutter с помощью JWT
Post #208
712
- ❤ 12
- 👍 4
- 🔥 3
- 😁 1