Урок по треку API и бэкенд для тестировщика 7 мин

Заголовки и cookies за 7 минут

Content-Type и Accept, кеширование, ETag, cookies и их флаги, CORS и служебные заголовки.

Заголовки это метаданные запроса и ответа. Много багов живёт именно в них: неверный формат, сломанный кеш, небезопасные cookie, CORS. Имена заголовков регистронезависимы: content-type и Content-Type одно и то же.

Формат тела

  • Content-Type описывает тело своего сообщения: в запросе то, что шлёт клиент, в ответе то, что отдаёт сервер. Пример: application/json; charset=utf-8.
  • Accept в запросе: какие форматы клиент готов принять.

Ошибки: сервер не принимает тип тела, ответ 415 Unsupported Media Type. Сервер не может отдать ни один из форматов из Accept, ответ 406 Not Acceptable. В Postman тип тела raw по умолчанию Text, и с ним уходит text/plain: отсюда внезапные 415.

Авторизация и контекст

  • Authorization: Bearer <токен> или Basic <base64>.
  • Cookie в запросе и Set-Cookie в ответе.
  • User-Agent кто клиент, Origin откуда пришёл кросс-доменный запрос.
  • X-Request-Id, traceparent: идентификатор запроса для поиска в логах. Прикладывайте его к каждому багу на 5xx.

Кеширование

HTTP/1.1 200 OK
Cache-Control: max-age=300
ETag: "v42"
  • Cache-Control: max-age=300 можно использовать копию 5 минут.
  • no-cache хранить можно, но перед использованием надо перепроверить у сервера. Название обманчиво.
  • no-store не хранить вообще. Нужен на ответах с персональными данными.
  • private только в браузере пользователя, не в общих прокси.

Условные запросы. Сервер отдаёт версию ресурса в ETag. Клиент в следующий раз шлёт If-None-Match: "v42", и если ничего не изменилось, получает 304 Not Modified без тела.

При записи то же самое защищает от потерянного обновления: PUT с If-Match: "7" применится, только если версия всё ещё 7, иначе 412 Precondition Failed. Отличный тест для конкурентного редактирования: два окна, одна карточка.

Cookies

Set-Cookie: sid=a1b2c3; Path=/; HttpOnly; Secure; SameSite=Lax; Max-Age=86400
  • HttpOnly cookie недоступна из JavaScript, XSS не украдёт её через document.cookie.
  • Secure только по HTTPS.
  • SameSite ограничивает отправку в кросс-сайтовых запросах: Strict никогда, Lax только при переходе по ссылке, None всегда (и только вместе с Secure). Chrome без атрибута считает cookie Lax.
  • Max-Age или Expires срок жизни. Без них cookie живёт до закрытия браузера.

Проверка для cookie сессии: все три флага безопасности на месте, после выхода cookie удаляется, а старое значение не работает на сервере.

CORS

Браузер не даёт скрипту с https://app.shop.ru читать ответы с https://api.shop.ru, если сервер не разрешил это заголовками:

Access-Control-Allow-Origin: https://app.shop.ru
Access-Control-Allow-Credentials: true

Для «непростых» запросов (PUT, DELETE, JSON-тело, свои заголовки) браузер сначала шлёт preflight OPTIONS. Важное для тестировщика:

  • CORS проверяет браузер. Postman и curl его не применяют, поэтому «в Postman работает» ничего не доказывает.
  • Со звёздочкой в Allow-Origin запросы с cookie запрещены.
  • Сервер, который отражает любой Origin вместе с Allow-Credentials: true, уязвим: чужой сайт прочитает данные пользователя.
  • Частый баг: на ответах с ошибкой нет CORS-заголовков, и фронтенд вместо текста ошибки видит «CORS error».

Служебные заголовки по кодам

Location у 201 и редиректов, Allow у 405, WWW-Authenticate у 401, Retry-After у 429 и 503.

Частые ошибки

  • Путать Content-Type и Accept.
  • Считать no-cache запретом кеширования.
  • Проверять CORS только из Postman.
  • Сравнивать имена заголовков с учётом регистра в автотестах.
  • Не замечать утечки версий в Server и X-Powered-By.

Что спросят на собесе

  • Какие заголовки вы проверяете в ответе?
  • Чем Content-Type отличается от Accept?
  • Какие флаги cookie вы знаете и зачем они?
  • Что такое ETag и как работает 304?
  • Что такое CORS и почему в Postman работает, а в браузере нет?

Закрепите за 5 минут

После урока в тренажёре 3-5 проверочных вопросов, дальше модуль уходит в повторения.