✅ Решения — Урок 44

← К оглавлению урока

⚡ Ответы: 1-б, 2-б, 3-а, 4-б, 5-б

Ответы на задания лекции

Старайтесь решить задания самостоятельно перед просмотром ответов. Решения содержат не только ответы, но и объяснение — почему другие варианты неверны.

Вопрос 1: Что делает set_cookie?

Правильный ответ: б) Сохраняет токены в куки.

Метод response.set_cookie(key, value, ...) устанавливает Set-Cookie заголовок в HTTP-ответе, который сообщает браузеру сохранить куку с указанными параметрами. При следующих запросах к тому же домену браузер автоматически отправит эту куку.

response.set_cookie(
    key='access_token',     # имя куки
    value=str(access_token),# значение
    httponly=True,          # защита от XSS
    samesite='Lax',         # защита от CSRF
    expires=access_expiry   # срок действия
)

Почему другие варианты неверны:

  • а) — удаляет куки метод delete_cookie(), а не set_cookie()
  • в) — set_cookie работает только с HTTP-ответом, к базе данных не обращается
  • г) — проверку срока действия выполняет SimpleJWT при декодировании токена

Вопрос 2: Автоматическое использование JWT из куки

Правильный ответ: б) Создание middleware для извлечения токенов из куки и добавления их в заголовок Authorization.

JWTAuthenticationMiddleware в методе process_request читает токен из request.COOKIES и устанавливает request.META['HTTP_AUTHORIZATION'] = f'Bearer {token}'. Таким образом, стандартный механизм JWTAuthentication DRF получает токен из заголовка без каких-либо изменений в представлениях.

Почему другие варианты неверны:

  • а) — ручной ввод токенов противоречит цели "автоматического" использования
  • в) — Basic Auth — это совершенно другой механизм аутентификации (username:password в Base64)
  • г) — localStorage доступен через JS и уязвим к XSS; httpOnly-куки безопаснее

Вопрос 3: Что происходит при истечении access-токена в middleware?

Правильный ответ: а) Токен доступа обновляется с использованием токена обновления, если он доступен и действителен.

В методе process_request middleware ловит TokenError при проверке истекшего access-токена и вызывает self.refresh_access_token(refresh_token). Если refresh-токен ещё действителен — создаётся новый access-токен и ставится в HTTP_AUTHORIZATION. Кука с новым access-токеном обновляется в process_response.

Почему другие варианты неверны:

  • б) — middleware не выполняет редиректы; он только управляет заголовками
  • в) — токен не удаляется автоматически; он либо обновляется через refresh, либо clear_cookies() убирает его из request.COOKIES
  • г) — без valid токена в HTTP_AUTHORIZATION запрос дойдёт до DRF как анонимный; IsAuthenticated вернёт 403

Вопрос 4: Преимущество RefreshToken

Правильный ответ: б) Позволяет обновлять токен доступа без повторной аутентификации пользователя.

Access-токен живёт 5 минут — короткий срок снижает риски при компрометации. Но заставлять пользователя вводить логин/пароль каждые 5 минут неудобно. Refresh-токен (живёт 1 день) позволяет автоматически получить новый access-токен без повторного ввода учётных данных.

# Получение нового access через refresh
refresh = RefreshToken(refresh_token_string)
new_access = str(refresh.access_token)  # Новый access-токен

Почему другие варианты неверны:

  • а) — refresh не заменяет access; оба нужны для разных целей
  • в) — JWT — stateless, сессии на сервере не хранятся; вся информация в самом токене
  • г) — refresh-токен не обновляет данные пользователя; данные payload фиксируются при создании

Вопрос 5: Что делает delete_cookie?

Правильный ответ: б) Удаляет токены из куки.

Метод response.delete_cookie('access_token') устанавливает Set-Cookie заголовок с пустым значением и Max-Age=0/expires в прошлом. Браузер при получении такого заголовка удаляет соответствующую куку из своего хранилища.

response.delete_cookie('access_token')
response.delete_cookie('refresh_token')
# После этого браузер больше не отправляет эти куки

Почему другие варианты неверны:

  • а) — срок действия можно изменить только через set_cookie с новым expires
  • в) — delete_cookie только удаляет куки; никакого обновления токенов не происходит
  • г) — проверку валидности выполняет AccessToken(str) из SimpleJWT