Какие части HTTP-запроса (хедеры, тело) шифруются в HTTPS
Что проверяют
Понимаете ли вы, что TLS прячет от сети всё HTTP-сообщение, и что при этом остаётся видно. Для iOS-разработчика следом почти всегда спрашивают про ATS и pinning: как приложение защищается, если трафик пытаются читать через прокси.
Как отвечать
HTTP идёт внутри TLS целиком, поэтому зашифрованы:
- стартовая строка: метод, путь и query-параметры из
URLComponents; - заголовки:
Host,Authorization,Cookie, всё, что вы выставили вURLRequest; - тело:
httpBodyили данные изuploadTask.
Открытыми остаются IP-адреса и порты, имя хоста (в DNS и в поле SNI при установке соединения), а также размеры и тайминги трафика. По сети видно, что приложение ходит на ваш API-домен, но не видно, в какой метод и с чем.
Дальше про платформу:
- ATS: App Transport Security по умолчанию не пускает
URLSessionна открытый HTTP и требует TLS 1.2 и выше с forward secrecy. Исключения прописывают вInfo.plistточечно по доменам, аNSAllowsArbitraryLoadsснимает защиту целиком; - pinning: HTTPS не спасает от Charles или Proxyman, если на устройство поставили их корневой сертификат. Pinning через
NSPinnedDomainsвInfo.plistили проверка вurlSession(_:didReceive:completionHandler:)отсекают такой перехват; - после расшифровки: ответы могут осесть в
URLCacheна диске, а URL с токеном попасть в логи и аналитику.
Где спотыкаются
Говорят, что URL не шифруется. Шифруется всё, кроме имени хоста.
Считают HTTPS защитой от пользователя. Владелец устройства может поставить свой сертификат и читать трафик, поэтому ключи и секреты, зашитые в приложение, HTTPS не прячет.
Отключают ATS целиком ради одного старого сервера вместо исключения для его домена.