Какие особенности работы с куки в WebView и почему важно проверять корректность их передачи
Что проверяют
Понимаете ли вы, что у WebView своё хранилище куки, отдельное от браузера и от сетевого клиента приложения, и что на этом стыке ломается авторизация. Следом обычно спрашивают, как убедиться, что после выхода из аккаунта сессия действительно удалена.
Как отвечать
Типовой сценарий: пользователь вошёл в нативной части, а часть экранов открывается в WebView. Сессия переносится туда через куки, и это место легко сломать.
- Android: куки хранит
CookieManager, их выставляют черезsetCookie(url, value)и сохраняют на диск черезflush(). Сторонние куки в WebView по умолчанию выключены, для iframe оплаты нуженsetAcceptThirdPartyCookies. OkHttp держит свои куки вCookieJar, их синхронизируют вручную; - iOS: у
WKWebViewхранилищеWKHTTPCookieStore, отдельное отHTTPCookieStorage, которым пользуетсяURLSession. МетодsetCookieасинхронный: если загрузить страницу до его завершения, первый запрос уйдёт без куки; - атрибуты:
DomainиPathопределяют, куда кука уйдёт,Secureзапрещает отправку по HTTP,HttpOnlyскрывает её отdocument.cookie. Для межсайтовых запросов куку помечаютSameSite=None; Secure; - отладка: на Android
chrome://inspectпри включённомsetWebContentsDebuggingEnabled, на iOS Safari Web Inspector, для которого с iOS 16.4 нужноisInspectable = true. Во вкладке Network видно, ушёл ли заголовокCookie.
Проверять это важно, потому что ошибка выглядит не как падение, а как повторный вход, пустая корзина или, хуже, чужая сессия после смены аккаунта. Минимальный набор кейсов: первая загрузка, перезапуск приложения, выход, вход под другим пользователем, истечение сессии, редирект на другой домен.
Где спотыкаются
Проверяют только вход и забывают выход. Если куки WebView не очищены, следующий пользователь на том же устройстве видит чужой аккаунт.
Не знают, что хранилища WebView и нативного клиента разные, и заводят баг на бэкенд, хотя запрос просто ушёл без куки.
Проверяют один раз на свежей установке. Потеря куки без flush() видна только после перезапуска, сторонние куки только во фрейме оплаты, а гонка с асинхронной установкой на iOS только на первом запросе.