[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-keshirovanie-kak-rabotaet-http-keshirovanie":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":21,"progress":22,"seo":23},186,"kak-rabotaet-http-keshirovanie",5,"keshirovanie","Кеширование","⚡","Как работает HTTP-кэширование?","HTTP-кэширование — это механизм протокола HTTP, позволяющий клиенту (браузеру) и промежуточным серверам (CDN, proxy) хранить и переиспользовать ответы сервера без повторного обращения к нему.\n\n### Заголовки кэширования\n\n```http\nHTTP\u002F1.1 200 OK\nCache-Control: max-age=3600, public\nETag: \"abc123\"\nLast-Modified: Tue, 22 Apr 2026 10:00:00 GMT\n```\n\n| Заголовок | Назначение | Пример |\n|-----------|-----------|--------|\n| `Cache-Control` | Управление кэшированием | `max-age=3600, public` |\n| `ETag` | Хэш содержимого для условных запросов | `\"abc123\"` |\n| `Last-Modified` | Дата последнего изменения | `Tue, 22 Apr 2026 10:00:00 GMT` |\n| `Vary` | По каким заголовкам различать кэш | `Vary: Accept-Encoding` |\n\n### Директивы Cache-Control\n\n| Директива | Значение |\n|-----------|---------|\n| `public` | Можно кэшировать где угодно (CDN, proxy) |\n| `private` | Только в браузере (содержит персональные данные) |\n| `no-cache` | Кэшировать, но всегда проверять актуальность (через ETag\u002FLast-Modified) |\n| `no-store` | Не кэшировать вообще (sensitive данные) |\n| `max-age=N` | Свежесть в секундах |\n| `must-revalidate` | После истечения max-age обязательно проверить |\n\n### Условные запросы (conditional requests)\n\n```\n1. Первый запрос:\n   GET \u002Fapi\u002Fproducts\u002F1 → 200 OK, ETag: \"abc123\"\n\n2. Повторный запрос (с ETag):\n   GET \u002Fapi\u002Fproducts\u002F1\n   If-None-Match: \"abc123\"\n\n3. Если данные не изменились:\n   304 Not Modified (тело НЕ передаётся — экономия трафика)\n\n4. Если изменились:\n   200 OK, ETag: \"def456\", новое тело\n```\n\n### Реализация в Spring\n\n```java\n@GetMapping(\"\u002Fproducts\u002F{id}\")\npublic ResponseEntity\u003CProduct> getProduct(@PathVariable Long id) {\n    Product product = productService.findById(id);\n    String etag = \"\\\"\" + product.getVersion() + \"\\\"\";\n\n    return ResponseEntity.ok()\n        .cacheControl(CacheControl.maxAge(Duration.ofMinutes(10)).cachePublic())\n        .eTag(etag)\n        .body(product);\n}\n\n\u002F\u002F Или с Spring ShallowEtagHeaderFilter (автоматический ETag по содержимому)\n@Bean\npublic FilterRegistrationBean\u003CShallowEtagHeaderFilter> etagFilter() {\n    return new FilterRegistrationBean\u003C>(new ShallowEtagHeaderFilter());\n}\n```\n\n### Ключевые принципы\n\n- `Cache-Control: no-cache` НЕ означает \"не кэшировать\"; это \"кэшировать, но проверять актуальность\"\n- `Cache-Control: no-store` — единственный способ полностью запретить кэширование\n- ETag + `If-None-Match` дают 304 Not Modified — экономия трафика без потери актуальности\n- CDN кэширует только `public` ответы\n\n### Частые ошибки\n\n- **Не устанавливать `Cache-Control`** — браузер может кэшировать по эвристике, или не кэшировать вообще\n- **`no-cache` вместо `no-store`** — путаница; `no-cache` всё ещё кэширует\n- **Кэшировать персональные данные как `public`** — CDN может отдать чужие данные\n- **Забыть `Vary: Authorization`** — ответы для разных пользователей смешиваются в кэше\n\n### Как используется в 2026\n\n- CDN (Cloudflare, CloudFront) — стандарт для статики и API\n- `stale-while-revalidate` — директива Cache-Control для фонового обновления\n- API Gateway (Spring Cloud Gateway, Nginx) — кэширование на уровне gateway\n\n> **На собеседовании:** интервьюер обязательно спросит разницу между `no-cache` и `no-store` — это классическая ловушка. Частая ошибка — думать, что `no-cache` запрещает кэширование.","","middle",[15,16,17,18,19,20],"browser","http","etag","cache-control","cdn","caching",[],null,{"title":24,"description":25,"ogTitle":26,"ogDescription":27,"keywords":28,"schemaAnswer":38,"featuredSnippetReady":39},"Как работает HTTP-кэширование — Gymterview","HTTP-кэширование: заголовки Cache-Control, ETag, Last-Modified. Директивы public, private, no-cache, no-store. Условные запросы и 304 Not Modified в Spring.","HTTP-кэширование: Cache-Control, ETag и условные запросы — Gymterview","Как работает HTTP-кэширование: заголовки, директивы Cache-Control, условные запросы (ETag\u002F304). Реализация в Spring.",[29,30,31,32,33,34,35,36,37],"HTTP кэширование","Cache-Control","ETag","Last-Modified","304 Not Modified","no-cache","no-store","CDN","Spring","HTTP-кэширование позволяет браузеру и CDN хранить ответы без обращения к серверу. Управляется заголовками: Cache-Control (max-age, public\u002Fprivate, no-cache, no-store), ETag (хэш содержимого) и Last-Modified. При повторном запросе с If-None-Match сервер возвращает 304 Not Modified без тела, экономя трафик. В Spring реализуется через CacheControl builder и ShallowEtagHeaderFilter.",true]