Как работает веб: клиент, сервер, HTTP
Как работает веб: клиент, сервер, HTTP
Веб - это не магия. Это сообщения.
Браузер (клиент) говорит серверу: «Дай страницу». Сервер отвечает: «Держи HTML, CSS, JS». Иногда ещё: «А ты кто вообще?» - и просит авторизацию.
Клиент и сервер
Клиент - программа, которая отправляет запрос. Чаще всего это браузер, но может быть мобильное приложение, curl, Postman или другой сервер.
Сервер - программа, которая слушает запросы и отвечает на них. Это твой Go/PHP/Node код, запущенный на удалённой машине.
Браузер → (HTTP запрос) → Сервер → (HTTP ответ) → Браузер
Одна важная деталь: сервер не звонит первым. Он всегда ждёт, пока клиент попросит. Это модель «запрос-ответ».
Что происходит при открытии страницы
Когда ты вводишь example.com в браузере:
- Браузер спрашивает DNS: «Какой IP у example.com?» → получает адрес (например, 185.x.x.x)
- Браузер открывает TCP-соединение с сервером по этому IP на порту 443 (HTTPS)
- Браузер отправляет HTTP-запрос:
GET / HTTP/1.1 - Сервер обрабатывает запрос и возвращает HTML
- Браузер видит в HTML ссылки на CSS и JS → отправляет дополнительные запросы
- Когда всё загружено - рендерит страницу
HTTP - протокол общения
HTTP (HyperText Transfer Protocol) - набор правил: как формировать запрос и ответ.
Запрос
GET /course/sql/08-isolation HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: text/html
Accept-Language: ru,en
Состоит из: метод (GET), путь (/course/sql/08-isolation), версия протокола, заголовки (метаданные запроса).
Ответ
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 4521
<!doctype html>
<html>...</html>
Состоит из: статус-код (200 OK), заголовки ответа, тело (HTML, JSON, файл).
HTTP-методы
Метод говорит серверу, что клиент хочет сделать:
GET - получить данные (страницу, список, файл)
POST - создать что-то новое (отправить форму, создать запись)
PUT - заменить ресурс целиком
PATCH - частично обновить ресурс
DELETE - удалить ресурс
OPTIONS - узнать, какие методы поддерживает сервер (CORS preflight)
GET не должен менять данные на сервере. Если обновишь страницу - запрос повторится, и ничего не сломается. POST может менять - поэтому браузер спрашивает «Отправить форму повторно?».
Идемпотентность методов
Идемпотентный метод - тот, который можно вызвать несколько раз подряд с одинаковым результатом. Повторный вызов не меняет состояние сервера:
GET - идемпотентный (просто читает данные)
PUT - идемпотентный (перезаписывает ресурс одним и тем же значением)
DELETE - идемпотентный (удалить уже удалённое = ничего не происходит)
POST - НЕ идемпотентный (каждый вызов создаёт новый ресурс)
PATCH - НЕ идемпотентный (зависит от реализации)
Статус-коды
Сервер отвечает числом, которое говорит «что произошло». Первая цифра задаёт класс ответа:
Заголовки (Headers)
Заголовки - метаданные запроса/ответа. Самые частые:
Content-Type: application/json - тип содержимого
Authorization: Bearer eyJhbG... - токен авторизации
Cache-Control: max-age=3600 - кеширование
Set-Cookie: session=abc123 - установить cookie
Accept: text/html, application/json - что клиент принимает
HTTPS - безопасный HTTP
HTTPS = HTTP + TLS-шифрование. Данные между браузером и сервером зашифрованы - никто посередине (Wi-Fi роутер, провайдер) не может их прочитать или подменить.
Без HTTPS: пароли, куки, данные форм передаются открытым текстом. Сегодня HTTPS - стандарт, браузеры помечают HTTP-сайты как «небезопасные».
URL - адрес ресурса
Порт 443 (HTTPS) и 80 (HTTP) - стандартные, обычно не пишутся. Query-строка ?page=2 - параметры запроса. Фрагмент #intro - якорь на странице (не отправляется серверу).
Мини-задание
- Открой DevTools → Network и посмотри любой запрос на example.com
- Найди метод, статус-код и заголовок
Content-Typeв ответе - Попробуй
curl -v https://example.comв терминале и прочитай заголовки - Найди запрос, который возвращает JSON (подсказка: API-запросы)