# HTTP, API, JSON простыми словами

← [Раздел](README.md) · [Главная](../README.md)

## Цель

Понять, **как программы обмениваются данными** через HTTP/HTTPS, что такое REST API и JSON — чтобы читать логи, настраивать WAF/API gateway и понимать DAST.

## Предварительно

- [Git без программирования](git-bez-programmirovaniya.md)

## Время

**3–4 часа**

---

## HTTP — «язык» веба

Когда вы открываете сайт, браузер отправляет **HTTP-запрос**, сервер отвечает **HTTP-ответом**.

**Аналогия:** заказное письмо — **конверт** (заголовки) + **текст** (тело).

### Структура запроса

```http
GET /api/users/42 HTTP/1.1
Host: api.example.com
Authorization: Bearer YOUR_TOKEN
Accept: application/json
```

### Структура ответа

```http
HTTP/1.1 200 OK
Content-Type: application/json

{"id": 42, "name": "Anna", "role": "guest"}
```

---

## Методы HTTP (главные)

| Мethod | Действие | Идempotent* | Пример |
|--------|----------|-------------|--------|
| GET | Прочитать | Да | Список гостей |
| POST | Создать | Нет | Регистрация |
| PUT/PATCH | Обновить | PUT — да | Смена email |
| DELETE | Удалить | Да | Удалить аккаунт |

\*Повторный запрос не должен «ломать» состояние (упрощённо).

**SecOps:** POST без CSRF-защиты, GET с side-effect (удаление через ссылку) — частые находки.

---

## Коды ответа (status codes)

| Код | Значение | SecOps note |
|-----|----------|-------------|
| 200 | OK | — |
| 301/302 | Redirect | Open redirect риски |
| 401 | Unauthorized | Нет/неверная auth |
| 403 | Forbidden | Auth есть, прав нет |
| 404 | Not found | Не палить структуру |
| 429 | Too many requests | Rate limit работает |
| 500 | Server error | Может leak stack trace |

---

## HTTPS = HTTP + TLS

**HTTPS** шифрует канал. Без него токены и пароли видны в сети (MitM).

| HTTP | HTTPS |
|------|-------|
| Порт 80 | Порт 443 |
| Открытый текст | Шифрование TLS |
| ❌ для login | ✅ обязательно |

Сертификат проверяется браузером (CA chain). Self-signed — только для **lab**.

---

## API (Application Programming Interface)

**API** — **договор**, как вызывать функции системы по сети.

**REST** (самый частый стиль):

- Ресурсы = **существительные** в URL: `/users`, `/orders/15`
- Действия = HTTP-методы
- Данные часто в **JSON**

```
GET    /api/v1/events/3     → получить событие #3
POST   /api/v1/rsvp         → отправить RSVP
DELETE /api/v1/sessions/abc → завершить сессию
```

**Versioning:** `/v1/` — чтобы не ломать старых клиентов при изменениях.

---

## JSON — формат данных

```json
{
  "event": "wedding",
  "guests": [
    {"name": "Ivan", "plusOne": true},
    {"name": "Maria", "plusOne": false}
  ],
  "meta": {
    "total": 2
  }
}
```

| Тип | Пример |
|-----|--------|
| string | `"hello"` |
| number | `42`, `3.14` |
| boolean | `true`, `false` |
| array | `[1, 2, 3]` |
| object | `{ "key": "value" }` |
| null | `null` |

**SecOps:** парсинг JSON без валидации схемы → injection, DoS (огромный payload).

---

## Аутентификация API (обзор)

| Способ | Как передаётся | Риск |
|--------|----------------|------|
| API Key | Header `X-API-Key` | Утечка в логах |
| Bearer Token | `Authorization: Bearer ...` | TTL, rotation |
| Basic Auth | Base64(user:pass) | Только с HTTPS |
| mTLS | Клиентский сертификат | Сложнее, но сильнее |

Подробнее — [AuthN и AuthZ](../04-fundament-bezopasnosti/authn-authz.md).

---

## Практика в браузере

1. Откройте DevTools (F12) → **Network**.
2. Обновите страницу с API (любой современный сайт).
3. Найдите запрос `fetch`/XHR → вкладки **Headers**, **Response**.
4. Определите: method, status, Content-Type.

CLI (опционально):

```bash
curl -s https://api.github.com/zen
curl -s -H "Accept: application/json" https://httpbin.org/get
```

---

## Типичные API-уязвимости (для узнавания)

| Проблема | Пример |
|----------|--------|
| BOLA/IDOR | `GET /users/5` → меняю на `/users/6`, вижу чужие данные |
| Excessive data | API отдаёт лишние поля (email, internal id) |
| No rate limit | Brute force login |
| Verbose errors | 500 с SQL в теле ответа |

OWASP API Security Top 10 — отдельный список; логика похожа на web Top 10.

---

## Самопроверка

1. Чем GET отличается от POST?
2. Что означает HTTP 403 vs 401?
3. Зачем HTTPS, если пароль «и так сложный»?
4. Приведите пример JSON-объекта с массивом внутри.

---

## Дальше

→ [Базы данных для SecOps](bazy-dannyh-chto-nuzhno-secops.md)
