Введение
Аутентификация — это процесс, с помощью которого приложение убеждается, что вы — это вы. Это ваш цифровой паспорт, который говорит серверу: "Да, я действительно тот самый пользователь с ID 42, а не его злой двойник".
Разница между аутентификацией и авторизацией
Как программисты, мы любим придумывать разные слова для похожих вещей. Так появилась путаница между аутентификацией и авторизацией. Но разница проста:
- Аутентификация отвечает на вопрос: кто вы? Например, "Это Петя, потому что он ввёл пароль, который знает только он".
- Авторизация отвечает на вопрос: что вам разрешено делать? Например, "Поскольку это Петя, ему можно добавить новый пост, но нельзя удалять статьи других пользователей".
Почему аутентификация важна?
Представьте своё приложение без аутентификации. К примеру, это интернет-магазин. Вы заходите в профиль, добавляете товары в корзину, но... внезапно кто-то другой притворяется вами и покупает 10 холодильников на ваше имя. Забавно? Нет. Дорого? Очень. Именно поэтому аутентификация — это основа безопасности.
Что такое JSON Web Token (JWT)?
Теперь, когда мы понимаем, зачем нужна аутентификация, давайте разберёмся с инструментами. Встречайте JSON Web Token (JWT), главный герой сегодняшней лекции.
JWT похож на волшебный пропуск или билет. Это не просто набор данных, а закодированное (и подписанное) сообщение, которое говорит серверу: "Этот человек прошёл проверку, и вот доказательство".
Когда пользователь логинится в ваше приложение, сервер создаёт токен (JWT) и выдаёт его клиенту. Теперь клиент добавляет этот токен в заголовок каждого запроса, чтобы сервер мог понять: "О, это тот самый пользователь, я узнаю его по токену".
Структура JWT
JWT создан по стандарту (RFC 7519) и состоит из трёх частей:
- Заголовок (Header) — информация о типе токена (JWT) и алгоритме шифрования.
- Полезная нагрузка (Payload) — данные, которые мы хотим передать, например
idпользователя, его роль и срок действия токена. - Подпись (Signature) — самая важная часть. Это "магия", которая делает токен надёжным. Она создаётся с помощью секрета, известного только серверу.
Например, JWT выглядит так:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEyMzQ1Njc4OTAifQ.HKZJXHFCmj0jhq8R3D0uA-W-M7JmnYn0Ko1wAog3Aqw
Декодированный токен:
Header:
{
"alg": "HS256",
"typ": "JWT"
}
Payload:
{
"userId": 1234567890
}
Signature:
Секретная строка, создаётся на сервере.
Преимущества использования JWT
Почему мы выбираем JWT, а не что-то другое (например, сессии)? Всё просто:
- JWT работает без необходимости сохранять данные на сервере. Вся информация хранится в самом токене.
- JWT можно использовать и на вебе, и в мобильных приложениях. Универсальность — это удобно.
- JWT поддерживает полезную нагрузку. Вы сами решаете, что хранить в токене: от
idпользователя до его любимого цвета (но не надо).
Как работает JWT?
- Пользователь вводит свой логин и пароль.
- Сервер проверяет данные и, если всё ок, создаёт токен (супернадёжно подписанный секретным ключом).
- Токен возвращается клиенту.
- Теперь клиент отправляет этот токен в заголовке каждого запроса.
- Сервер принимает токен, проверяет его подлинность и (если всё норм) выполняет запрос.
Пример: регистрация и логин
Чтобы понять токены на практике, давайте представим маленькую схему:
Типичные ошибки при использовании JWT
Если делать всё быстро без теории, можно допустить следующие ошибки:
- Слишком большой срок действия токена. Представьте, если ваш JWT будет действовать год. Потеряли токен? Хакер его нашёл? Проблемы обеспечены.
- Хранение токена в
localStorageбез защиты. Если злоумышленник получит доступ к вашему браузеру, токен как на ладони. - Забудете про валидацию токена. Ваш сервер должен проверять токен при каждом запросе, чтобы избежать подделок.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ