Что такое безопасный (safe) HTTP-метод?

Ответ

Безопасный (Safe) HTTP-метод — это метод, который по спецификации определен как не изменяющий состояние сервера. Его назначение — только для чтения или получения данных. Безопасность метода гарантирует, что повторные запросы не приведут к побочным эффектам на сервере.

Ключевые характеристики:

  • Только для чтения: Не создает, не изменяет и не удаляет ресурсы.
  • Идемпотентность не требуется: Безопасный метод может быть неидемпотентным (например, GET с уникальным идентификатором запроса в логах), но он все равно не должен менять данные.

Примеры безопасных методов:

  • GET — получение представления ресурса.
  • HEAD — получение только заголовков ответа (как GET, но без тела).
  • OPTIONS — запрос поддерживаемых методов для ресурса.
  • TRACE — диагностический запрос, возвращающий полученное сообщение (используется редко).

Примеры небезопасных методов (изменяют состояние): POST, PUT, DELETE, PATCH.

Практический пример и важность:

GET /api/products/123 HTTP/1.1
Host: example.com

Этот запрос безопасен. Веб-браузеры и поисковые роботы могут свободно выполнять такие запросы, не опасаясь изменения данных. Безопасность методов — основа для надежного кеширования и предварительной загрузки (prefetching) контента.

Ответ 18+ 🔞

Ага, слушай, вот сидишь ты, такой весь из себя архитектор API, и думаешь: "Ну как бы так сделать, чтобы какой-нибудь еблан с кривыми руками или, хуже того, поисковый паук Гугла, не наебнул мне всю базу данных, просто пройдясь по ссылкам?" Вот для этого, блядь, и придумали концепцию «безопасных» HTTP-методов.

Если по-простому, то безопасный метод — это такой, от которого серверу ни жарко ни холодно в плане данных. Он как тихий, воспитанный гость: зашел, посмотрел на твою коллекцию винила, даже пыль с пластинки не сдул, и вышел. Состояние сервера — ноль изменений. Только чтение, только хардкор.

Что он из себя представляет, этот скромник:

  • Читает как в библиотеке: Не создает, не правит, не удаляет ни хуя. Только смотрит.
  • Может быть говнюком (неидемпотентным): Ему похуй. Он десять раз подряд может запросить одно и то же, и в твоих логах будет десять записей (побочный эффект логирования), но в самой бизнес-логике — тишина и благодать. Данные на месте.

Кто ходит в этой «безопасной» банде:

  • GET — классика жанра. "Дай-ка посмотрю, что там за товар под номером 123".
  • HEAD — тот же GET, но поцивилизованнее. "Скажи, а есть ли у тебя такой товар и какой он длины? Саму хуйню присылать не надо".
  • OPTIONS — метод-разведчик. "Эй, а что вообще можно с этим URL делать?"
  • TRACE — редкий психоделический уродец, который возвращает тебе твой же запрос. Нужен для отладки, но в реальной жизни его видели реже, чем честного политика.

А вот это — НЕ безопасные, это уже банда с болгарками (меняют состояние): POST, PUT, DELETE, PATCH. С ними надо на стрёме.

Ну и пример, чтобы совсем пиздец стало понятно:

GET /api/products/123 HTTP/1.1
Host: example.com

Вот этот запрос — безопаснее некуда. Его может выполнять хоть браузер, хоть робот-пылесос, и всем будет похуй. Именно на этой безопасности, ёпта, держится всё кеширование и предзагрузка страниц. Потому что всем известно: GET — не мудак, он ничего не сломает.