Skip to content

HTTP, Protocols & Security — изменения 2024 года ​

  • Период: 1 января 2024 — 31 декабря 2024
  • Версии браузеров: Chrome/Edge 121–132, Firefox 121–133, Safari 17.2–18.2

Обзор года ​

2024 год стал годом кардинальных изменений в веб-экосистеме. Ключевым событием стала отмена планов по deprecation third-party cookies в Chrome (июль 2024), что радикально изменило направление индустрии. Параллельно произошло массовое внедрение постквантовой криптографии, достижение Baseline-статуса для критически важных API, и усиление защиты от tracking.

Ключевые темы года ​

  • Великий разворот cookies: Google отменил deprecation third-party cookies (22 июля 2024)
  • Постквантовая эра: ML-KEM в Chrome 124, финальный стандарт в Chrome 131
  • HTTP/3 adoption: рост до 30%+ трафика, стабилизация экосистемы
  • Baseline-достижения: Fetch Priority, Priority header, bytes() method, keepalive (октябрь-ноябрь 2024)
  • Passkeys mainstream: 1+ миллиард аутентификаций, WebAuthn Level 3
  • Bounce tracking protection: Firefox 133 присоединился к Safari и Chrome
  • Service Worker innovations: Static Routing API (Chrome 123)

Взаимосвязь HTTP и Security ​

HTTP-протоколы и безопасность остаются неразделимыми в современном вебе:

  • Security headers (CSP, COEP, COOP, Permissions-Policy) определяют поведение через HTTP
  • Privacy-focused protocols (CHIPS, FedCM, Storage Access API) работают на уровне HTTP
  • HTTP/3 и QUIC интегрируют TLS 1.3 и постквантовую криптографию на уровне протокола
  • Cookies — центральный элемент как для HTTP state management, так и для privacy debates

Этот отчёт объединяет обе области для целостного понимания трансформаций 2024 года.

Часть 1: HTTP и сетевые протоколы ​

1. HTTP/3 — массовая адаптация ​

HTTP/3 базируется на протоколе QUIC (UDP вместо TCP) и включает встроенную поддержку TLS 1.3. 2024 год стал переломным для адаптации протокола в production.

1.1 Статус браузерной поддержки ​

Chrome/Edge:

  • Полная поддержка HTTP/3 с Chrome 87 (ноябрь 2020)
  • Chrome 121-132 (весь 2024): стабильная production-поддержка
  • Составляет ~80% HTTP/3 трафика по данным 2024 года
  • Поддержка HTTP/3 по умолчанию, без необходимости включения flags

Firefox:

  • Полная поддержка с Firefox 88 (апрель 2021)
  • Firefox 121-133 (весь 2024): стабильная поддержка
  • Составляет ~10% HTTP/3 трафика
  • HTTP/3 включён по умолчанию во всех релизах 2024 года

Safari:

  • До 2024: экспериментальная поддержка (Safari 14-15.6 disabled по умолчанию)
  • Safari 16.0+: полная production-поддержка ⭐
  • Сентябрь 2024: HTTP/3 поддерживается для всех пользователей Safari 16+
  • Apple удалил опцию "HTTP/3" из Experimental Features (стандарт ратифицирован как RFC 9114)
  • Составляет оставшуюся долю HTTP/3 трафика

Specification: RFC 9114 (ратифицирован)

1.2 Статистика адаптации 2024 ​

Browser Coverage:

  • 95%+ браузеров поддерживают HTTP/3 (сентябрь 2024)
  • 91.55% global usage coverage через поддерживаемые браузеры
  • Практически универсальная browser compatibility

Website Adoption:

  • 34% из топ-10 миллионов сайтов поддерживают HTTP/3 (сентябрь 2024)
  • По данным Web Almanac 2024: реальная поддержка ближе к 30%
  • Другие источники: 29.8% сайтов используют HTTP/3 (mid-2024)

Traffic Distribution:

  • Chrome: ~80% HTTP/3 requests
  • Edge: ~10%
  • Firefox: чуть менее 10%
  • Safari: оставшаяся доля

Сравнение с 2023:

  • 2023: ~40% трафика использовало HTTP/3, 26% топ-сайтов
  • 2024: ~30% трафика (стабилизация после initial hype), 30-34% топ-сайтов
  • Рост adoption среди сайтов при нормализации traffic patterns

1.3 Технические характеристики ​

Преимущества QUIC/HTTP/3:

  • ✅ 0-RTT / 1-RTT connection establishment — быстрое установление соединения
  • ✅ Multiplexing без head-of-line blocking — решение ключевой проблемы HTTP/2
  • ✅ Connection migration — сохранение соединения при смене сети (Wi-Fi → мобильная сеть)
  • ✅ Improved loss recovery — лучшая производительность при плохом качестве сети
  • ✅ Встроенная поддержка TLS 1.3 — криптография на уровне протокола
  • ✅ Reduced latency — особенно критично для mobile networks

Challenges:

  • ⚠️ UDP blocking в некоторых корпоративных сетях
  • ⚠️ Необходимость server-side поддержки и настройки
  • ⚠️ Increased CPU usage на сервере (криптография в userspace)
  • ⚠️ Debugging сложнее, чем для TCP-based protocols

Источники:

2. HTTP Headers — новые возможности и Baseline-достижения ​

2.1 Priority HTTP Request Header (RFC 9218) ​

Статус: Baseline Newly Available (29 октября 2024) ⭐

Expected Widely Available: 29 апреля 2027

Назначение: HTTP header для коммуникации начального приоритета запроса HTTP version-independent способом, часть "Extensible Prioritization Scheme for HTTP" (RFC 9218).

Browser Support:

  • Chrome/Chrome Android: версия 103 (21 июня 2022)
  • Edge: версия 103 (23 июня 2022)
  • Safari/Safari on iOS: версия 17.2 (11 декабря 2023)
  • Firefox/Firefox for Android: версия 132 (29 октября 2024) — достигнут Baseline ⭐

Syntax:

http
Priority: u=<priority>
Priority: i
Priority: u=<priority>, i

Key Directives:

  • u=<priority>: Urgency parameter (0-7, где 0 = highest urgency, default = 3)
  • i: Incremental directive (указывает, что response может обрабатываться инкрементально)

Implementation Details:

  • Firefox и Safari используют HTTP header
  • Chromium использует только PRIORITY_UPDATE frame вместо HTTP header для initial priority signaling
  • Работает через HTTP/1.1, HTTP/2, и HTTP/3
  • HTTP/2 и HTTP/3 также поддерживают PRIORITY_UPDATE frames для re-prioritization после initial request transmission

Практический пример:

http
# Критически важный API endpoint
GET /api/critical-data HTTP/1.1
Host: api.example.com
Priority: u=0

# Обычный ресурс
GET /assets/image.jpg HTTP/1.1
Host: cdn.example.com
Priority: u=3

# Low priority analytics
GET /track/analytics HTTP/1.1
Host: analytics.example.com
Priority: u=7

Связь с fetchpriority: HTML attribute fetchpriority (см. ниже) комплементарен Priority header — первый задаётся на client-side, второй передаётся в request.

Specification: RFC 9218 — Extensible Prioritization Scheme for HTTP

Источники:

2.2 Fetch Priority (fetchpriority attribute) ​

Статус: Baseline Newly Available (29 октября 2024) ⭐

Expected Widely Available: 29 апреля 2027

Назначение: HTML атрибут fetchpriority и fetch() priority опция предоставляют hints браузеру о том, какие запросы выполнить раньше других запросов того же типа.

Browser Support:

  • Chrome/Chrome Android: версия 103 (июнь 2022)
  • Edge: версия 103 (июнь 2022)
  • Safari/Safari on iOS: версия 17.2 (декабрь 2023)
  • Firefox/Firefox for Android: версия 132 (29 октября 2024) — достигнут Baseline ⭐

Values: high, low, auto (default)

Supported Elements: <img>, <script>, <link>, <iframe>, и JavaScript Fetch API

Use Cases:

  • Load LCP (Largest Contentful Paint) hero images раньше с fetchpriority="high"
  • Defer non-critical ресурсов с fetchpriority="low"
  • Оптимизация загрузки critical CSS/JS

Практические примеры:

html
<!-- Критически важное hero image для LCP -->
<img src="/images/hero-banner.jpg" fetchpriority="high" alt="Hero banner" />

<!-- Preload критического шрифта -->
<link
    rel="preload"
    href="/fonts/primary.woff2"
    as="font"
    type="font/woff2"
    fetchpriority="high"
    crossorigin
/>

<!-- Low priority аналитика -->
<script src="/analytics/tracker.js" fetchpriority="low" async></script>

<!-- Below-the-fold изображения -->
<img src="/images/section-2.jpg" fetchpriority="low" loading="lazy" alt="Secondary content" />

<!-- Critical CSS -->
<link rel="stylesheet" href="/css/critical.css" fetchpriority="high" />

Fetch API usage:

javascript
// High priority API call
fetch('/api/critical-user-data', {
    priority: 'high',
})
    .then((response) => response.json())
    .then((data) => renderCriticalUI(data));

// Low priority prefetch
fetch('/api/secondary-data', {
    priority: 'low',
})
    .then((response) => response.json())
    .then((data) => cacheForLater(data));

Performance impact:

Правильное использование fetchpriority может значительно улучшить Core Web Vitals:

  • ✅ Reduced LCP (приоритизация hero images)
  • ✅ Improved FCP (приоритизация critical CSS)
  • ✅ Better resource utilization (deprioritization некритичных ресурсов)

Источники:

2.3 Early Hints (103 Status Code) ​

Статус: Поддерживается в major browsers (2024)

Назначение: HTTP 103 Early Hints informational response позволяет серверам отправлять preliminary HTTP headers пока готовится full response, давая браузерам возможность preconnect к сайтам или начать preloading ресурсов.

Browser Support:

  • Chrome: версия 103+ (поддержка preload и preconnect в Early Hints для top-level frame navigation)
  • Edge: версия 103+
  • Firefox: limited support
  • Safari: support status varies

Server/CDN Support (2024):

  • Cloudflare: полная поддержка с partnership с browser teams
  • NGINX: версия 1.29.0 mainline включает поддержку 103 Early Hints
  • Akamai: поддерживает отправку HTTP 103 status code с preliminary headers

Technical Requirements:

  • Большинство браузеров ограничивает поддержку HTTP/2 или HTTP/3
  • Рекомендуется отправлять только через HTTP/2 или HTTP/3 connections

Use Cases:

  • Preload критических ресурсов пока сервер готовит response
  • Preconnect к внешним domains
  • Улучшение page load performance во время server think-time

Практический пример:

http
HTTP/1.1 103 Early Hints
Link: </css/critical.css>; rel=preload; as=style
Link: </js/main.js>; rel=preload; as=script
Link: <https://cdn.example.com>; rel=preconnect

HTTP/1.1 200 OK
Content-Type: text/html
<!DOCTYPE html>
<html>
  <head>
    <link rel="stylesheet" href="/css/critical.css">
    <script src="/js/main.js"></script>
  </head>
  ...
</html>

Server-side реализация (Node.js/Express):

javascript
app.get('/', async (req, res) => {
    // Отправить Early Hints
    res.writeEarlyHints({
        link: [
            '</css/critical.css>; rel=preload; as=style',
            '</js/main.js>; rel=preload; as=script',
            '<https://fonts.googleapis.com>; rel=preconnect',
        ],
    });

    // Подготовить полный response (долгая операция)
    const data = await fetchDataFromDatabase();
    const html = renderTemplate(data);

    // Отправить финальный response
    res.send(html);
});

Performance Impact: По данным Cloudflare, может улучшить website load times до 30%.

Источники:

2.4 Server-Timing Header ​

Статус: Baseline Widely Available (март 2023)

Назначение: HTTP Server-Timing response header коммуницирует одну или несколько performance метрик о request-response cycle к user agent, отображая backend server timing metrics в developer tools.

Browser Support: Доступен во всех браузерах с марта 2023

  • Chrome: полная поддержка
  • Firefox: полная поддержка
  • Safari: полная поддержка
  • Edge: полная поддержка

Syntax:

http
Server-Timing: db;dur=53, app;dur=47.2
Server-Timing: cache;desc="Cache Read";dur=23.2
Server-Timing: api;dur=123.4;desc="API call"

Key Features:

  • Метрики observable из "navigation" и "resource" performance entries
  • Доступны через PerformanceResourceTiming.serverTiming property
  • Возвращает array of PerformanceServerTiming objects
  • Доступны только в secure contexts (HTTPS) в некоторых браузерах

Security Considerations:

  • Restricted to same origin по умолчанию
  • Используйте Timing-Allow-Origin header для указания domains, которым разрешён доступ к server metrics

Практический пример:

javascript
// Server-side (Node.js/Express)
app.get('/api/data', async (req, res) => {
    const startTime = Date.now();

    // Database query
    const dbStart = Date.now();
    const data = await db.query('SELECT * FROM products');
    const dbDuration = Date.now() - dbStart;

    // External API call
    const apiStart = Date.now();
    const enrichedData = await externalAPI.enrich(data);
    const apiDuration = Date.now() - apiStart;

    // Cache operation
    const cacheStart = Date.now();
    await cache.set(cacheKey, enrichedData);
    const cacheDuration = Date.now() - cacheStart;

    const totalDuration = Date.now() - startTime;

    // Отправить Server-Timing header
    res.set(
        'Server-Timing',
        `db;desc="Database Query";dur=${dbDuration}, ` +
            `api;desc="External API";dur=${apiDuration}, ` +
            `cache;desc="Cache Write";dur=${cacheDuration}, ` +
            `total;desc="Total";dur=${totalDuration}`,
    );

    res.json(enrichedData);
});

Client-side usage:

javascript
// Получить server timing из Navigation Timing API
const navTiming = performance.getEntriesByType('navigation')[0];
if (navTiming.serverTiming) {
    navTiming.serverTiming.forEach((entry) => {
        console.log(`${entry.name}: ${entry.duration}ms - ${entry.description}`);
    });
}

// Получить server timing из Resource Timing API
const resourceTiming = performance
    .getEntriesByType('resource')
    .find((r) => r.name.includes('/api/data'));

if (resourceTiming && resourceTiming.serverTiming) {
    resourceTiming.serverTiming.forEach((entry) => {
        console.log(`${entry.name}: ${entry.duration}ms`);
    });
}

HTTP Trailers Support:

  • Только browser DevTools может использовать Server-Timing как HTTP trailer
  • Fetch API не может получить доступ к HTTP trailers

Use Cases:

  • Database read/write timing measurement
  • CPU time measurement
  • File system access metrics
  • Cache hit/miss timing analysis
  • External API call duration tracking
  • Real User Monitoring (RUM) backend performance

Источники:

2.5 Sec-Fetch Headers ​

Статус: Baseline Newly Available (март 2023)

Expected Widely Available: сентябрь 2025

Headers in This Family:

  • Sec-Fetch-Site
  • Sec-Fetch-Mode
  • Sec-Fetch-Dest
  • Sec-Fetch-User

Browser Support (все headers):

  • Chrome: версия 76+
  • Edge: версия 79+
  • Firefox: версия 90+
  • Opera: версия 63+
  • Chrome Android: версия 76+
  • Firefox Android: версия 90+
  • Opera Android: версия 54+
  • Samsung Internet: версия 12+
  • Safari/iOS Safari: не поддерживается по состоянию на 2024

Sec-Fetch-Site: Указывает relationship между initiator's origin и origin запрашиваемого ресурса

Values: cross-site, same-origin, same-site, none

Sec-Fetch-Mode: Указывает mode запроса

Values: cors, navigate, no-cors, same-origin, websocket

Sec-Fetch-Dest: Указывает destination запроса

Values: audio, audioworklet, document, embed, empty, font, frame, iframe, image, manifest, object, paintworklet, report, script, serviceworker, sharedworker, style, track, video, worker, xslt

Sec-Fetch-User: Указывает, был ли navigation request инициирован user activation

Value: ?1 (присутствует) или отсутствует

Security Use Cases:

  • ✅ Защита от Cross-Site Request Forgery (CSRF)
  • ✅ Предотвращение Cross-Site Script Inclusion (XSSI)
  • ✅ Mitigation resource timing attacks
  • ✅ Защита от XS-Leaks

Практический пример — Resource Isolation Policy:

javascript
// Express.js middleware
function fetchMetadataPolicy(req, res, next) {
    const site = req.headers['sec-fetch-site'];
    const mode = req.headers['sec-fetch-mode'];
    const dest = req.headers['sec-fetch-dest'];

    // Если headers не присутствуют (старые браузеры), разрешить
    if (!site) {
        return next();
    }

    // Разрешить navigation requests
    if (mode === 'navigate' && dest === 'document') {
        return next();
    }

    // Разрешить same-origin и same-site
    if (site === 'same-origin' || site === 'same-site') {
        return next();
    }

    // Разрешить specific CORS requests от trusted origins
    const trustedOrigins = ['https://trusted-partner.com', 'https://cdn.example.com'];

    if (mode === 'cors' && trustedOrigins.includes(req.headers.origin)) {
        return next();
    }

    // Блокировать все остальные cross-site requests
    console.warn(`Blocked cross-site request: ${req.method} ${req.url}`, {
        site,
        mode,
        dest,
        origin: req.headers.origin,
    });

    return res.status(403).json({
        error: 'Forbidden',
        message: 'Cross-site requests are not allowed',
    });
}

// Применить к API endpoints
app.use('/api/*', fetchMetadataPolicy);
app.use('/admin/*', fetchMetadataPolicy);

Important Note: Это Fetch Metadata Request Headers, предложенные Google. Они автоматически отправляются браузерами — разработчики не могут устанавливать их вручную.

Источники:

3. Fetch API — новые методы и Baseline-достижения ​

3.1 Fetch API keepalive ​

Статус: Baseline Newly Available (ноябрь 2024) — Firefox 133 ⭐

Назначение: Свойство keepalive интерфейса Request указывает, будет ли браузер поддерживать associated request alive, если страница, инициировавшая его, выгружается до завершения request.

Browser Support:

  • Chrome: long-standing support
  • Firefox: версия 133+ (ноябрь 2024) — достигнут baseline status ⭐
  • Safari: поддерживается в recent versions
  • Edge: Chromium-based support

Syntax:

javascript
fetch(url, {
    method: 'POST',
    body: data,
    keepalive: true,
});

Key Features:

  • Same not-cancelable характеристики как sendBeacon
  • Может использовать HTTP методы кроме POST
  • Может кастомизировать request properties
  • Доступ к server response через Promise
  • Работает с page unload events

Advantages Over sendBeacon():

  • ✅ Более гибкие HTTP методы
  • ✅ Полная поддержка fetch options
  • ✅ Response handling capability
  • ✅ Лучше для complex use cases

Use Cases:

  • Analytics data transmission
  • Session end reporting
  • User activity tracking
  • Error logging на page exit

Практический пример:

javascript
// Analytics beacon при page unload
window.addEventListener('unload', () => {
    const analyticsData = {
        sessionId: getCurrentSessionId(),
        timestamp: Date.now(),
        pageViews: getPageViews(),
        events: getTrackedEvents(),
    };

    fetch('/api/analytics/session-end', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
        },
        body: JSON.stringify(analyticsData),
        keepalive: true, // ✅ Гарантирует отправку даже после unload
    }).catch((err) => {
        // Errors могут не попасть в logs из-за page unload
        console.error('Analytics beacon failed:', err);
    });
});

// Core Web Vitals reporting
const reportWebVitals = (metric) => {
    const body = JSON.stringify(metric);

    // Используем keepalive для надёжной отправки метрик
    if (navigator.sendBeacon) {
        navigator.sendBeacon('/api/web-vitals', body);
    } else {
        fetch('/api/web-vitals', {
            method: 'POST',
            body,
            keepalive: true,
            headers: {
                'Content-Type': 'application/json',
            },
        });
    }
};

// Интеграция с web-vitals library
import { onCLS, onFID, onLCP } from 'web-vitals';

onCLS(reportWebVitals);
onFID(reportWebVitals);
onLCP(reportWebVitals);

Сравнение keepalive vs sendBeacon:

Featurefetch + keepalivesendBeacon
HTTP methodsGET, POST, PUT, DELETE, etc.Только POST
Custom headers✅ Да❌ Ограничено
Response access✅ Да (Promise)❌ Нет
Browser supportШирокая (2024)Универсальная
Size limit~64KB~64KB
Guaranteed delivery✅ Да✅ Да

Firefox 133 Implementation (ноябрь 2024):

  • Экспериментальная feature за флагом dom.fetchKeepalive.enabled
  • Alternative к Navigator.sendBeacon() с дополнительной гибкостью
  • Часть broader Fetch API alignment

Источники:

3.2 Request and Response bytes() Method ​

Статус: Baseline Newly Available (ноябрь 2024) — Chrome 132 ⭐

Назначение: Новый метод bytes(), добавленный к Request и Response интерфейсам, возвращает promise, resolving с Uint8Array, улучшая ergonomics получения binary body data.

Browser Support:

  • Chrome: версия 132 (Beta 13 ноября 2024) ⭐
  • Firefox: доступно в recent versions
  • Safari: доступно в Safari 18.0+
  • Edge: Chromium версия 132+

Why It Was Added: Хотя Request и Response имеют метод arrayBuffer(), вы не можете читать напрямую из buffer — необходимо создать view, такой как Uint8Array. Метод bytes() устраняет этот extra step.

Syntax:

javascript
// Старый способ
const buffer = await response.arrayBuffer();
const bytes = new Uint8Array(buffer);

// Новый способ
const bytes = await response.bytes();

Также добавлен к:

  • Request interface
  • Response interface
  • Blob interface
  • PushMessageData interface

Практические примеры:

javascript
// Обработка binary image data
async function processImage(imageUrl) {
    const response = await fetch(imageUrl);
    const bytes = await response.bytes();

    // Прямая работа с binary data
    console.log('Image size:', bytes.length, 'bytes');

    // Проверка image signature (JPEG)
    if (bytes[0] === 0xff && bytes[1] === 0xd8) {
        console.log('Valid JPEG image');
    }

    return bytes;
}

// Криптографические операции
async function hashData(url) {
    const response = await fetch(url);
    const bytes = await response.bytes();

    // Используем Web Crypto API
    const hashBuffer = await crypto.subtle.digest('SHA-256', bytes);
    const hashArray = Array.from(new Uint8Array(hashBuffer));
    const hashHex = hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');

    return hashHex;
}

// Protocol parsing
async function parseCustomProtocol(url) {
    const response = await fetch(url);
    const bytes = await response.bytes();

    // Парсинг custom binary protocol
    const header = {
        magic: (bytes[0] << 8) | bytes[1],
        version: bytes[2],
        flags: bytes[3],
    };

    const payload = bytes.slice(4);

    return { header, payload };
}

// WebAssembly module loading
async function loadWasmModule(url) {
    const response = await fetch(url);
    const bytes = await response.bytes();

    // Компиляция WebAssembly module
    const module = await WebAssembly.compile(bytes);
    return module;
}

Use Cases:

  • Binary data processing
  • Image manipulation
  • File handling
  • Protocol parsing
  • Cryptographic operations
  • WebAssembly module loading

Specification: Следует принципу, что APIs должны generally предоставлять byte buffers как Uint8Arrays.

Источники:

3.3 fetchLater API (Origin Trial) ​

Статус: Chrome Origin Trial (январь - сентябрь 2024)

Назначение: Proposal для замены сложности поддержания requests alive во время page unload single API call. Просит браузер гарантировать, что request будет сделан в какой-то момент в будущем, даже если страница закрыта.

Browser Support:

  • Chrome: версия 121+ (Origin Trial до 3 сентября 2024)
  • Firefox: не поддерживается
  • Safari: не поддерживается
  • Edge: Chromium-based origin trial support

Syntax:

javascript
fetchLater(url, {
    method: 'POST',
    body: analyticsData,
    activateAfter: 60000, // milliseconds
});

Key Features:

  • activateAfter опция: Fire request после timeout или когда page unloads, whichever приходит первым
  • Нет необходимости использовать keepalive flag explicitly
  • Браузер гарантирует delivery даже если page закрыта

Advantages Over sendBeacon():

  • ✅ Поддерживает HTTP методы кроме POST
  • ✅ Может кастомизировать request properties
  • ✅ Доступ к server response через fetch Promise fulfillment
  • ✅ Более гибкий, чем Navigator.sendBeacon()

Current Limitations:

  • ⚠️ Ещё не доступен в service workers
  • ⚠️ Не будет beacon после browser crash
  • ⚠️ Всё ещё в experimental/origin trial phase

Use Cases:

  • Analytics beacons
  • Core Web Vitals reporting
  • Error logging
  • Session data transmission на page unload

Практический пример:

javascript
// Long-running session tracking
function startSessionTracking() {
    const sessionId = generateSessionId();
    const startTime = Date.now();

    // Beacon будет отправлен через 5 минут или при page unload
    fetchLater('/api/session-tracking', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
        },
        body: JSON.stringify({
            sessionId,
            startTime,
            events: captureEvents(),
        }),
        activateAfter: 5 * 60 * 1000, // 5 minutes
    });
}

// A/B test completion tracking
function trackABTestCompletion(variantId) {
    fetchLater('/api/ab-test/complete', {
        method: 'POST',
        body: JSON.stringify({
            variantId,
            timestamp: Date.now(),
            metrics: collectMetrics(),
        }),
        activateAfter: 0, // Send immediately on unload
    });
}

Источники:

4. Service Workers — Static Routing API ​

4.1 Service Worker Static Routing API ​

Статус: Shipped в Chrome 123 (март 2024), после origin trial с Chrome 116 ⭐

Назначение: Declarative API для спецификации того, как определённые resource paths должны быть fetched, bypassing service worker execution для specific routes для улучшения performance.

Browser Support:

  • Chrome: версия 123+ (март 2024) ⭐
  • Edge: Chromium версия 123+
  • Firefox: не поддерживается
  • Safari: Interest expressed, WPT testing в процессе (сентябрь 2024)

API Syntax:

javascript
addEventListener('install', (event) => {
    event.addRoutes({
        condition: {
            urlPattern: '/api/*',
            requestMethod: 'GET',
        },
        source: 'network',
    });
});

Condition Properties:

  • urlPattern: URLPattern instance или string
  • requestMethod: HTTP method (GET, POST, и т.д.)
  • requestMode: Request mode type
  • requestDestination: Resource destination type
  • runningStatus: "running" или "not-running"

Source Options:

  • "network": Bypass cache, fetch from network
  • "cache": Use cached responses (optional cacheName)
  • "fetch-event": Run through service worker handlers
  • "race-network-and-fetch-handler": Race network против handlers

Performance Benefits:

  • ✅ Избегает запуска ServiceWorker для static assets
  • ✅ Устраняет JavaScript execution overhead
  • ✅ Reduces navigation delays
  • ✅ Improves battery life (less CPU usage)

Практические примеры:

javascript
// 1. Network bypass для POST requests
addEventListener('install', (event) => {
    event.addRoutes([
        {
            condition: {
                urlPattern: '/api/write/*',
                requestMethod: 'POST',
            },
            source: 'network',
        },
    ]);
});

// 2. Cache-specific images
addEventListener('install', (event) => {
    event.addRoutes([
        {
            condition: {
                or: [{ urlPattern: '*.png' }, { urlPattern: '*.jpg' }, { urlPattern: '*.webp' }],
            },
            source: {
                cacheName: 'images-cache',
            },
        },
    ]);
});

// 3. Race network vs service worker
addEventListener('install', (event) => {
    event.addRoutes([
        {
            condition: {
                urlPattern: '/api/data/*',
                requestMethod: 'GET',
            },
            source: 'race-network-and-fetch-handler',
        },
    ]);
});

// 4. Complex routing logic
addEventListener('install', (event) => {
    event.addRoutes([
        // Static assets всегда из cache
        {
            condition: {
                or: [{ urlPattern: '/static/*' }, { urlPattern: '/assets/*' }],
            },
            source: 'cache',
        },
        // API calls всегда из network
        {
            condition: {
                urlPattern: '/api/*',
            },
            source: 'network',
        },
        // HTML pages через service worker (для offline support)
        {
            condition: {
                urlPattern: '/*.html',
            },
            source: 'fetch-event',
        },
    ]);
});

DevTools Integration:

  • Registered rules видимы в chrome://serviceworker-internals
  • Rules показаны в DevTools Application panel
  • Matched rules указаны в Network panel size field

Deprecation Note: Старый метод registerRouter() deprecated и удалён в Chrome 125.

Safari Status (сентябрь 2024):

  • Apple выразил support в 2023
  • Ближе к implementing feature
  • Интерес к Web Platform Tests (WPTs) и live website testing

Источники:

5. WebTransport — низколатентные соединения ​

5.1 WebTransport API Status ​

Статус: Доступен в Chrome и Firefox (limited Safari support)

Назначение: Low-latency, bidirectional communication через HTTP/3, intended как modern alternative к WebSockets для real-time приложений.

Browser Support (2024):

  • Chrome/Chromium: полная поддержка (версия 97+)
  • Edge: Chromium-based support
  • Firefox: версия 115+ (полная поддержка)
  • Safari: не поддерживается ни в одной версии
    • Может быть включён в developer menu для experimental features
    • Work in progress
  • Opera: поддерживается в recent versions

Overall Compatibility Score: 63 (отражает отсутствие поддержки Safari)

Key Features:

  • ✅ Built на HTTP/3 (QUIC protocol)
  • ✅ Multiple streams в single connection
  • ✅ Unordered delivery опция
  • ✅ Ниже latency, чем WebSockets
  • ✅ Both reliable и unreliable transport modes

Use Cases:

  • Gaming (low-latency multiplayer)
  • Live streaming
  • Real-time collaboration tools
  • IoT приложения
  • Cloud gaming

API Example:

javascript
// Установление WebTransport соединения
const transport = new WebTransport('https://example.com/webtransport');
await transport.ready;

console.log('WebTransport connection established');

// Bidirectional stream
const stream = await transport.createBidirectionalStream();
const writer = stream.writable.getWriter();
const reader = stream.readable.getReader();

// Отправка данных
await writer.write(new Uint8Array([1, 2, 3]));

// Получение данных
const { value, done } = await reader.read();
console.log('Received:', value);

// Datagram для unreliable delivery
const datagramWriter = transport.datagrams.writable.getWriter();
await datagramWriter.write(new Uint8Array([42]));

Практический пример — Real-time Gaming:

javascript
class GameClient {
    constructor(serverUrl) {
        this.serverUrl = serverUrl;
        this.transport = null;
        this.reliableStream = null;
        this.datagramWriter = null;
    }

    async connect() {
        // Установить соединение
        this.transport = new WebTransport(this.serverUrl);
        await this.transport.ready;

        // Reliable stream для critical game state
        this.reliableStream = await this.transport.createBidirectionalStream();

        // Unreliable datagrams для position updates
        this.datagramWriter = this.transport.datagrams.writable.getWriter();

        // Слушать server messages
        this.listenToServer();
    }

    async listenToServer() {
        const reader = this.reliableStream.readable.getReader();

        while (true) {
            const { value, done } = await reader.read();
            if (done) break;

            const message = JSON.parse(new TextDecoder().decode(value));
            this.handleServerMessage(message);
        }
    }

    // Критическое game state через reliable stream
    async sendGameAction(action) {
        const writer = this.reliableStream.writable.getWriter();
        const data = JSON.stringify(action);
        await writer.write(new TextEncoder().encode(data));
        writer.releaseLock();
    }

    // Position updates через unreliable datagrams
    async sendPositionUpdate(x, y, z) {
        const buffer = new ArrayBuffer(12);
        const view = new Float32Array(buffer);
        view[0] = x;
        view[1] = y;
        view[2] = z;

        await this.datagramWriter.write(new Uint8Array(buffer));
    }

    handleServerMessage(message) {
        switch (message.type) {
            case 'gameState':
                this.updateGameState(message.data);
                break;
            case 'playerJoined':
                this.addPlayer(message.data);
                break;
            case 'playerLeft':
                this.removePlayer(message.data);
                break;
        }
    }
}

// Usage
const gameClient = new GameClient('https://game-server.example.com/transport');
await gameClient.connect();

// Отправить game action (reliable)
await gameClient.sendGameAction({
    type: 'attack',
    target: 'enemy-123',
});

// Отправить position update (unreliable)
setInterval(() => {
    const position = getPlayerPosition();
    gameClient.sendPositionUpdate(position.x, position.y, position.z);
}, 50); // 20 updates per second

Technical Details:

  • Требует HTTP/3 support на сервере
  • Использует QUIC transport protocol
  • Multiplexed streams избегают head-of-line blocking
  • Может отправлять datagrams для unreliable delivery

Источники:

6. WebSockets — улучшения API ​

6.1 WebSocketStream API ​

Статус: Shipped в Chrome 124 (16 апреля 2024) ⭐

Назначение: Интеграция WHATWG Streams с WebSocket API, resolving недостатки путём добавления backpressure support через streams integration.

Browser Support:

  • Chrome: версия 124+ (16 апреля 2024) ⭐
  • Edge: Chromium версия 124+
  • Firefox: не поддерживается
  • Safari: не поддерживается

Problem Solved: Traditional WebSocket API lacks ergonomic backpressure handling, означая, что приложения не могут легко handle ситуации, когда incoming data превышает processing capacity.

Key Advantage: Backpressure можно применить "for free" без extra cost, enabling приложениям naturally throttle data flow.

API Example:

javascript
const wss = new WebSocketStream(WSS_URL);
const { readable, writable } = await wss.opened;

const reader = readable.getReader();
const writer = writable.getWriter();

while (true) {
    const { value, done } = await reader.read();
    if (done) break;

    const result = await process(value);
    await writer.write(result);
}

Key Features:

  • ReadableStream: Доступ через readable.getReader() для consuming messages
  • WritableStream: Доступ через writable.getWriter() для sending messages
  • Automatic backpressure: Built-in flow control
  • Promise-based: Modern async/await patterns

Практический пример — Real-time Data Processing:

javascript
class StreamingDataProcessor {
    constructor(url) {
        this.url = url;
        this.wss = null;
    }

    async connect() {
        console.log('Connecting to', this.url);
        this.wss = new WebSocketStream(this.url);

        const { readable, writable, extensions, protocol } = await this.wss.opened;

        console.log('Connected!', { extensions, protocol });

        // Start processing incoming data
        this.processIncoming(readable);

        // Start sending outgoing data
        this.processSendQueue(writable);
    }

    async processIncoming(readable) {
        const reader = readable.getReader();

        try {
            while (true) {
                const { value, done } = await reader.read();

                if (done) {
                    console.log('Stream closed by server');
                    break;
                }

                // Backpressure автоматически applied here
                // Если processing медленный, reader.read() не вернётся
                // пока не освободится buffer space
                await this.handleIncomingMessage(value);
            }
        } catch (error) {
            console.error('Error processing stream:', error);
        } finally {
            reader.releaseLock();
        }
    }

    async handleIncomingMessage(message) {
        // Simulate expensive processing
        const data = JSON.parse(message);

        if (data.type === 'heavy-computation') {
            // Это может занять время
            await this.performHeavyComputation(data.payload);
        }

        // Automatic backpressure:
        // Пока эта async function выполняется, reader.read() выше
        // не получит следующее message, предотвращая memory overflow
    }

    async processSendQueue(writable) {
        const writer = writable.getWriter();

        try {
            while (this.hasMessagesToSend()) {
                const message = await this.getNextMessage();

                // Backpressure для outgoing messages
                await writer.write(message);
            }
        } catch (error) {
            console.error('Error writing to stream:', error);
        } finally {
            writer.releaseLock();
        }
    }

    async close(code = 1000, reason = 'Normal closure') {
        this.wss.close({ code, reason });
        await this.wss.closed;
        console.log('Connection closed');
    }
}

// Usage
const processor = new StreamingDataProcessor('wss://api.example.com/stream');
await processor.connect();

Closing Connection:

javascript
wss.close({
    code: 1000,
    reason: 'Normal closure',
});
await wss.closed; // Wait для closure confirmation

Use Cases:

  • High-throughput data streaming
  • Real-time data processing с flow control
  • Приложения чувствительные к memory pressure
  • Scenarios требующие precise control над data flow

Baseline Status: Не ещё Baseline (Chrome-only по состоянию на 2024)

Источники:

6.2 WebSocket Constructor Enhancement (Chrome 125 Beta) ​

Статус: Chrome 125 Beta (май 2024)

Что изменилось: WebSocket constructor теперь принимает HTTP(S) URLs в дополнение к WS/WSS URLs, enabling использование relative URLs.

Implementation: HTTP(s) schemes нормализуются к ws: и wss: internal schemes.

Example:

javascript
// Теперь поддерживается
const ws = new WebSocket('https://example.com/socket');
const ws2 = new WebSocket('/socket'); // Relative URL

// Internally нормализовано к
// wss://example.com/socket
// ws(s)://current-origin/socket

Impact: Упрощает WebSocket URL construction, позволяет relative URLs, better developer experience.

Источник:

7. Resource Loading и Performance APIs ​

7.1 Speculation Rules API ​

Статус: Chrome/Edge only (не ещё Baseline)

Назначение: Declarative API для спецификации prefetch и prerender rules, позволяя браузерам speculate, какие страницы пользователи могут navigate к next.

Browser Support (2024):

  • Chrome: полная поддержка (Desktop и Android)
  • Edge: Chromium-based support
  • Opera: Chromium-based support
  • Firefox: не поддерживается
  • Safari: не поддерживается

Ключевые обновления 2024:

Chrome 121 (январь 2024):

  • Добавлена поддержка document rules — расширение, позволяющее браузеру получать URLs для speculative loading из page elements ⭐
  • Может быть указано используя Speculation-Rules HTTP header
  • Automatic link finding: Браузер может автоматически discover links для prerender
  • Eagerness field: Контроль когда speculation происходит

Chrome 122 (февраль 2024):

  • Добавлена eagerness опция с уровнями:
    • eager: Speculate сразу
    • moderate: Speculate на hover (200ms)
    • conservative: Speculate на mouse/touch down

Desktop Rollout (сентябрь 2024):

  • Prefetching используя Speculation Rules rolled out к desktop
  • Previously enabled на Android с октября 2022

Syntax Examples:

html
<!-- List rules (specific URLs) -->
<script type="speculationrules">
    {
        "prerender": [
            {
                "urls": ["/product/123", "/product/456"],
                "eagerness": "eager"
            }
        ],
        "prefetch": [
            {
                "urls": ["/api/recommendations"],
                "eagerness": "moderate"
            }
        ]
    }
</script>

<!-- Document rules (automatic link finding) -->
<script type="speculationrules">
    {
        "prerender": [
            {
                "where": {
                    "href_matches": "/products/*"
                },
                "eagerness": "moderate"
            }
        ],
        "prefetch": [
            {
                "where": {
                    "and": [
                        { "href_matches": "/articles/*" },
                        { "selector_matches": ".high-priority" }
                    ]
                },
                "eagerness": "eager"
            }
        ]
    }
</script>

HTTP Header:

http
Speculation-Rules: "/speculation-rules.json"

Eagerness Levels:

  • immediate/eager: Prefetch/prerender immediately
  • moderate: На pointer hover (200ms delay)
  • conservative: На pointer down (click/tap)

Prerender vs Prefetch:

FeaturePrerenderPrefetch
Downloads resources✅ Да✅ Да
Renders page✅ Да❌ Нет
JavaScript execution✅ Да❌ Нет
Navigation speedInstantFast
Resource usageHighLow

Практический пример — E-commerce Site:

html
<!DOCTYPE html>
<html>
    <head>
        <title>Product Listing</title>

        <!-- Speculation Rules для product pages -->
        <script type="speculationrules">
            {
                "prerender": [
                    {
                        "where": {
                            "and": [
                                { "href_matches": "/product/*" },
                                { "selector_matches": ".product-card a" }
                            ]
                        },
                        "eagerness": "moderate"
                    }
                ],
                "prefetch": [
                    {
                        "urls": ["/api/cart", "/api/user/preferences"],
                        "eagerness": "eager"
                    }
                ]
            }
        </script>
    </head>
    <body>
        <div class="product-grid">
            <div class="product-card">
                <a href="/product/laptop-123">
                    <img src="/images/laptop.jpg" alt="Laptop" />
                    <h3>Premium Laptop</h3>
                </a>
            </div>
            <!-- Когда пользователь hovers 200ms над ссылкой,
            браузер prerender /product/laptop-123 -->
        </div>
    </body>
</html>

DevTools Support:

  • Debug speculation rules с Chrome DevTools
  • View registered rules в Application panel
  • Network panel показывает speculative requests

Use Cases:

  • ✅ E-commerce product pages
  • ✅ Article websites (news, blogs)
  • ✅ Multi-step forms
  • ✅ Search result pages
  • ✅ Documentation sites

Google Search Usage: Google Search использует speculation rules для instant page loads.

Источники:

7.2 Largest Contentful Paint API (Firefox 122) ​

Статус: Добавлен в Firefox 122 (январь 2024) ⭐

Назначение: Performance timing tool предоставляющий timing информацию о largest image или text paint до того, как users взаимодействуют с web page.

Browser Support:

  • Chrome: поддерживается
  • Firefox: версия 122+ (январь 2024) ⭐
  • Safari: support status varies
  • Edge: Chromium-based support

Use Cases:

  • Core Web Vitals measurement
  • Page load performance optimization
  • User experience monitoring
  • Performance budgeting

LCP Threshold:

  • Good: 2.5 seconds или менее
  • Needs Improvement: 2.5-4.0 seconds
  • Poor: Более 4.0 seconds

Практический пример:

javascript
// Monitoring LCP с PerformanceObserver
const observer = new PerformanceObserver((list) => {
    const entries = list.getEntries();
    const lastEntry = entries[entries.length - 1];

    console.log('LCP:', lastEntry.renderTime || lastEntry.loadTime);
    console.log('LCP element:', lastEntry.element);

    // Отправить LCP metric к analytics
    sendToAnalytics({
        name: 'LCP',
        value: lastEntry.renderTime || lastEntry.loadTime,
        element: lastEntry.element.tagName,
        url: lastEntry.url,
    });
});

observer.observe({ type: 'largest-contentful-paint', buffered: true });

// Используя web-vitals library
import { onLCP } from 'web-vitals';

onLCP((metric) => {
    console.log('LCP metric:', metric);
    // metric.value содержит LCP в milliseconds

    // Классифицировать performance
    if (metric.value <= 2500) {
        console.log('✅ Good LCP');
    } else if (metric.value <= 4000) {
        console.log('⚠️ Needs improvement');
    } else {
        console.log('❌ Poor LCP');
    }
});

Источник:

8. HTTPS Upgrade — автоматическое поведение ​

8.1 HTTPS Upgrade Automatic Behavior (2024) ​

Статус: Implemented во всех major browsers к 2024

Chrome:

  • Автоматически upgrades к HTTPS connections даже для http:// links
  • Использует 307 internal redirect (visible в DevTools Network panel)
  • Rolled out universally ко всем Chrome users в 2024
  • Falls back к HTTP если HTTPS unavailable

Safari 18.2 (11 декабря 2024) ⭐:

  • Введена automatic HTTPS upgrade functionality
  • Safari пытается HTTPS первым (HTTPS by default)
  • Falls back к HTTP если secure page load fails
  • НЕ применяется к URLs entered в address bar
  • Всё behaviour происходит automatically
  • Optional "Not Secure Connection Warning" может быть enabled

Firefox:

  • HTTPS-only mode доступен в private browsing по умолчанию
  • Similar HTTPS upgrade с HTTP fallback механизмом
  • Может быть enabled для normal browsing

General Status: Major browsers теперь offer native support для HTTPS-only mode, устраняя необходимость расширений как HTTPS Everywhere.

Практические implications:

javascript
// Старый подход (не нужен больше)
if (location.protocol !== 'https:') {
    location.replace(`https:${location.href.substring(location.protocol.length)}`);
}

// Новый подход — браузер handles автоматически
// Просто убедитесь, что ваш сервер поддерживает HTTPS

Источники:

8.2 Mixed Content Auto-Upgrade (Safari 18.0) ​

Статус: Shipped в Safari 18.0 (16 сентября 2024) ⭐

Что изменилось: Safari 18.0 теперь automatically upgrades passive subresource requests к HTTPS. Все images и media теперь auto-upgraded к HTTPS, в adherence с Mixed Content Level 2.

Impact: Images, video, и audio files served через HTTP на HTTPS pages transparently upgraded к secure connections, improving security без breaking existing sites.

Related Fixes в Safari 18.0:

  • Fixed upgrading inactive или passive subresource requests в would-be mixed security contexts
  • Fixed incorrect Sec-Fetch-Site value для navigation nested document
  • Fixed Timing-Allow-Origin не применяться к HTTP 302 response

Specification: Mixed Content Level 2

Источник:

Часть 2: Security и Privacy ​

1. Third-Party Cookies — великий разворот 2024 года ​

1.1 Timeline событий ​

4 января 2024: Chrome ограничил third-party cookies для 1% пользователей как часть Privacy Sandbox testing.

Original Plan: Chrome планировал ramp up third-party cookie restrictions к 100% пользователей с Q3 2024, subject к addressing competition concerns от UK's Competition and Markets Authority (CMA).

22 июля 2024: Google официально объявил, что НЕ будет phase out third-party cookies на Chrome как originally planned. Это представляет major policy reversal. ⭐⭐⭐

Новый подход: Вместо deprecating third-party cookies, Google ввёл new experience в Chrome, позволяющее людям сделать informed choice, применяемый across их web browsing.

1.2 Причины разворота ​

  • CMA Review: UK's Competition and Markets Authority needed sufficient time для review evidence, включая industry test results к концу июня
  • Advertising Industry Pushback: Significant pushback от advertising industry
  • Economic Disruption Concerns: Publishers могли потерять average 60% их revenue от Google Chrome
  • Industry Readiness Issues: Индустрия не была готова к transition

1.3 Current Status (2025) ​

Third-party cookies остаются enabled by default в Chrome. Privacy Sandbox initiative остаётся в place, но shifted от being cookie replacement к being privacy enhancement option, coexisting с traditional cookies.

Implications для индустрии:

  • ✅ Third-party cookies продолжат работать indefinitely
  • ✅ Privacy Sandbox APIs остаются available (Topics, Protected Audience, Attribution Reporting)
  • ⚠️ Developers должны всё ещё prepare для eventual privacy-first future
  • ⚠️ Other browsers (Firefox, Safari) продолжают блокировать third-party cookies

Источники:

2. Постквантовая криптография — новая эра безопасности ​

2.1 Chrome 124: X25519Kyber768 (апрель 2024) ​

Статус: Enabled by default на всех desktop platforms ⭐

Назначение: Защита network traffic от Chrome с серверами, также supporting ML-KEM от decryption future quantum computers. Defends против "store now decrypt later" attacks, где future quantum computers могли decrypt encrypted traffic recorded today.

Technical Details:

  • Implements X25519Kyber768 key encapsulation mechanism
  • Based на NIST standard (ML-KEM)
  • Hybrid approach: Combines classical и post-quantum algorithms
  • Backwards compatible с servers не supporting post-quantum crypto

Browser Support: Chrome 124+ на всех desktop platforms

Источники:

2.2 Chrome 131: Финальный ML-KEM Standard (ноябрь 2024) ​

Статус: Upgraded к final ML-KEM standard ⭐⭐

Что изменилось: Switched от X25519Kyber768 к final standard version ML-KEM, NIST-standardized версии post-quantum cryptography.

Timeline:

  • Chrome 124 (апрель 2024): Interim standard (X25519Kyber768)
  • Chrome 131 (ноябрь 2024): Final NIST standard (ML-KEM)

Enterprise Policy:

  • PostQuantumKeyAgreementEnabled policy available через конец 2024
  • Long term: Post-quantum secure ciphers будут required в TLS

Impact:

  • ✅ Защита от quantum computer attacks на encrypted communications
  • ✅ Future-proof security для sensitive data
  • ✅ Seamless для end users (no configuration needed)
  • ⚠️ Increased CPU usage на servers (криптография в userspace)

Практический пример — Server Configuration:

nginx
# Nginx configuration для post-quantum support
# (Requires BoringSSL или OpenSSL 3.3+ с ML-KEM support)

ssl_protocols TLSv1.3;
ssl_ciphers TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256;

# Enable post-quantum key exchange
ssl_conf_command Options KTLS;

# Prefer server cipher suite order
ssl_prefer_server_ciphers on;

Источники:

3. Authentication и Credentials — passkeys mainstream ​

3.1 WebAuthn и Passkeys — массовое внедрение ​

Major 2024 Updates:

Microsoft WebAuthn API Updates (24 ноября 2024) ⭐:

  • Enhanced support для passwordless authentication
  • Third-party passkey plugin support (1Password, Bitwarden)
  • Available в Windows 11 Preview Build 22635.4515 для Windows Insiders

Microsoft Authenticator Revamp (октябрь 2024):

  • Simplified passkey setup process (responding к feedback о complexity)

Enterprise Changes (январь 2025):

  • Microsoft requiring enterprises using FIDO2 policies без key restrictions adopt passkeys
  • Challenges для organizations dependent на traditional authentication

WebAuthn Level 3:

  • Currently в editor's draft
  • Expected around конец 2024

Browser/Platform Support:

  • Chrome/Android: Continuous FIDO2 и WebAuthn advancements
  • Apple iCloud Keychain: Integrated passkey support
  • Android: FIDO2 support added к brokered apps (e.g., Microsoft Teams)

Adoption Statistics ⭐:

  • 20% из world's top 100 websites support passkeys
  • 12% из top 250 websites support passkeys
  • 13 billion accounts able к leverage passkeys
  • Over 1 billion authentications через 400 million Google Accounts (по состоянию на май 2024)

Key Relationship:

  • FIDO2 это standard; passkeys это implementation
  • FIDO2 components: WebAuthn и CTAP
  • WebAuthn covers browser API managing passkeys

Практический пример:

javascript
// Регистрация passkey
async function registerPasskey() {
    // Получить challenge от сервера
    const challengeResponse = await fetch('/api/auth/register/begin', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({ username: 'user@example.com' }),
    });

    const options = await challengeResponse.json();

    // Создать credential
    const credential = await navigator.credentials.create({
        publicKey: {
            challenge: base64ToArrayBuffer(options.challenge),
            rp: {
                name: 'Example Corp',
                id: 'example.com',
            },
            user: {
                id: base64ToArrayBuffer(options.user.id),
                name: options.user.name,
                displayName: options.user.displayName,
            },
            pubKeyCredParams: [
                { type: 'public-key', alg: -7 }, // ES256
                { type: 'public-key', alg: -257 }, // RS256
            ],
            authenticatorSelection: {
                authenticatorAttachment: 'platform', // platform authenticator (device)
                requireResidentKey: true,
                userVerification: 'required',
            },
            timeout: 60000,
        },
    });

    // Отправить credential к серверу
    await fetch('/api/auth/register/complete', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
            credential: {
                id: credential.id,
                rawId: arrayBufferToBase64(credential.rawId),
                response: {
                    clientDataJSON: arrayBufferToBase64(credential.response.clientDataJSON),
                    attestationObject: arrayBufferToBase64(credential.response.attestationObject),
                },
                type: credential.type,
            },
        }),
    });
}

// Аутентификация с passkey
async function authenticateWithPasskey() {
    // Получить challenge от сервера
    const challengeResponse = await fetch('/api/auth/login/begin', {
        method: 'POST',
    });

    const options = await challengeResponse.json();

    // Get credential
    const credential = await navigator.credentials.get({
        publicKey: {
            challenge: base64ToArrayBuffer(options.challenge),
            rpId: 'example.com',
            allowCredentials: [], // Empty для autofill
            userVerification: 'required',
            timeout: 60000,
        },
        mediation: 'conditional', // Enables autofill UI
    });

    // Отправить credential к серверу
    const loginResponse = await fetch('/api/auth/login/complete', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
            credential: {
                id: credential.id,
                rawId: arrayBufferToBase64(credential.rawId),
                response: {
                    clientDataJSON: arrayBufferToBase64(credential.response.clientDataJSON),
                    authenticatorData: arrayBufferToBase64(credential.response.authenticatorData),
                    signature: arrayBufferToBase64(credential.response.signature),
                    userHandle: arrayBufferToBase64(credential.response.userHandle),
                },
                type: credential.type,
            },
        }),
    });

    const result = await loginResponse.json();
    if (result.success) {
        console.log('✅ Authenticated successfully');
    }
}

Источники:

3.2 FedCM (Federated Credential Management) ​

2024 Migration ⭐:

  • Апрель 2024: GIS developers automatically migrated к FedCM API
  • GIS began migrating websites без cross-origin iframe/CSP issues к FedCM на Chrome
  • Июль 2024: Migration websites с cross-origin iframe/CSP issues
  • Октябрь 2024: Все One Tap traffic migration к FedCM

Key Features Added:

  • Auto-reauthentication: Users могут reauthenticate automatically на return
  • Cross-origin iframe support: Теперь available (embedder должен specify Permissions-Policy: identity-credentials-get)
  • Login Status API: Mechanism для websites (especially IdPs) inform browser user's login status (required для FedCM)

Browser Support:

  • Chrome: Shipped в Chrome 108
  • Firefox: Prototype implementation, initial prototype added late 2022
  • Safari/Apple: Expressed general support и interest

Status Post-Cookie Reversal:

  • Google continues FedCM investment independent от third-party cookie changes
  • Migration continues as scheduled

Практический пример:

javascript
// Federated sign-in с FedCM
async function federatedSignIn() {
    try {
        // Request identity credential
        const credential = await navigator.credentials.get({
            identity: {
                providers: [
                    {
                        configURL: 'https://idp.example.com/fedcm.json',
                        clientId: 'client_id_from_idp',
                        nonce: generateNonce(),
                    },
                ],
            },
        });

        // Отправить token к backend
        const response = await fetch('/api/auth/fedcm', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({
                token: credential.token,
            }),
        });

        const result = await response.json();
        console.log('✅ Signed in:', result.user);
    } catch (error) {
        console.error('FedCM sign-in failed:', error);
    }
}

// Auto-reauthentication
async function autoReauth() {
    // FedCM может automatically reauthenticate
    // если user previously signed in
    const credential = await navigator.credentials.get({
        identity: {
            providers: [
                {
                    configURL: 'https://idp.example.com/fedcm.json',
                    clientId: 'client_id_from_idp',
                },
            ],
        },
        mediation: 'optional', // Allows auto-signin
    });

    if (credential) {
        console.log('✅ Auto-reauthenticated');
    }
}

Источники:

4. Cookies и Storage — партиционирование и изоляция ​

4.1 CHIPS (Cookies Having Independent Partitioned State) ​

Статус 2024: Широкая поддержка в Chrome, постепенное внедрение в других браузерах

Chrome:

  • Supported by default в Chrome 114+ (май 2023)
  • Widely available Chrome 115+
  • Стабильная поддержка весь 2024

Firefox:

  • Все third-party cookies partitioned by default в ETP Strict mode и private browsing
  • Intent к prototype announced май 2024
  • Firefox 131: поддержка Partitioned attribute introduced ⭐

Safari:

  • Не implemented по состоянию на май 2024
  • Использует algorithmic approach через Intelligent Tracking Prevention (ITP)
  • Classifies cookies и limits/blocks third-party cookies automatically

Chromium-based Browsers:

  • Edge, Opera, Brave gained support around same time как Chrome
  • Specifics default activation и Dev Tools UI могут vary

Technical Details:

  • Cookies marked Partitioned double-keyed: by origin устанавливающим их И origin top-level page
  • Могут быть read только в контексте top-level site где they were set
  • Должны быть set с Secure attribute
  • Recommended: Use __Host- prefix

Syntax:

http
Set-Cookie: __Host-session=abc123; Secure; Path=/; SameSite=None; Partitioned

Практический пример — Embedded Service:

javascript
// Server-side (Node.js/Express)
// Embedded chat widget на multiple sites

app.post('/api/chat/init', (req, res) => {
    const sessionId = generateSessionId();
    const topLevelSite = req.headers.origin;

    // Set partitioned cookie
    res.cookie('__Host-chat-session', sessionId, {
        secure: true,
        httpOnly: true,
        sameSite: 'none',
        partitioned: true, // ✅ Partitioned by top-level site
        maxAge: 24 * 60 * 60 * 1000, // 24 hours
    });

    res.json({
        sessionId,
        message: 'Chat session initialized',
    });
});

// Каждый top-level site получит изолированный chat session
// Site A: __Host-chat-session=abc123 (partition A)
// Site B: __Host-chat-session=xyz789 (partition B)

Security Implications:

CHIPS — часть Privacy Sandbox initiative, направленной на отказ от third-party cookies при сохранении необходимой functionality. Partitioned cookies предотвращают cross-site tracking, так как каждый top-level site имеет свой isolated набор cookies для embedded content.

Diagram:

┌─────────────────────────────────────────┐
│  Top-level site: shop-a.example         │
│  ┌──────────────────────────────────┐   │
│  │ Embedded: payment-provider.com   │   │
│  │ Cookie: session=ABC (partition A)│   │
│  └──────────────────────────────────┘   │
└─────────────────────────────────────────┘

┌─────────────────────────────────────────┐
│  Top-level site: shop-b.example         │
│  ┌──────────────────────────────────┐   │
│  │ Embedded: payment-provider.com   │   │
│  │ Cookie: session=XYZ (partition B)│   │
│  └──────────────────────────────────┘   │
└─────────────────────────────────────────┘

Cookies изолированы между partitions — tracking невозможен

Источники:

4.2 Storage Access API ​

Назначение: Позволяет embedded content запросить доступ к third-party cookies privacy-preserving способом.

Browser Support и Различия (2024):

Chrome:

  • Shows prompts для всех embedded content без prior storage access
  • Automatically grants access если embedded content и embedding site часть same Related Website Set
  • Subsequent visits могут resolve без prompt/user interaction
  • Cookies должны use SameSite=None и Secure

Firefox:

  • Prompts только после threshold number site requests
  • Prompts skipped для known websites (interacted with на top level) для первых 5 attempts
  • Cookies defaulted к SameSite=None, не restricted к Secure cookies

Safari:

  • Shows prompts для всех embedded content без prior storage access
  • Always requires user interaction
  • Cookies defaulted к SameSite=None, не restricted к Secure cookies
  • Нет support для storage-access permission

Access Duration:

  • Grants phased out после 30 days browser usage без user interaction
  • Interaction extends limit другими 30 days

Практический пример:

javascript
// Embedded iframe requesting storage access
async function requestStorageAccess() {
    try {
        // Проверить, есть ли уже доступ
        const hasAccess = await document.hasStorageAccess();

        if (!hasAccess) {
            console.log('Requesting storage access...');

            // Request access (может показать prompt user)
            await document.requestStorageAccess();

            console.log('✅ Storage access granted');
        } else {
            console.log('✅ Already have storage access');
        }

        // Теперь можем использовать cookies
        fetch('/api/user-data', {
            credentials: 'include', // Включить cookies
        });
    } catch (error) {
        console.error('❌ Storage access denied:', error);
        // Handle fallback behavior
    }
}

// Request storage access на user interaction
document.getElementById('login-button').addEventListener('click', async () => {
    await requestStorageAccess();
    // Proceed с login flow
});

Источники:

5. Tracking Prevention — браузерные защиты ​

5.1 Bounce Tracking Protection ​

Назначение: Предотвратить tracking через redirect bounces, briefly navigating через tracking domain.

Browser Implementations (2024):

Safari:

  • First shipped в ITP 2.0
  • Expires/deletes storage на sites после client-detected bounce tracking
  • Нет interaction в течение 1-7 days triggers deletion
  • Использует algorithmic approach

Chrome:

  • Launched by default октябрь 2023 для users с third-party cookies blocked
  • Monitors navigations и flags sites часть "stateful bounce"
  • 45-day interaction window: Если нет user interaction и third-party cookies blocked, state deleted
  • Periodically examines flagged sites

Firefox:

  • Firefox 133 (26 ноября 2024): Added Bounce Tracking Protection ⭐
  • Только enabled для strict protection users
  • Closely follows Bounce Tracking Mitigations spec draft
  • Detects bounce trackers based на heuristics
  • 45-day interaction window

Key Differences:

BrowserInteraction WindowDetection MethodAvailability
Safari1-7 daysProprietary ITPВсе users
Chrome45 daysWeb standardCookie blockers
Firefox45 daysWeb standardStrict mode

Как работает Bounce Tracking:

Пользователь кликает ссылку на site-a.example
    ↓
Redirect через tracker.example (sets cookies, runs scripts)
    ↓
Final destination: site-b.example

Bounce Tracking Protection:
1. Detects tracker.example как bounce tracker
2. Если нет interaction с tracker.example в течение 45 days
3. Deletes все storage для tracker.example

Источники:

5.2 Firefox Enhanced Tracking Protection (ETP) ​

2024 Update ⭐:

  • Август 2024: Firefox plans блокировать even more third-party cookies starting 2024
  • New cookie partitioning и clearing mechanisms
  • Cookies won't stick around as long

Total Cookie Protection:

  • Rolled out by default ко всем Firefox users worldwide к 2024
  • Confines cookies к site где created
  • Prevents tracking companies от using cookies across sites
  • Avoids limitations list-based blocking путём restricting functionality для всех cookies

Global Privacy Control (GPC):

  • Built into Firefox
  • Sends clear signal: User не wish быть tracked или have data sold

Источники:

6. Privacy Sandbox APIs — статус после разворота cookies ​

6.1 Privacy Sandbox Status в 2024 ​

Major Update: Несмотря на cookie deprecation reversal, Privacy Sandbox APIs продолжили mature и generally available.

Official Statement: "The change в Privacy Sandbox direction does not impact Google Identity Service's investment в FedCM, seeing it как valuable для improving privacy, security и user experience federated sign-in experiences independently от any changes к third-party cookies."

6.2 Topics API ​

Статус: Generally available в Chrome Stable 115 (май 2023), continued maturity в 2024

Implementation Details:

  • Topics refreshed once per epoch (1 week в Chrome's implementation)
  • Manually curated для 50,000 top sites
  • Использует classifier model для topic assignment
  • Topics unique к каждому device (нет cross-device sharing)
  • Local storage only

2024 Feedback:

  • Topics API has low coverage (identified в Q4 2024 reporting period)
  • Questions и feedback received regarding Topics, Protected Audience, и Attribution Reporting APIs

Browser Support: Chrome only

Практический пример:

javascript
// Получить topics для user
async function getUserTopics() {
    if (!document.featurePolicy.allowsFeature('browsing-topics')) {
        console.log('Topics API не доступен');
        return [];
    }

    try {
        const topics = await document.browsingTopics();

        console.log('User topics:', topics);
        // topics это array объектов:
        // [
        //   { value: 123, taxonomyVersion: "1", modelVersion: "2" },
        //   { value: 456, taxonomyVersion: "1", modelVersion: "2" }
        // ]

        return topics;
    } catch (error) {
        console.error('Topics API error:', error);
        return [];
    }
}

// Использовать topics для ad targeting
async function showRelevantAds() {
    const topics = await getUserTopics();

    if (topics.length > 0) {
        // Fetch ads based на topics
        const response = await fetch('/api/ads', {
            method: 'POST',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ topics }),
        });

        const ads = await response.json();
        displayAds(ads);
    } else {
        // Fallback к contextual ads
        showContextualAds();
    }
}

Источники:

6.3 Protected Audience API (formerly FLEDGE) ​

2024 Enhancements:

  • Updates к interest group fields accommodate deal information (deal ID и seat ID) для private marketplaces
  • Transition away от event-level reporting announced (no sooner than 2026)
  • Requirement использовать Fenced Frames (effective no sooner than 2026)

Industry Feedback:

  • Criteo's 2024 tests criticized functionality
  • IAB Tech Lab report claimed industry "isn't ready" для shift

Источники:

7. Browser-Specific Security Updates ​

7.1 Chrome Security Highlights 2024 ​

Chrome 124 (апрель 2024):

  • Post-Quantum Cryptography enabled by default ⭐⭐

Chrome 126 (июнь 2024):

  • Fixed 4 significant vulnerabilities
  • High-severity type confusion в V8 (CVE-2024-6100) — reported during TyphoonPWN 2024

Chrome 128 (август 2024):

  • 38 security vulnerabilities fixed
  • CVE-2024-7971: Being actively exploited в wild (Critical) ⭐
  • BREAKING CHANGE: Removed chrome://flag allowing users disable third-party storage partitioning

Chrome 129 (сентябрь 2024):

  • Upgraded Safety Check (runs automatically в background)
  • Easier opt-out unwanted website notifications
  • One-time website permissions
  • Automatic revocation permissions от sites flagged by Safe Browsing

Chrome 131 (ноябрь 2024):

  • Upgraded к final ML-KEM standard для post-quantum crypto ⭐⭐

Источники:

7.2 Firefox Security Highlights 2024 ​

Firefox 122 (январь 2024):

  • 15 vulnerabilities patched
  • 5 high-severity bugs
  • CVE-2024-0742: Failure update user input timestamp

Firefox 124 (март 2024):

  • 12 security defects patched
  • Critical-severity memory safety bugs (CVE-2024-2615) ⭐

Firefox 125 (апрель 2024):

  • CVE-2024-3302: Denial-of-service using HTTP/2 CONTINUATION frames (HTTP/2 Continuation Flood attack) ⭐

Firefox 127 (июнь 2024):

  • Mixed Content Upgrade: Starting Firefox 127, automatically upgrades audio, video, и image subresources от HTTP к HTTPS ⭐
  • 93% Firefox requests already HTTPS

Firefox 128 (июль 2024):

  • DTLS 1.3 Support: Firefox became first browser support DTLS 1.3, providing robust end-to-end encryption для real-time audio и video data ⭐

Firefox 133 (ноябрь 2024):

  • Bounce Tracking Protection added ⭐

Pwn2Own Response:

  • Mozilla achieved 21-hour fix time на Pwn2Own 2024
  • Earned industry award для fastest к patch

Источники:

7.3 Safari Security Highlights 2024 ​

Safari 17.3 (январь 2024):

  • 3 WebKit vulnerabilities patched
  • CVE-2024-23213: Processing malicious web content could lead к arbitrary code execution (may have been exploited) ⭐
  • CVE-2024-23211: Malicious webpage could fingerprint users

Safari 17.4 (март 2024):

  • CVE-2024-23254: Logic issue — malicious web content could prevent CSP enforcement
  • CVE-2024-23273: Processing web content could lead к denial-of-service

Safari 18.0 (сентябрь 2024):

  • Mixed Content Auto-Upgrade: HTTPS для всех images, video, audio ⭐
  • Distraction Control: Hide intrusive elements (popups, newsletter overlays)
  • AI-powered "Highlights": Automatically detect и highlight relevant page information
  • AV1 hardware decoding support
  • WasmGC: Enabled by default

WebKit Private Browsing 2.0 (июль 2024):

  • Advanced tracking и fingerprinting protection
  • Available во всех browsing modes на iOS, iPadOS, visionOS

Источники:

8. Deprecations и Removals ​

8.1 HTTP/2 Server Push Removal ​

Статус: Removed от major browsers

Firefox 132 (октябрь 2024) ⭐:

  • HTTP/2 Server Push deactivated by default
  • Preference network.http.http2.allow-push теперь set к false
  • Feature больше не maintained by major browsers
  • Implementation может быть completely removed в future release

Chrome: Removed HTTP/2 Push в Chrome 106 (2022)

Reason: Compatibility issues с various sites, limited adoption, нет support в других major browsers

Alternative Technologies:

  • ✅ 103 Early Hints
  • ✅ <link rel="preload">
  • ✅ <link rel="prefetch">
  • ✅ Speculation Rules API

Источники:

8.2 Third-Party Storage Partitioning Flag (Chrome 128) ​

Статус: Removed ⭐

Что изменилось: Chrome://flag для disable third-party storage partitioning removed.

Impact: Breaking change — enforces privacy через storage partitioning. Не может быть disabled пользователями.

Источник:

Browser Support Tables ​

HTTP/3 Support ​

BrowserВерсияСтатусДата
Chrome87+✅ Полная поддержкаНоябрь 2020
Edge87+✅ Полная поддержкаНоябрь 2020
Firefox88+✅ Полная поддержкаАпрель 2021
Safari16.0+✅ Production2023-2024
Opera73+✅ Полная поддержкаНоябрь 2020

Baseline-достижения 2024 ​

FeatureBaseline DateTriggered ByWidely Available
Priority Header29 октября 2024Firefox 132Апрель 2027
Fetch Priority29 октября 2024Firefox 132Апрель 2027
bytes() MethodНоябрь 2024Chrome 132Апрель 2027
keepaliveНоябрь 2024Firefox 133Апрель 2027

Постквантовая Криптография ​

BrowserВерсияAlgorithmДата
Chrome124X25519Kyber768Апрель 2024
Chrome131ML-KEM (final)Ноябрь 2024
Edge124+X25519Kyber768Апрель 2024
Firefox❌Не поддерживается—
Safari❌Не поддерживается—

Passkeys Support ​

PlatformBrowser/OSSupport LevelДата
WindowsChrome✅ Полная—
Windows 11Windows Hello✅ + Third-partyНоябрь 2024
macOSSafari/Chrome✅ iCloud Keychain—
iOS/iPadOSSafari✅ Полная—
AndroidChrome✅ Полная—

Практические рекомендации ​

HTTP/3 Migration ​

Когда внедрять:

  • ✅ Если ваш CDN поддерживает (Cloudflare, Fastly, Akamai)
  • ✅ Для mobile-first приложений (connection migration)
  • ✅ Для real-time приложений (lower latency)

Checklist:

bash
# 1. Verify server support
curl -I --http3 https://your-site.com

# 2. Check HTTP/3 via DevTools
# Network tab → Protocol column → h3

# 3. Test fallback
# Ensure HTTP/2 fallback works если HTTP/3 unavailable

# 4. Monitor metrics
# Track connection success rate, latency improvements

Security Headers Configuration 2024 ​

Recommended Headers:

http
# Обязательные security headers
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
X-Frame-Options: DENY
X-Content-Type-Options: nosniff
Referrer-Policy: strict-origin-when-cross-origin

# CSP (кастомизировать под ваше приложение)
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' https://trusted-cdn.com; style-src 'self' 'unsafe-inline'

# Cross-origin isolation (если нужны SharedArrayBuffer, high-res timers)
Cross-Origin-Embedder-Policy: credentialless
Cross-Origin-Opener-Policy: same-origin

# Permissions policy
Permissions-Policy: geolocation=(self), microphone=(), camera=()

Third-Party Cookies Alternatives ​

Для Authentication:

  1. FedCM (Federated Credential Management)
  2. Storage Access API
  3. Related Website Sets

Для Advertising:

  1. Topics API (interest-based)
  2. Protected Audience API (remarketing)
  3. Attribution Reporting API (conversion measurement)

Для Cross-Site Storage:

  1. CHIPS (Partitioned cookies)
  2. Shared Storage API (Chrome only)

Passkeys Implementation ​

Step-by-step:

  1. Backend Setup: Implement FIDO2 server (libraries: fido2-lib, webauthn-lib)
  2. Registration Flow: Create credential при signup
  3. Authentication Flow: Get credential при login
  4. Autofill UI: Use mediation: 'conditional' для autofill UX
  5. Fallback: Keep password option для backwards compatibility

Performance Optimization ​

Fetch Priority:

html
<!-- LCP hero image -->
<img src="/hero.jpg" fetchpriority="high" alt="Hero" />

<!-- Critical CSS -->
<link rel="stylesheet" href="/critical.css" fetchpriority="high" />

<!-- Below-fold images -->
<img src="/section2.jpg" fetchpriority="low" loading="lazy" alt="Section 2" />

<!-- Analytics -->
<script src="/analytics.js" fetchpriority="low" async></script>

Speculation Rules:

html
<script type="speculationrules">
    {
        "prerender": [
            {
                "where": {
                    "href_matches": "/products/*"
                },
                "eagerness": "moderate"
            }
        ]
    }
</script>

Заключение ​

2024 год стал переломным для веб-индустрии. Отмена планов по deprecation third-party cookies изменила trajectory, но не остановила движение к более приватному вебу. Privacy Sandbox APIs продолжили развитие, passkeys стали mainstream, и постквантовая криптография integrated в production browsers.

HTTP/3 достиг ~30% adoption, Baseline-статуса добились критически важные APIs (Priority, Fetch Priority, keepalive, bytes()), а bounce tracking protection теперь доступна во всех major browsers.

Ключевые выводы ​

  1. Privacy-first подход сохранился несмотря на cookie reversal
  2. Постквантовая криптография стала реальностью в production
  3. Passkeys adoption растёт экспоненциально (1B+ authentications)
  4. HTTP/3 стабилизировался на ~30% трафика
  5. Browser vendors продолжают инновации в tracking prevention

Что ожидать в 2025 ​

  • WebAuthn Level 3 finalization
  • Continued Privacy Sandbox maturation
  • Expanded HTTP/3 adoption
  • More tracking prevention mechanisms
  • Further Baseline achievements

Источники ​

Этот отчёт основан на следующих официальных источниках:

Browser Release Notes:

Specifications:

Industry Resources:

Research Data:

Дата исследования: 18 ноября 2024