Почему для передачи конфиденциальных данных в HTTP предпочтительнее использовать POST, а не GET?

«Почему для передачи конфиденциальных данных в HTTP предпочтительнее использовать POST, а не GET?» — вопрос из категории Безопасность, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Метод GET передает параметры в URL-строке запроса, что создает несколько уязвимостей для конфиденциальных данных (пароли, токены, персональные данные). Метод POST передает данные в теле запроса, что значительно безопаснее.

Риски использования GET:

  • Логирование: URL попадает в историю браузера, веб-серверы (access logs), прокси-серверы и аналитические системы.
  • Referer header: При переходе по ссылке полный URL с параметрами отправляется на следующий сайт в HTTP-заголовке Referer.
  • Видимость: Параметры отображаются в адресной строке браузера и могут быть подсмотрены.
  • Ограничение длины: Длина URL ограничена (обычно 2048 символов).

Пример небезопасного GET-запроса:

GET /login?username=admin&password=secret123 HTTP/1.1
Host: example.com

Пример безопасного POST-запроса:

POST /login HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 35

username=admin&password=secret123

Важное уточнение: Использование POST само по себе не обеспечивает шифрования. Для реальной безопасности данные должны передаваться по защищенному протоколу HTTPS (TLS), независимо от метода запроса.