✅ Решения — Урок 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