Через HTTP без шифрування кожен запит видно будь-кому на шляху: публічний Wi-Fi, провайдер, скомпрометований роутер. Токени в Authorization, cookie сесій, паролі в тілі запиту, персональні дані у відповідях - усе в відкритому вигляді. Крім читання, трафік можна змінити (вставити скрипт, підмінити відповідь).
HTTPS (TLS) дає:
- шифрування - вміст недоступний стороннім;
- цілісність - зміна трафіку буде виявлена;
- автентичність сервера - сертифікат підтверджує, що клієнт говорить саме з вашим доменом.
Правила для API:
- лише HTTPS, без «а на HTTP теж працює». Запит на HTTP краще відхиляти, а не перенаправляти: редирект
301для API означає, що токен уже пройшов відкритим каналом у першому запиті; - сертифікати - автоматичне оновлення (Let's Encrypt, Caddy, хмарні балансувальники), моніторинг терміну дії;
- сучасний TLS (1.2+, краще 1.3), без застарілих шифрів.
HSTS (Strict-Transport-Security) - заголовок, що каже браузеру: «з цим доменом - лише HTTPS, протягом указаного часу»:
Strict-Transport-Security: max-age=31536000; includeSubDomains
Після першого візиту браузер сам переписуватиме http:// на https:// ще до відправки запиту - атака з «пониженням» до HTTP (SSL stripping) не спрацює. preload і включення домену в список браузерів захищає навіть перший візит.
Що варто знати:
- HSTS стосується браузерів. Мобільні застосунки й серверні клієнти його не читають - їх треба конфігурувати на HTTPS-адреси;
includeSubDomains- лише якщо всі піддомени готові до HTTPS, інакше вони стануть недоступними на весьmax-age;- за проксі (Cloudflare, балансувальник) TLS може закінчуватися на проксі. Laravel має довіряти заголовкам
X-Forwarded-Proto(trustProxies), інакше генеруватимеhttp://посилання й вважатиме запити незахищеними; - cookie з
Secureне передаються по HTTP взагалі.
Між внутрішніми сервісами теж варто шифрувати трафік: «внутрішня мережа» часто не така закрита, як здається, а для критичних з'єднань - взаємна автентифікація (mTLS).