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

«Какие HTTP-методы считаются безопасными и почему?» — вопрос из категории Сети, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Ключевые безопасные методы:

  • **GET**: Запрашивает представление указанного ресурса. Является основным методом для получения данных.
  • **HEAD**: Аналогичен GET, но сервер возвращает только заголовки ответа, без тела сообщения. Используется для проверки метаданных ресурса (например, Content-Length или Last-Modified) без загрузки всего содержимого.
  • **OPTIONS**: Запрашивает информацию о параметрах соединения для целевого ресурса. Например, чтобы узнать, какие HTTP-методы поддерживаются для данного URL (Allow заголовок).

Важное различие: Безопасность не следует путать с идемпотентностью. Идемпотентный метод (PUT, DELETE) при многократном повторении приводит к тому же результату, что и при однократном, но он может изменять состояние сервера. Безопасный метод (GET) не изменяет состояние в принципе.

Пример использования HEAD в Python:

import requests

# Проверяем размер файла перед его скачиванием
url = 'https://releases.ubuntu.com/22.04.3/ubuntu-22.04.3-desktop-amd64.iso'

try:
    response = requests.head(url, timeout=5)
    response.raise_for_status() # Проверка на ошибки HTTP

    content_length = response.headers.get('content-length')
    if content_length:
        size_in_mb = int(content_length) / (1024 * 1024)
        print(f"Размер файла: {size_in_mb:.2f} MB")
    else:
        print("Заголовок 'content-length' не найден.")

except requests.RequestException as e:
    print(f"Ошибка запроса: {e}")