JavaRush /Курсы /Модуль 4: FastAPI /Введение в JWT (JSON Web Tokens) и их преимущества

Введение в JWT (JSON Web Tokens) и их преимущества

Модуль 4: FastAPI
4 уровень , 2 лекция
Открыта

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


Структура JWT

JWT состоит из трёх частей, разделённых точками:

  1. Header (заголовок) — содержит метаинформацию о токене: тип токена (обычно JWT) и алгоритм подписи (например, HS256 для HMAC или RS256 для RSA).
  2. Payload (полезная нагрузка) — содержит данные (заявки или claims), такие как идентификатор пользователя, роль и время истечения токена.
  3. Signature (подпись) — гарантирует целостность токена. Она создаётся на основе заголовка и полезной нагрузки с использованием секретного ключа или пары ключей (в случае с RSA).

Когда вы соединяете три части вместе, вы получаете строку вида:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxLCJyb2xlIjoiYWRtaW4iLCJleHAiOjE2MzM4MTU4ODZ9.abc123signature

И да, выглядит как пароль Wi-Fi вашей бабушки. Но это ваш ключ к доступу в систему.


Преимущества JWT

Почему же JWT настолько популярен? На это есть несколько причин:

  1. Компактность: JWT — это просто строка, которая легко передаётся через URL, headers или даже body запроса.
  2. Самодостаточность: в отличие от традиционных сессий, JWT содержит в себе всю необходимую информацию, поэтому серверу не нужно хранить ничего о состоянии клиента.
  3. Кроссплатформенность: будучи основанным на JSON, JWT легко интегрируется с любыми технологиями — будь то Python, JavaScript или даже старый добрый PHP.
  4. Безопасность: используя подпись, JWT гарантирует, что его содержимое не было изменено после создания.

Как это работает?

Всё начинается с аутентификации пользователя. Вот примерный процесс выдачи JWT:

  1. Пользователь логинится.
  2. Сервер генерирует JWT, подписывает его и отправляет обратно.
  3. Клиент хранит токен, например, в cookies или localStorage.
  4. При каждом запросе клиент отправляет токен в заголовке Authorization (например, Bearer eyJhbGciOiJI...).
  5. Сервер проверяет подпись и извлекает данные из токена.

Алгоритмы подписи JWT

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

HMAC (например, HS256)

Этот алгоритм использует секретный ключ, который должен быть известен только серверу. Примерно как ваш любимый рецепт блинчиков, который вы никогда не расскажете соседу.

Signature = HMAC_SHA256(
    base64UrlEncode(header) + "." + base64UrlEncode(payload), 
    secret
)
  • Преимущества: простота и лёгкость настройки.
  • Недостатки: у вас может быть только один ключ, так что если его "слили", труба дело.

RSA (например, RS256)

В этом случае используется пара ключей: приватный для создания подписи и публичный для её проверки. Ваша подпись — это как автограф: только вы можете её поставить, но любой может проверить её подлинность (зная ваш стиль письма, конечно).

Signature = RSA_sign(
    base64UrlEncode(header) + "." + base64UrlEncode(payload), 
    private_key
)
  • Преимущества: высокий уровень безопасности.
  • Недостатки: настройка инфраструктуры ключей может быть сложной.

Пример использования JWT в FastAPI

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

Сначала установим библиотеку для работы с JWT:

pip install pyjwt

Теперь сгенерируем JWT.

Вот пример создания JWT в FastAPI:


import jwt
from datetime import datetime, timedelta

SECRET_KEY = "your_secret_key"  # Храните секретный ключ в переменных окружения!

def create_jwt(data: dict):
    expiration = datetime.utcnow() + timedelta(hours=1)
    payload = data.copy()
    payload.update({"exp": expiration})
    return jwt.encode(payload, SECRET_KEY, algorithm="HS256")

Теперь при логине вы можете возвращать пользователю его JWT:


@app.post("/login")
async def login(username: str, password: str):
    # Тут должна быть логика проверки логина и пароля
    user = {"id": 1, "username": username}
    token = create_jwt(user)
    return {"access_token": token}

Проверим JWT при запросе:


def decode_jwt(token: str):
    try:
        decoded = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
        return decoded
    except jwt.ExpiredSignatureError:
        raise HTTPException(status_code=401, detail="Token has expired")
    except jwt.InvalidTokenError:
        raise HTTPException(status_code=401, detail="Invalid token")

Используем это в эндпоинте:


@app.get("/protected")
async def protected_route(token: str = Header(...)):
    user_data = decode_jwt(token)
    return {"message": f"Welcome, {user_data['username']}!"}

Полезные нюансы и типичные ошибки

  1. JWT можно подделать? Нет, если ваш секретный ключ действительно секретный. Поэтому не храните его в коде.
  2. Токен истёк? Добавьте exp в payload. Это поможет избежать использования старых токенов.
  3. Где хранить токен? Лучше в httpOnly куках. LocalStorage менее безопасен, так как подвержен атакам XSS.
  4. JWT — не замена HTTPS. Чтобы предотвратить MITM-атаки, всегда используйте HTTPS.

Примеры реального применения JWT

  • Google, Facebook, GitHub. Практически все крупные сервисы используют JWT для обеспечения безопасности.
  • Микросервисная архитектура. JWT отлично подходит для передачи статуса авторизации между сервисами.
  • SPA (Single Page Applications). Это один из лучших способов аутентификации в современном фронтенде.

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

1
Задача
Модуль 4: FastAPI, 4 уровень, 2 лекция
Недоступна
Создание JWT токена
Создание JWT токена
1
Задача
Модуль 4: FastAPI, 4 уровень, 2 лекция
Недоступна
Проверка JWT токена
Проверка JWT токена
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ