← Назад к вопросам

Какие HTTP-методы являются безопасными?

1.6 Junior🔥 271 комментариев
#API и интеграции

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Какие HTTP-методы являются безопасными

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

Безопасные HTTP-методы

1. GET — получить ресурс

Самый безопасный метод. Используется для чтения данных без побочных эффектов.

GET /api/v1/users/123
GET /api/v1/products?category=electronics

Свойства:

  • Не должен изменять данные на сервере
  • Может быть закеширован
  • Безопасен для автоматических переходов (например, сканеры, боты)

2. HEAD — как GET, но без тела ответа

Идентичен GET, но сервер возвращает только заголовки без тела ответа. Полезен для проверки наличия ресурса и его метаданных.

HEAD /api/v1/files/document.pdf

Ответ (без содержимого файла):

200 OK
Content-Length: 1024000
Content-Type: application/pdf
Last-Modified: 2025-03-20

Применение:

  • Проверка наличия ресурса
  • Получение размера файла без скачивания
  • Проверка кеша (если ресурс изменился)

3. OPTIONS — получить доступные методы для ресурса

Используется для получения информации о том, какие HTTP-методы поддерживает ресурс.

OPTIONS /api/v1/users

Ответ:

200 OK
Allow: GET, POST, HEAD, OPTIONS
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Content-Type, Authorization

Применение:

  • CORS preflight запросы (браузер автоматически отправляет перед сложными запросами)
  • Определение возможностей сервера
  • Кеширование информации о поддерживаемых операциях

4. TRACE — диагностический метод

Отправляет запрос обратно в виде ответа. Используется редко, часто отключен в production.

TRACE /api/v1/test

Ответ содержит весь путь запроса через прокси и серверы.

Обычно отключен из соображений безопасности.

Безопасные ≠ Идемпотентные

Важное уточнение: безопасность не означает идемпотентность!

  • GET: безопасен И идемпотентен

    • Каждый вызов дает одинаковый результат
    • Не влияет на состояние сервера
  • HEAD: безопасен И идемпотентен

    • Каждый вызов дает одинаковые заголовки
    • Не влияет на состояние сервера
  • OPTIONS: безопасен И идемпотентен (обычно)

    • Не изменяет состояние
    • Возвращает постоянную информацию о методах

Небезопасные методы

1. POST — создать ресурс

POST /api/v1/users

Изменяет состояние (создает новый ресурс). НЕ безопасен, обычно НЕ идемпотентен.

2. PUT — заменить ресурс

PUT /api/v1/users/123

Изменяет состояние (полностью заменяет ресурс). НЕ безопасен, но идемпотентен.

3. PATCH — частично обновить ресурс

PATCH /api/v1/users/123

Изменяет состояние (обновляет часть ресурса). НЕ безопасен, обычно НЕ идемпотентен.

4. DELETE — удалить ресурс

DELETE /api/v1/users/123

Изменяет состояние (удаляет ресурс). НЕ безопасен, но идемпотентен (второе удаление вернет 404).

Таблица методов

Метод   | Безопасен | Идемпотентен | Кешируется
--------|-----------|--------------|------------
GET     | Да        | Да           | Да
HEAD    | Да        | Да           | Да
OPTIONS | Да        | Да           | Нет
TRACE   | Да        | Да           | Нет
POST    | Нет       | Нет          | Нет
PUT     | Нет       | Да           | Нет
PATCH   | Нет       | Нет          | Нет
DELETE  | Нет       | Да           | Нет

Практические следствия безопасности

1. Предварительные запросы браузера

Браузер может автоматически выполнить GET/HEAD/OPTIONS перед отправкой формы.

// Это может вызвать GET запрос при загрузке страницы
<link rel="prefetch" href="/api/v1/data">

2. Кеширование

Безопасные методы (GET, HEAD, OPTIONS) кешируются прокси и браузерами:

GET /api/v1/users/123
Cache-Control: max-age=3600
ETag: "abc123"

3. Логирование

Безопасные методы обычно меньше логируются, так как они не изменяют данные.

4. CORS и безопасность

Браузер позволяет безопасные методы кроссдоменных запросах более свободно:

// Простой запрос (только безопасные методы):
fetch('https://other-domain.com/api/v1/data')
// Браузер разрешит без проблем

// Сложный запрос (POST):
fetch('https://other-domain.com/api/v1/data', {
  method: 'POST',
  body: JSON.stringify({...})
})
// Браузер сначала отправит OPTIONS (preflight)

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

Ошибка 1: Использование GET с изменением данных

// ❌ Неправильно
GET /api/v1/users/123/delete
GET /api/v1/products/456/add-to-cart

Это нарушает RESTful принципы и создает проблемы с кешированием и безопасностью.

Ошибка 2: POST для чтения

// ❌ Неправильно
POST /api/v1/users/search
// Правильно
GET /api/v1/users?search=query

Ошибка 3: Предположение, что HEAD идентичен GET NEAD возвращает заголовки, но не тело. Некоторые серверы реализуют это неправильно.

Вывод

Безопасные HTTP-методы (GET, HEAD, OPTIONS, TRACE) — это методы, которые только читают данные и не должны изменять состояние сервера. Это важно для:

  • Безопасности: безопасные методы не должны иметь побочных эффектов
  • Кеширования: браузеры и прокси кешируют безопасные методы
  • RESTful дизайна: соответствие стандартам HTTP
  • Автоматизации: боты и сканеры безопасно выполняют безопасные методы

Алправда используются только GET, HEAD и иногда OPTIONS. TRACE обычно отключен в production из соображений безопасности.

Какие HTTP-методы являются безопасными? | PrepBro