Какой HTTP метод следует использовать для операции авторизации (логина) в REST API и почему?

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

Ответ

Для операции авторизации (логина) в REST API следует использовать метод POST.

Причины выбора POST:

  1. Безопасность: POST передает данные (логин, пароль, токен) в теле запроса, а не в URL. Это предотвращает попадание конфиденциальной информации в логи сервера, историю браузера или аналитику.
  2. Семантика: Операция логина создает сессию или токен на сервере, что соответствует семантике POST (CREATE).
  3. Отсутствие идемпотентности: Логин обычно не является идемпотентной операцией (повторный идентичный запрос может создать новую сессию или вернуть ошибку).

Почему другие методы не подходят:

  • GET: Данные передаются в URL-строке, что небезопасно. GET предназначен для получения данных, а не для операций с побочными эффектами.
  • PUT/PATCH: Семантически предназначены для обновления существующих ресурсов, а не для создания сессии.
  • DELETE: Очевидно не подходит по смыслу.

Пример реализации на Java:

HttpClient client = HttpClient.newHttpClient();

// Данные для авторизации в теле запроса
String authBody = "{"username":"john_doe", "password":"secret123"}";

HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://api.example.com/auth/login"))
        .header("Content-Type", "application/json")
        .POST(HttpRequest.BodyPublishers.ofString(authBody)) // Используем POST
        .build();

HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

// В ответе ожидается токен (например, JWT)
String jwtToken = response.body();

Для последующих авторизованных запросов полученный токен передается в заголовке Authorization: Bearer <token>.