[{"data":1,"prerenderedAt":1497},["ShallowReactive",2],{"$f_6Fm1PYXtOLl52POI71lNUpvTBuV2V8seCPtT4Mja0Q":3,"$fMMUdSFktwQFqMVGPrTtt3EC5yheBp7PzwIqznamFcMo":79,"$fc0LoAJgqXDLbKKd2JS_NpM4SuzBK8EycUXINSg09CKU":82,"$fM3ea55k6lKMPOTM84llDB26VSQDVVbxiQuSBFQw9P_c":87,"$f1Prj1xEczHja_-L7FyIGgRHd5_cSWHo7r6AE5aheAik":432,"$fI5fDmvm-5tr9wcH0eHaKZa1j3y_FQIQaHHPqbZxAHJE":654,"mdc--yr1c6d-key":674,"mdc-ykdyye-key":686,"mdc-jjf7td-key":694,"mdc-5i55kr-key":758,"mdc-ovy5jh-key":790,"mdc-xp34rw-key":821,"mdc-1lhfvu-key":876,"mdc--2lmhp6-key":933,"mdc-at89is-key":967,"mdc-o6dc1w-key":975,"mdc-z3rayr-key":1104,"mdc--imhlx-key":1127,"mdc--q6zwe1-key":1376,"mdc--ag4mw7-key":1446,"mdc--h0rj8m-key":1454},{"content":4,"quizQuestionContent":50,"type":69,"pageMeta":70},[5,9,13,16,20,24,27,30,34,37,41,44,47],{"id":6,"value":7,"isTypeH1":8},"1885","Управление cookie в браузере: возможности и границы",true,{"id":10,"value":11,"anchor":12,"isTypeH2":8},"4302","Теория: что значит «управлять cookie»","theory-what-it-means-to-manage-cookies",{"id":14,"value":15,"isTypeParagraph":8},"9906","Cookie — это механизм HTTP-состояния: сервер задаёт значения, браузер хранит их и автоматически прикрепляет к запросам в заголовке `Cookie` при соблюдении правил области видимости.  \nПод «управлением cookie» обычно понимаются операции чтения, записи/обновления и удаления, которые могут выполняться сервером через `Set-Cookie` и частично — клиентом через Web API.  \nДаже при записи с клиента окончательное поведение (хранение и отправка) контролируется браузером, а не JavaScript-кодом.",{"id":17,"description":18,"titleAlert":19,"isTypeAlertInfo":8},"617","Cookie — не «переменная JavaScript», а часть HTTP-механизма, поэтому контроль всегда ограничен политиками браузера и атрибутами cookie.",null,{"id":21,"value":22,"anchor":23,"isTypeH2":8},"4303","Управление с клиента (JavaScript)","client-side-cookie-management-javascript",{"id":25,"value":26,"isTypeParagraph":8},"9907","С клиента доступны чтение и запись cookie, привязанных к текущему документу, через `document.cookie` (строковый интерфейс: чтение возвращает строку, запись устанавливает одну cookie за операцию).  \nВ поддерживаемых браузерах возможен Cookie Store API — асинхронный интерфейс `cookieStore.*`, полезный в окружениях без `document` (например, в service worker).  \nДоступна только работа с «скриптовыми» cookie: те, которые не помечены `HttpOnly`, и которые попадают в допустимую область домена/пути текущей страницы.\n\nПримеры (как обычный текст, без выделения блоков):\n\nЧтение всех доступных cookie текущего документа:\n`const all = document.cookie;`\n\nУстановка cookie (на год, для всего сайта):\n`document.cookie = \"theme=dark; Path=/; Max-Age=31536000\";`\n\nОбновление cookie (по сути — повторная установка с тем же именем):\n`document.cookie = \"theme=light; Path=/; Max-Age=31536000\";`\n\nУдаление cookie (истечение срока; важны совпадения `Path` и при наличии — `Domain`):\n`document.cookie = \"theme=; Path=/; Max-Age=0\";`\n\nПример Cookie Store API (установка и чтение):\n```\nasync function demo() {\n  await cookieStore.set(\"cookie1\", \"value1\");\n  const c = await cookieStore.get(\"cookie1\");\n  console.log(c);\n}\n```",{"id":28,"description":29,"titleAlert":19,"isTypeAlertWarning":8},"673","Ситуация «cookie видна в DevTools, но не читается через `document.cookie`» чаще всего объясняется атрибутом `HttpOnly` и является ожидаемым поведением.",{"id":31,"value":32,"anchor":33,"isTypeH2":8},"4304","Ограничения: что клиент сделать не может","client-limitations-what-cannot-be-done",{"id":35,"value":36,"isTypeParagraph":8},"9908","Cookie с атрибутом `HttpOnly` принципиально недоступны JavaScript: они предназначены для передачи только через HTTP и скрываются от скриптовых API.  \nНельзя корректно «заставить» браузер принять cookie для произвольного чужого домена из кода страницы: область cookie связана с доменными правилами и origin-ограничениями.  \nНельзя считать надёжным «управлением cookie» попытку вручную подставлять заголовок `Cookie` в запросах: браузер формирует отправку cookie сам, по cookie-движку и политикам безопасности.\n\nТаблица возможностей:\n\n| Действие | Возможно с клиента | Комментарий |\n|---|---:|---|\n| Прочитать обычные cookie текущего документа | Да | Через `document.cookie` или `cookieStore.get*()` (если доступно). |\n| Записать/обновить cookie текущего контекста | Да | Через `document.cookie` или `cookieStore.set()`, но с ограничениями атрибутов и области. |\n| Удалить cookie | Да | Через `Max-Age=0`/прошлый `Expires`, при совпадении `Path`/`Domain`. |\n| Прочитать/изменить `HttpOnly` | Нет | Флаг создан для защиты от чтения из JS (снижение риска кражи при XSS). |\n| Установить cookie «на чужой домен» | Нет | Браузер применяет доменные правила и не даёт произвольно расширять область. |\n| Гарантировать отправку в third-party контекстах | Нет | Отправка зависит от `SameSite`, `Secure` и политик браузера (third-party блокировки). |",{"id":38,"value":39,"anchor":40,"isTypeH2":8},"4305","SameSite, third-party и современные изменения","samesite-third-party-and-modern-web",{"id":42,"value":43,"isTypeParagraph":8},"9909","Атрибут `SameSite` управляет тем, будет ли cookie отправляться в кросс-сайтовых контекстах (`Strict`, `Lax`, `None`), при этом для `SameSite=None` обычно требуется `Secure`.  \nИз‑за ужесточения политики third-party cookie в браузерах поведение embedded-сценариев (iframe, виджеты, сторонняя авторизация) всё чаще определяется настройками приватности и механизмами анти-трекинга, а не только кодом.  \nДля совместимости развиваются подходы вроде партиционирования cookie (CHIPS/`Partitioned`) и Storage Access API, но они не дают «полного контроля», а задают регламентированный путь к ограниченному доступу.",{"id":45,"description":46,"titleAlert":19,"isTypeAlertInfo":8},"618","При проектировании авторизации и встраиваний следует исходить из того, что third-party cookie могут быть недоступны по умолчанию в части браузеров и режимов.",{"id":48,"value":49,"isTypeParagraph":8},"9910","Кратко: С клиента управлять cookie можно, но не полностью: разрешены чтение/запись и удаление обычных cookie в рамках текущего сайта через `document.cookie` (и иногда `cookieStore`), однако `HttpOnly` скрывает cookie от JavaScript, а `Secure`/`SameSite` и third-party ограничения браузеров определяют, будут ли cookie работать и отправляться в запросах.",{"id":51,"options":52,"hint":66,"solution":67,"description":68},"1127",[53,57,60,63],{"id":54,"label":55,"isCorrect":56},"4635","Управление cookie с клиента возможно только вручную: изменения допустимы только в DevTools, JavaScript может лишь видеть cookie, но не умеет создавать, обновлять и удалять их из‑за ограничений модели безопасности браузера.",false,{"id":58,"label":59,"isCorrect":8},"4636","Управление cookie с клиента возможно частично: доступны чтение/запись обычных cookie текущего документа через `document.cookie` и иногда через `cookieStore`, но `HttpOnly` недоступен, а `Domain`/`Path`/`Secure`/`SameSite` и third-party политика браузера ограничивают хранение и отправку.  ",{"id":61,"label":62,"isCorrect":56},"4637","Управление cookie с клиента возможно полностью: любой JavaScript может прочитать и изменить любые cookie, включая `HttpOnly`, выставить cookie на любой домен, а также принудительно отправить их куда угодно, подменив заголовок `Cookie` в `fetch()`.  ",{"id":64,"label":65,"isCorrect":56},"4638","Управление cookie с клиента невозможно: cookie задаются только сервером через `Set-Cookie`, а `document.cookie` и `cookieStore` являются устаревшими/запрещёнными API и не работают в современных браузерах, поэтому программная запись и удаление исключены.  ","Следует разделить «серверные cookie через `Set-Cookie`» и «клиентские операции через `document.cookie`/Cookie Store API», затем проверить ограничения `HttpOnly`, `Secure`, `SameSite`, `Domain`, `Path` и сценарий first-party/third-party.","**Правильный ответ: 2** - Управление cookie с клиента возможно частично: доступны чтение/запись обычных cookie текущего документа через `document.cookie` и иногда через `cookieStore`, но `HttpOnly` недоступен, а `Domain`/`Path`/`Secure`/`SameSite` и third-party политика браузера ограничивают хранение и отправку.  ","Есть ли возможность с клиента (с браузера) управлять cookie?","quizQuestion",{"title":68,"description":71,"ogTitle":7,"ogDescription":71,"ogImageUrl":72,"canonical":19,"ogLocale":73,"ogSiteName":74,"ogImageType":75,"ogImageWidth":76,"ogImageHeight":77,"ogType":78,"ogUrl":19},"Как управлять cookie с клиента: document.cookie, Cookie Store API, ограничения HttpOnly/Secure/SameSite и third-party политика.","/og-image.png","ru_RU","goodwebjob.ru","image_jpeg","1200","630","article",{"siteName":80,"siteUrl":81},"GOOD WEB JOB!","https://goodwebjob.ru",[83],{"label":84,"slug":85,"to":86},"Подготовка к тех.интервью","technical-interview","/technical-interview/where-to-begin",{"navigationList":88,"navigationSublist":96},[89,92],{"path":86,"isActive":56,"name":90,"icon":91,"isNavbarMobileDisabled":8},"С чего начать?","material-symbols:visibility-outline-rounded",{"path":93,"isActive":8,"name":94,"icon":95,"isNavbarMobileDisabled":56},"/technical-interview/tasks","Сборник задач","material-symbols:task-outline",[97,106,133,145,151,292,316,325,331,393,414,420],{"title":98,"list":99,"isOpened":56},"Bash",[100,103],{"name":101,"path":102,"isActive":56},"Дан фрагмент bash-скрипта: cd ~; mkdir foo... Что в нем происходит?","/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":104,"path":105,"isActive":56},"Дан фрагмент bash-скрипта: target=$(ps -Af | grep $1 | head -n 1)...","/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"title":107,"list":108,"isOpened":56},"CSS",[109,112,115,118,121,124,127,130],{"name":110,"path":111,"isActive":56},"Дан HTML-код. Какой будет цвет у текста «Some dummy text»?","/technical-interview/tasks/the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":113,"path":114,"isActive":56},"Есть шаблон HTML и CSS кода. Какой будет цвет у текста «Таким образом, постоянное»?","/technical-interview/tasks/there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":116,"path":117,"isActive":56},"Есть шаблон вложенного HTML кода. Какой будет цвет у текста «One more dummy text»?","/technical-interview/tasks/there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":119,"path":120,"isActive":56},"Есть шаблон вложенного HTML кода. Будет ли display:block у body влиять на span?","/technical-interview/tasks/there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":122,"path":123,"isActive":56},"Есть HTML код. Будет ли font-weight на span влиять?","/technical-interview/tasks/there-is-an-html-code-will-font-weight-affect-span",{"name":125,"path":126,"isActive":56},"Flexbox и Grid, чем отличаются друг от друга?","/technical-interview/tasks/what-are-the-differences-between-flexbox-and-grid",{"name":128,"path":129,"isActive":56},"Заменяют ли Flexbox и Grid друг друга?","/technical-interview/tasks/do-flexbox-and-grid-replace-each-other",{"name":131,"path":132,"isActive":56},"Есть CSS и JS анимация. Какая между ними разница, что быстрее, что более удобно?","/technical-interview/tasks/there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"title":134,"list":135,"isOpened":56},"Git",[136,139,142],{"name":137,"path":138,"isActive":56},"Разрабатывал, взял закоммитил, запушил. Оказалось, что запушил не в ту ветку, точнее, коммит не в ту ветку. Какие действия?","/technical-interview/tasks/developed-it-committed-it-and-launched-it-it-turned-out-that-i-had-pushed-it-to-the-wrong-branch-or-rather-the-commit-was-in-the-wrong-branch-what-actions",{"name":140,"path":141,"isActive":56},"В git есть несколько вариантов слияния веток, какие? Чем отличаются?","/technical-interview/tasks/git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":143,"path":144,"isActive":56},"Какие существуют стратегии ветвления для работы команды? Что это такое?","/technical-interview/tasks/what-are-the-branching-strategies-for-the-team-what-is-it",{"title":146,"list":147,"isOpened":56},"HTML",[148],{"name":149,"path":150,"isActive":56},"Что такое HTML?","/technical-interview/tasks/what-is-html",{"title":152,"list":153,"isOpened":56},"JavaScript",[154,157,160,163,166,169,172,175,178,181,184,187,190,193,196,199,202,205,208,211,214,217,220,223,226,229,232,235,238,241,244,247,250,253,256,259,262,265,268,271,274,277,280,283,286,289],{"name":155,"path":156,"isActive":56},"Какие логические значения в console.log будут получены?","/technical-interview/tasks/prototype-what-logical-values-will-be-received-in-console-log",{"name":158,"path":159,"isActive":56},"Почему опасно писать прямо в прототипы базовых типов?","/technical-interview/tasks/why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":161,"path":162,"isActive":56},"Что вернёт следующий код? Object.create(null).hasOwnProperty('toString')","/technical-interview/tasks/what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":164,"path":165,"isActive":56},"Какое значение выведет консоль с object.property?","/technical-interview/tasks/what-value-will-the-console-output-with-object-property",{"name":167,"path":168,"isActive":56},"Что выведется в console.log([arr[0](), arr[0]()])?","/technical-interview/tasks/what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":170,"path":171,"isActive":56},"Что выведет console.log в результате выполнения цикла while?","/technical-interview/tasks/what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":173,"path":174,"isActive":56},"Есть функция и объект. Напишите все известные вам способы, чтобы вывести в консоли значение x из объекта, используя функцию","/technical-interview/tasks/there-is-a-function-and-an-object-write-all-the-ways-you-know-to-output-the-value-of-x-from-an-object-in-the-console-using-the-function",{"name":176,"path":177,"isActive":56},"Что вернёт метод book.getUpperName()?","/technical-interview/tasks/what-will-the-book-get-upper-name-method-return",{"name":179,"path":180,"isActive":56},"Переменные объявлены следующим образом: a=3; b=«hello»;. Укажите правильное утверждение","/technical-interview/tasks/variables-are-declared-as-follows-specify-the-correct-statement",{"name":182,"path":183,"isActive":56},"Что выведет консоль в случае присвоения свойства массиву по строковому положительному индексу?","/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":185,"path":186,"isActive":56},"Что выведет консоль в случае присвоения свойства массиву по строковому отрицательному индексу?","/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":188,"path":189,"isActive":56},"Что выведет консоль в случае удаления элемента массива с помощью оператора delete?","/technical-interview/tasks/what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":191,"path":192,"isActive":56},"Что вернёт этот код: typeof (function(){})()","/technical-interview/tasks/what-this-code-will-return-typeof-function",{"name":194,"path":195,"isActive":56},"Что получится в результате передачи объекта как аргумента в функцию и выполнения кода?","/technical-interview/tasks/what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":197,"path":198,"isActive":56},"Какие способы объявления функции есть в JavaScript?","/technical-interview/tasks/what-are-the-ways-to-declare-a-function-in-javascript",{"name":200,"path":201,"isActive":56},"Что такое this в JavaScript?","/technical-interview/tasks/what-is-this-in-javascript",{"name":203,"path":204,"isActive":56},"Что такое Event Loop, как работает?","/technical-interview/tasks/what-is-an-event-loop-and-how-does-it-work",{"name":206,"path":207,"isActive":56},"Что будет, если вызвать typeof на необъявленной переменной?","/technical-interview/tasks/what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":209,"path":210,"isActive":56},"Что показывает оператор typeof в JavaScript?","/technical-interview/tasks/what-does-the-typeof-operator-show-in-javascript",{"name":212,"path":213,"isActive":56},"Какие типы данных существует в JavaScript?","/technical-interview/tasks/what-types-of-data-exist-in-javascript",{"name":215,"path":216,"isActive":56},"Какую структуру использовать для хранения упорядоченного списка строк в JavaScript?","/technical-interview/tasks/what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":218,"path":219,"isActive":56},"Что вернет typeof для массива?","/technical-interview/tasks/what-will-typeof-return-for-an-array",{"name":221,"path":222,"isActive":56},"Почему оператор typeof, применённый к массиву, возвращает объект?","/technical-interview/tasks/why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":224,"path":225,"isActive":56},"Если нужно хранить список уникальных строк, какую структуру данных выбрать?","/technical-interview/tasks/if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":227,"path":228,"isActive":56},"Что возвращает typeof для new Set в JavaScript?","/technical-interview/tasks/what-does-typeof-return-for-new-set-in-javascript",{"name":230,"path":231,"isActive":56},"Почему в JavaScript два объекта с одинаковым содержимым при сравнении возвращают false?","/technical-interview/tasks/why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":233,"path":234,"isActive":56},"В чем разница между микро- и макро-тасками в JavaScript?","/technical-interview/tasks/what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":236,"path":237,"isActive":56},"arr.push(0) повлияет на массив так же, как если бы мы выполнили...","/technical-interview/tasks/arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":239,"path":240,"isActive":56},"Вернуть массив от 1 до n, где числа, кратные 3, заменены на 'fizz', кратные 5 - на 'buzz', а кратные и 3, и 5 одновременно - на 'fizzbuzz'","/technical-interview/tasks/returns-an-array-from-1-to-n-replacing-numbers-that-are-multiples-of-3-with-fizz-numbers-that-are-multiples-of-5-with-buzz-and-numbers-that-are-multiples-of-both-3-and-5-with-fizzbuzz",{"name":242,"path":243,"isActive":56},"Дана строка: 'one.two.three.four.five'. Необходимо из строки сделать вложенный объект","/technical-interview/tasks/the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":245,"path":246,"isActive":56},"Дано дерево (вложенный объект), надо найти сумму всех вершин","/technical-interview/tasks/given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":248,"path":249,"isActive":56},"Для каждого вложенного объекта нужно добавить свойство level, которое равняется числу - номер вложенности","/technical-interview/tasks/for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":251,"path":252,"isActive":56},"Для каждой ветви дерева записать номер вложенности данной ветви","/technical-interview/tasks/for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":254,"path":255,"isActive":56},"Есть массив, в котором лежат объекты с датами, необходимо отсортировать даты по возрастанию","/technical-interview/tasks/there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":257,"path":258,"isActive":56},"Есть слова в массиве, необходимо определить, состоят ли они из одних и тех же букв","/technical-interview/tasks/there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":260,"path":261,"isActive":56},"Есть строка, состоящая из разных скобок, необходимо проверить, закрыты ли все","/technical-interview/tasks/there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":263,"path":264,"isActive":56}," Найти в массиве неповторяющиеся числа","/technical-interview/tasks/find-non-repeating-numbers-in-an-array",{"name":266,"path":267,"isActive":56},"Напишите функцию, который сделает из массива объект","/technical-interview/tasks/write-a-function-that-will-make-an-object-out-of-an-array",{"name":269,"path":270,"isActive":56},"Необходимо проверить, являются ли две строки анаграммами друг друга","/technical-interview/tasks/checks-whether-two-strings-are-anagrams-of-each-other",{"name":272,"path":273,"isActive":56},"Нечётные числа должны отсортироваться по возрастанию, а чётные должны остаться на своих местах","/technical-interview/tasks/odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":275,"path":276,"isActive":56},"Определить, является ли слово палиндромом","/technical-interview/tasks/determines-whether-a-word-is-a-palindrome",{"name":278,"path":279,"isActive":56},"«Расплющивание» массива","/technical-interview/tasks/flattening-the-array",{"name":281,"path":282,"isActive":56},"Реализовать функцию, принимающую аргументы \"*\", \"1\", \"b\", \"1c\" и возвращающую строку \"1*b*1c\"","/technical-interview/tasks/implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":284,"path":285,"isActive":56},"Сжатие строк","/technical-interview/tasks/string-compression",{"name":287,"path":288,"isActive":56},"Уникализация значений в массиве","/technical-interview/tasks/unifying-values-in-an-array",{"name":290,"path":291,"isActive":56},"Числа от 1 до 100 находятся в массиве, они хаотично перемешанные, но в нём не хватает одного числа из этой последовательности. Необходимо найти его","/technical-interview/tasks/the-numbers-from-1-to-100-are-in-the-array-they-are-randomly-mixed-but-it-lacks-one-number-from-this-sequence-it-is-necessary-to-find-him",{"title":293,"list":294,"isOpened":56},"React",[295,298,301,304,307,310,313],{"name":296,"path":297,"isActive":56},"Для чего нужен React, какие он решает проблемы?","/technical-interview/tasks/what-is-react-used-for-and-what-problems-does-it-solve",{"name":299,"path":300,"isActive":56},"Какой механизм лежит в основе оптимизации обновлений DOM в React?","/technical-interview/tasks/what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":302,"path":303,"isActive":56},"Если убрать в React VDOM/Fiber, и вручную изменять DOM, разве это не оптимально?","/technical-interview/tasks/if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":305,"path":306,"isActive":56},"Есть блок кода. Что в реальном DOM изменится после нажатия на кнопку?","/technical-interview/tasks/there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":308,"path":309,"isActive":56},"Есть код, в котором список и кнопка. Что в реальном DOM изменится после нажатия на кнопку?","/technical-interview/tasks/there-is-a-code-in-which-there-is-a-list-and-a-button-what-will-change-in-the-real-dom-after-clicking-on-the-button",{"name":311,"path":312,"isActive":56},"Зачем нужен Redux (Mobx/Effector)? Зачем нужен менеджер состояния? Какие проблемы решает?","/technical-interview/tasks/why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":314,"path":315,"isActive":56},"Что мешает организовать централизованное состояние без менеджера состояния? Если организовать состояние механизмами реакта: контекстом, стейтом, в чем проблема? Что менеджеры состояния привносят?","/technical-interview/tasks/what-prevents-you-from-organizing-a-centralized-state-without-a-state-manager-if-you-organize-the-state-using-react-context-and-state-mechanisms-what-is-the-problem-what-do-state-managers-add",{"title":317,"list":318,"isOpened":56},"Алгоритмы",[319,322],{"name":320,"path":321,"isActive":56},"Что такое алгоритмическая сложность?","/technical-interview/tasks/what-is-algorithmic-complexity",{"name":323,"path":324,"isActive":56},"Какая алгоритмическая сложность у \"быстрой сортировки\"?","/technical-interview/tasks/what-is-the-algorithmic-complexity-of-quick-sort",{"title":326,"list":327,"isOpened":56},"Дебаггинг",[328],{"name":329,"path":330,"isActive":56},"Как диагностировать и исправить нежелательное изменение цвета фона по клику на кнопку, если исходный код сайта запутан и недоступен для прямого чтения?","/technical-interview/tasks/how-can-diagnose-and-fix-unwanted-background-color-changes-when-clicking-on-a-button-if-the-source-code-of-the-site-is-confusing-and-inaccessible-to-direct-reading",{"title":332,"list":333,"isOpened":56},"Компьютерные сети",[334,337,340,343,346,349,352,355,358,361,364,367,370,373,376,378,381,384,387,390],{"name":335,"path":336,"isActive":56},"Как браузер после ввода домена понимает, откуда брать сайт?","/technical-interview/tasks/how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":338,"path":339,"isActive":56},"Что такое DNS, как DNS находит нужный IP-адрес?","/technical-interview/tasks/what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":341,"path":342,"isActive":56},"Как домен попадает в DNS в таблицу соответствия: домен – ip","/technical-interview/tasks/how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":344,"path":345,"isActive":56},"Как браузер решает, какое соединение ему открывать, TCP или UDP?","/technical-interview/tasks/how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":347,"path":348,"isActive":56},"Ключевые отличия TCP и UDP","/technical-interview/tasks/key-differences-between-tcp-and-udp",{"name":350,"path":351,"isActive":56},"\"TCP/IP\" - кем является TCP, а кем IP в данном случае?","/technical-interview/tasks/tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":353,"path":354,"isActive":56},"Что такое HTTP и из чего состоит?","/technical-interview/tasks/what-is-http-and-what-does-it-consist-of",{"name":356,"path":357,"isActive":56},"Что такое заголовки в HTTP и зачем они нужны?","/technical-interview/tasks/what-are-http-headers-and-why-do-we-need-them",{"name":359,"path":360,"isActive":56},"Что такое параметры в HTTP?","/technical-interview/tasks/what-are-http-parameters",{"name":362,"path":363,"isActive":56},"Где находится HTML-код в структуре HTTP-ответа?","/technical-interview/tasks/where-is-the-html-code-located-in-the-http-response-structure",{"name":365,"path":366,"isActive":56},"Чем отличаются 1.0, 1.1, 2.0, 3.0 версии HTTP?","/technical-interview/tasks/what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":368,"path":369,"isActive":56},"Пользователь авторизован на сайте. Как сервер узнает об этом с последующими другими заходами, что «я – авторизованный пользователь»?","/technical-interview/tasks/the-user-is-logged-in-on-the-website-how-does-the-server-know-that-i-am-an-authorized-user-when-the-user-logs-in-again",{"name":371,"path":372,"isActive":56},"Что такое cookie?","/technical-interview/tasks/what-is-a-cookie",{"name":374,"path":375,"isActive":56},"Кто является инициатором записи cookie в браузере?","/technical-interview/tasks/who-initiates-the-cookie-recording-in-the-browser",{"name":68,"path":377,"isActive":56},"/technical-interview/tasks/is-it-possible-to-manage-cookies-from-the-client-browser",{"name":379,"path":380,"isActive":56},"Верно ли утверждение, что злоумышленник, контролирующий роутер и прослушивающий трафик, может получить логины и пароли от сайтов, на которые заходит клиент?","/technical-interview/tasks/is-it-true-that-an-attacker-who-controls-a-router-and-listens-to-traffic-can-obtain-logins-and-passwords-from-websites-that-a-client-visits",{"name":382,"path":383,"isActive":56},"Всё, что идет по HTTPS – оно защищено?","/technical-interview/tasks/is-everything-that-goes-through-https-secure",{"name":385,"path":386,"isActive":56},"Все данные зашифрованы, используется https. Хакер взламывает dns и делает подмену одного ip на другой, на фишинговый сайт. В этом случае, злоумышленник может получить данные (логин \\ пароль)?","/technical-interview/tasks/all-data-is-encrypted-https-is-used-let-s-assume-a-hacker-hacks-the-dns-and-makes-a-substitution-of-one-ip-for-another-a-phishing-site",{"name":388,"path":389,"isActive":56},"Есть веб-приложение. Помимо HTTP, какие протоколы того же уровня (Application Layer) можно дополнительно использовать в веб-приложении в браузере?","/technical-interview/tasks/there-is-a-web-application-in-addition-to-http-what-other-protocols-of-the-same-level-application-layer-can-be-used-in-the-web-application-in-browser",{"name":391,"path":392,"isActive":56},"Каким способом может выполняться авторизация пользователя на сайте?","/technical-interview/tasks/how-can-a-user-be-authorized-on-a-website",{"title":394,"list":395,"isOpened":56},"Отрисовка в браузере",[396,399,402,405,408,411],{"name":397,"path":398,"isActive":56},"Что происходит, когда HTTP прислал HTML? Что браузер дальше делает c HTML с учетом того, что она валидная?","/technical-interview/tasks/what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":400,"path":401,"isActive":56},"Как браузер парсит JavaScript и изображения при рендеринге?","/technical-interview/tasks/how-the-browser-parses-javascript-and-images-when-rendering",{"name":403,"path":404,"isActive":56},"Что в браузере блокирует рендеринг страницы?","/technical-interview/tasks/what-is-blocking-the-page-rendering-in-the-browser",{"name":406,"path":407,"isActive":56},"Что такое DOM в браузере? Что такое CSSOM?","/technical-interview/tasks/what-is-dom-in-a-browser-what-is-cssom",{"name":409,"path":410,"isActive":56},"Что является узлами в DOM?","/technical-interview/tasks/what-are-nodes-in-the-dom",{"name":412,"path":413,"isActive":56},"Из чего состоит CSSOM?","/technical-interview/tasks/what-does-cssom-consist-of",{"title":415,"list":416,"isOpened":56},"Ревью кода",[417],{"name":418,"path":419,"isActive":56},"По каким характеристикам, ревьюер понимает, что данный код - хороший, а этот код - плохой?","/technical-interview/tasks/how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"title":421,"list":422,"isOpened":56},"Теория вероятности",[423,426,429],{"name":424,"path":425,"isActive":56},"В комнате три человека. Какова вероятность того, что хотя бы двое из них одного пола? То есть два и более.","/technical-interview/tasks/there-are-three-people-in-the-room-what-is-the-probability-that-at-least-two-of-them-are-of-the-same-sex-that-is-two-or-more",{"name":427,"path":428,"isActive":56},"Есть монета. Ее подбрасывают пять раз подряд. Каждый раз записывается, что выпало - орел или решка. Сколько разных последовательностей орлов и решек может при этом получиться?","/technical-interview/tasks/there-is-a-coin-it-is-tossed-five-times-in-a-row-each-time-it-is-recorded-whether-it-lands-on-heads-or-tails-how-many-different-sequences-of-heads-and-tails-can-be-obtained",{"name":430,"path":431,"isActive":56},"Как гарантированно найти лёгкую фальшивую монету среди 8 за минимальное число взвешиваний на чашечных весах?","/technical-interview/tasks/how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"slugs":433},[434,437,439,441,443,446,449,451,453,455,457,459,462,464,466,468,470,472,474,476,478,480,482,484,486,488,490,492,494,496,498,500,502,504,506,508,510,512,514,516,518,520,522,524,526,528,530,532,534,536,538,540,543,545,547,549,551,553,555,557,559,561,563,565,567,569,571,573,575,577,579,581,583,585,587,589,591,593,595,597,599,601,603,605,607,609,611,613,615,617,619,621,623,625,627,629,631,633,635,637,639,641,643,644,646,648,650,652],{"name":435,"value":436},"Теоретические задания","theoretical-tasks",{"name":191,"value":438},"what-this-code-will-return-typeof-function",{"name":90,"value":440},"where-to-begin",{"name":158,"value":442},"why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":444,"value":445},"Backend","backend",{"name":447,"value":448},"Frontend","frontend",{"name":155,"value":450},"prototype-what-logical-values-will-be-received-in-console-log",{"name":272,"value":452},"odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":263,"value":454},"find-non-repeating-numbers-in-an-array",{"name":236,"value":456},"arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":242,"value":458},"the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":460,"value":461},"Реализовать функцию, похоже как в Jquery","implement-a-function-similar-to-jquery",{"name":248,"value":463},"for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":164,"value":465},"what-value-will-the-console-output-with-object-property",{"name":167,"value":467},"what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":239,"value":469},"returns-an-array-from-1-to-n-replacing-numbers-that-are-multiples-of-3-with-fizz-numbers-that-are-multiples-of-5-with-buzz-and-numbers-that-are-multiples-of-both-3-and-5-with-fizzbuzz",{"name":269,"value":471},"checks-whether-two-strings-are-anagrams-of-each-other",{"name":275,"value":473},"determines-whether-a-word-is-a-palindrome",{"name":254,"value":475},"there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":281,"value":477},"implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":245,"value":479},"given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":251,"value":481},"for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":257,"value":483},"there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":290,"value":485},"the-numbers-from-1-to-100-are-in-the-array-they-are-randomly-mixed-but-it-lacks-one-number-from-this-sequence-it-is-necessary-to-find-him",{"name":260,"value":487},"there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":266,"value":489},"write-a-function-that-will-make-an-object-out-of-an-array",{"name":170,"value":491},"what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":173,"value":493},"there-is-a-function-and-an-object-write-all-the-ways-you-know-to-output-the-value-of-x-from-an-object-in-the-console-using-the-function",{"name":185,"value":495},"what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":188,"value":497},"what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":287,"value":499},"unifying-values-in-an-array",{"name":278,"value":501},"flattening-the-array",{"name":176,"value":503},"what-will-the-book-get-upper-name-method-return",{"name":284,"value":505},"string-compression",{"name":182,"value":507},"what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":194,"value":509},"what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":335,"value":511},"how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":341,"value":513},"how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":344,"value":515},"how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":347,"value":517},"key-differences-between-tcp-and-udp",{"name":350,"value":519},"tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":353,"value":521},"what-is-http-and-what-does-it-consist-of",{"name":356,"value":523},"what-are-http-headers-and-why-do-we-need-them",{"name":359,"value":525},"what-are-http-parameters",{"name":362,"value":527},"where-is-the-html-code-located-in-the-http-response-structure",{"name":149,"value":529},"what-is-html",{"name":365,"value":531},"what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":368,"value":533},"the-user-is-logged-in-on-the-website-how-does-the-server-know-that-i-am-an-authorized-user-when-the-user-logs-in-again",{"name":371,"value":535},"what-is-a-cookie",{"name":374,"value":537},"who-initiates-the-cookie-recording-in-the-browser",{"name":68,"value":539},"is-it-possible-to-manage-cookies-from-the-client-browser",{"name":541,"value":542},"Лайвкодинг","livecoding",{"name":161,"value":544},"what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":382,"value":546},"is-everything-that-goes-through-https-secure",{"name":385,"value":548},"all-data-is-encrypted-https-is-used-let-s-assume-a-hacker-hacks-the-dns-and-makes-a-substitution-of-one-ip-for-another-a-phishing-site",{"name":388,"value":550},"there-is-a-web-application-in-addition-to-http-what-other-protocols-of-the-same-level-application-layer-can-be-used-in-the-web-application-in-browser",{"name":400,"value":552},"how-the-browser-parses-javascript-and-images-when-rendering",{"name":397,"value":554},"what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":403,"value":556},"what-is-blocking-the-page-rendering-in-the-browser",{"name":406,"value":558},"what-is-dom-in-a-browser-what-is-cssom",{"name":409,"value":560},"what-are-nodes-in-the-dom",{"name":412,"value":562},"what-does-cssom-consist-of",{"name":110,"value":564},"the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":113,"value":566},"there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":116,"value":568},"there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":119,"value":570},"there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":122,"value":572},"there-is-an-html-code-will-font-weight-affect-span",{"name":125,"value":574},"what-are-the-differences-between-flexbox-and-grid",{"name":128,"value":576},"do-flexbox-and-grid-replace-each-other",{"name":131,"value":578},"there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"name":94,"value":580},"tasks",{"name":197,"value":582},"what-are-the-ways-to-declare-a-function-in-javascript",{"name":200,"value":584},"what-is-this-in-javascript",{"name":203,"value":586},"what-is-an-event-loop-and-how-does-it-work",{"name":206,"value":588},"what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":209,"value":590},"what-does-the-typeof-operator-show-in-javascript",{"name":212,"value":592},"what-types-of-data-exist-in-javascript",{"name":215,"value":594},"what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":218,"value":596},"what-will-typeof-return-for-an-array",{"name":221,"value":598},"why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":224,"value":600},"if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":227,"value":602},"what-does-typeof-return-for-new-set-in-javascript",{"name":296,"value":604},"what-is-react-used-for-and-what-problems-does-it-solve",{"name":302,"value":606},"if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":305,"value":608},"there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":308,"value":610},"there-is-a-code-in-which-there-is-a-list-and-a-button-what-will-change-in-the-real-dom-after-clicking-on-the-button",{"name":311,"value":612},"why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":329,"value":614},"how-can-diagnose-and-fix-unwanted-background-color-changes-when-clicking-on-a-button-if-the-source-code-of-the-site-is-confusing-and-inaccessible-to-direct-reading",{"name":137,"value":616},"developed-it-committed-it-and-launched-it-it-turned-out-that-i-had-pushed-it-to-the-wrong-branch-or-rather-the-commit-was-in-the-wrong-branch-what-actions",{"name":140,"value":618},"git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":143,"value":620},"what-are-the-branching-strategies-for-the-team-what-is-it",{"name":418,"value":622},"how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"name":101,"value":624},"here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":104,"value":626},"here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"name":320,"value":628},"what-is-algorithmic-complexity",{"name":323,"value":630},"what-is-the-algorithmic-complexity-of-quick-sort",{"name":230,"value":632},"why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":391,"value":634},"how-can-a-user-be-authorized-on-a-website",{"name":233,"value":636},"what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":424,"value":638},"there-are-three-people-in-the-room-what-is-the-probability-that-at-least-two-of-them-are-of-the-same-sex-that-is-two-or-more",{"name":427,"value":640},"there-is-a-coin-it-is-tossed-five-times-in-a-row-each-time-it-is-recorded-whether-it-lands-on-heads-or-tails-how-many-different-sequences-of-heads-and-tails-can-be-obtained",{"name":430,"value":642},"how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"name":84,"value":85},{"name":379,"value":645},"is-it-true-that-an-attacker-who-controls-a-router-and-listens-to-traffic-can-obtain-logins-and-passwords-from-websites-that-a-client-visits",{"name":338,"value":647},"what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":179,"value":649},"variables-are-declared-as-follows-specify-the-correct-statement",{"name":299,"value":651},"what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":314,"value":653},"what-prevents-you-from-organizing-a-centralized-state-without-a-state-manager-if-you-organize-the-state-using-react-context-and-state-mechanisms-what-is-the-problem-what-do-state-managers-add",{"cooperation":655,"copyright":658,"reportError":659,"socialNetwork":661},{"link":656,"title":657},"https://t.me/baurinanton","Сотрудничество","© “GOOD WEB JOB!”",{"label":660,"link":656},"Сообщить об ошибке",{"label":662,"socialNetworkList":663},"Мы в соцсетях:",[664,667,670],{"icon":19,"link":665,"title":666},"https://max.ru/u/f9LHodD0cOKMaukdnnahTeL5pwvjrPfUaZ4S8_1rsNy9I9qsmc9Ar3kP_y8","Max",{"icon":668,"link":656,"title":669},"ic:baseline-telegram","Telegram",{"icon":671,"link":672,"title":673},"ri:vk-fill","https://vk.com/baurinanton","VK",{"data":675,"body":676},{},{"type":677,"children":678},"root",[679],{"type":680,"tag":681,"props":682,"children":683},"element","p",{},[684],{"type":685,"value":68},"text",{"data":687,"body":688},{},{"type":677,"children":689},[690],{"type":680,"tag":681,"props":691,"children":692},{},[693],{"type":685,"value":55},{"data":695,"body":696},{},{"type":677,"children":697},[698],{"type":680,"tag":681,"props":699,"children":700},{},[701,703,710,712,718,720,726,728,734,736,742,743,749,750,756],{"type":685,"value":702},"Управление cookie с клиента возможно частично: доступны чтение/запись обычных cookie текущего документа через ",{"type":680,"tag":704,"props":705,"children":707},"code",{"className":706},[],[708],{"type":685,"value":709},"document.cookie",{"type":685,"value":711}," и иногда через ",{"type":680,"tag":704,"props":713,"children":715},{"className":714},[],[716],{"type":685,"value":717},"cookieStore",{"type":685,"value":719},", но ",{"type":680,"tag":704,"props":721,"children":723},{"className":722},[],[724],{"type":685,"value":725},"HttpOnly",{"type":685,"value":727}," недоступен, а ",{"type":680,"tag":704,"props":729,"children":731},{"className":730},[],[732],{"type":685,"value":733},"Domain",{"type":685,"value":735},"/",{"type":680,"tag":704,"props":737,"children":739},{"className":738},[],[740],{"type":685,"value":741},"Path",{"type":685,"value":735},{"type":680,"tag":704,"props":744,"children":746},{"className":745},[],[747],{"type":685,"value":748},"Secure",{"type":685,"value":735},{"type":680,"tag":704,"props":751,"children":753},{"className":752},[],[754],{"type":685,"value":755},"SameSite",{"type":685,"value":757}," и third-party политика браузера ограничивают хранение и отправку.",{"data":759,"body":760},{},{"type":677,"children":761},[762],{"type":680,"tag":681,"props":763,"children":764},{},[765,767,772,774,780,782,788],{"type":685,"value":766},"Управление cookie с клиента возможно полностью: любой JavaScript может прочитать и изменить любые cookie, включая ",{"type":680,"tag":704,"props":768,"children":770},{"className":769},[],[771],{"type":685,"value":725},{"type":685,"value":773},", выставить cookie на любой домен, а также принудительно отправить их куда угодно, подменив заголовок ",{"type":680,"tag":704,"props":775,"children":777},{"className":776},[],[778],{"type":685,"value":779},"Cookie",{"type":685,"value":781}," в ",{"type":680,"tag":704,"props":783,"children":785},{"className":784},[],[786],{"type":685,"value":787},"fetch()",{"type":685,"value":789},".",{"data":791,"body":792},{},{"type":677,"children":793},[794],{"type":680,"tag":681,"props":795,"children":796},{},[797,799,805,807,812,814,819],{"type":685,"value":798},"Управление cookie с клиента невозможно: cookie задаются только сервером через ",{"type":680,"tag":704,"props":800,"children":802},{"className":801},[],[803],{"type":685,"value":804},"Set-Cookie",{"type":685,"value":806},", а ",{"type":680,"tag":704,"props":808,"children":810},{"className":809},[],[811],{"type":685,"value":709},{"type":685,"value":813}," и ",{"type":680,"tag":704,"props":815,"children":817},{"className":816},[],[818],{"type":685,"value":717},{"type":685,"value":820}," являются устаревшими/запрещёнными API и не работают в современных браузерах, поэтому программная запись и удаление исключены.",{"data":822,"body":823},{},{"type":677,"children":824},[825],{"type":680,"tag":681,"props":826,"children":827},{},[828,830,835,837,842,844,849,851,856,857,862,863,868,869,874],{"type":685,"value":829},"Следует разделить «серверные cookie через ",{"type":680,"tag":704,"props":831,"children":833},{"className":832},[],[834],{"type":685,"value":804},{"type":685,"value":836},"» и «клиентские операции через ",{"type":680,"tag":704,"props":838,"children":840},{"className":839},[],[841],{"type":685,"value":709},{"type":685,"value":843},"/Cookie Store API», затем проверить ограничения ",{"type":680,"tag":704,"props":845,"children":847},{"className":846},[],[848],{"type":685,"value":725},{"type":685,"value":850},", ",{"type":680,"tag":704,"props":852,"children":854},{"className":853},[],[855],{"type":685,"value":748},{"type":685,"value":850},{"type":680,"tag":704,"props":858,"children":860},{"className":859},[],[861],{"type":685,"value":755},{"type":685,"value":850},{"type":680,"tag":704,"props":864,"children":866},{"className":865},[],[867],{"type":685,"value":733},{"type":685,"value":850},{"type":680,"tag":704,"props":870,"children":872},{"className":871},[],[873],{"type":685,"value":741},{"type":685,"value":875}," и сценарий first-party/third-party.",{"data":877,"body":878},{},{"type":677,"children":879},[880],{"type":680,"tag":681,"props":881,"children":882},{},[883,889,891,896,897,902,903,908,909,914,915,920,921,926,927,932],{"type":680,"tag":884,"props":885,"children":886},"strong",{},[887],{"type":685,"value":888},"Правильный ответ: 2",{"type":685,"value":890}," - Управление cookie с клиента возможно частично: доступны чтение/запись обычных cookie текущего документа через ",{"type":680,"tag":704,"props":892,"children":894},{"className":893},[],[895],{"type":685,"value":709},{"type":685,"value":711},{"type":680,"tag":704,"props":898,"children":900},{"className":899},[],[901],{"type":685,"value":717},{"type":685,"value":719},{"type":680,"tag":704,"props":904,"children":906},{"className":905},[],[907],{"type":685,"value":725},{"type":685,"value":727},{"type":680,"tag":704,"props":910,"children":912},{"className":911},[],[913],{"type":685,"value":733},{"type":685,"value":735},{"type":680,"tag":704,"props":916,"children":918},{"className":917},[],[919],{"type":685,"value":741},{"type":685,"value":735},{"type":680,"tag":704,"props":922,"children":924},{"className":923},[],[925],{"type":685,"value":748},{"type":685,"value":735},{"type":680,"tag":704,"props":928,"children":930},{"className":929},[],[931],{"type":685,"value":755},{"type":685,"value":757},{"data":934,"body":935},{},{"type":677,"children":936},[937],{"type":680,"tag":681,"props":938,"children":939},{},[940,942,947,949,953,955,960,962,965],{"type":685,"value":941},"Cookie — это механизм HTTP-состояния: сервер задаёт значения, браузер хранит их и автоматически прикрепляет к запросам в заголовке ",{"type":680,"tag":704,"props":943,"children":945},{"className":944},[],[946],{"type":685,"value":779},{"type":685,"value":948}," при соблюдении правил области видимости.",{"type":680,"tag":950,"props":951,"children":952},"br",{},[],{"type":685,"value":954},"\nПод «управлением cookie» обычно понимаются операции чтения, записи/обновления и удаления, которые могут выполняться сервером через ",{"type":680,"tag":704,"props":956,"children":958},{"className":957},[],[959],{"type":685,"value":804},{"type":685,"value":961}," и частично — клиентом через Web API.",{"type":680,"tag":950,"props":963,"children":964},{},[],{"type":685,"value":966},"\nДаже при записи с клиента окончательное поведение (хранение и отправка) контролируется браузером, а не JavaScript-кодом.",{"data":968,"body":969},{},{"type":677,"children":970},[971],{"type":680,"tag":681,"props":972,"children":973},{},[974],{"type":685,"value":18},{"data":976,"body":977},{},{"type":677,"children":978},[979,1024,1029,1040,1051,1062,1087,1092],{"type":680,"tag":681,"props":980,"children":981},{},[982,984,989,991,994,996,1002,1004,1010,1012,1015,1017,1022],{"type":685,"value":983},"С клиента доступны чтение и запись cookie, привязанных к текущему документу, через ",{"type":680,"tag":704,"props":985,"children":987},{"className":986},[],[988],{"type":685,"value":709},{"type":685,"value":990}," (строковый интерфейс: чтение возвращает строку, запись устанавливает одну cookie за операцию).",{"type":680,"tag":950,"props":992,"children":993},{},[],{"type":685,"value":995},"\nВ поддерживаемых браузерах возможен Cookie Store API — асинхронный интерфейс ",{"type":680,"tag":704,"props":997,"children":999},{"className":998},[],[1000],{"type":685,"value":1001},"cookieStore.*",{"type":685,"value":1003},", полезный в окружениях без ",{"type":680,"tag":704,"props":1005,"children":1007},{"className":1006},[],[1008],{"type":685,"value":1009},"document",{"type":685,"value":1011}," (например, в service worker).",{"type":680,"tag":950,"props":1013,"children":1014},{},[],{"type":685,"value":1016},"\nДоступна только работа с «скриптовыми» cookie: те, которые не помечены ",{"type":680,"tag":704,"props":1018,"children":1020},{"className":1019},[],[1021],{"type":685,"value":725},{"type":685,"value":1023},", и которые попадают в допустимую область домена/пути текущей страницы.",{"type":680,"tag":681,"props":1025,"children":1026},{},[1027],{"type":685,"value":1028},"Примеры (как обычный текст, без выделения блоков):",{"type":680,"tag":681,"props":1030,"children":1031},{},[1032,1034],{"type":685,"value":1033},"Чтение всех доступных cookie текущего документа:\n",{"type":680,"tag":704,"props":1035,"children":1037},{"className":1036},[],[1038],{"type":685,"value":1039},"const all = document.cookie;",{"type":680,"tag":681,"props":1041,"children":1042},{},[1043,1045],{"type":685,"value":1044},"Установка cookie (на год, для всего сайта):\n",{"type":680,"tag":704,"props":1046,"children":1048},{"className":1047},[],[1049],{"type":685,"value":1050},"document.cookie = \"theme=dark; Path=/; Max-Age=31536000\";",{"type":680,"tag":681,"props":1052,"children":1053},{},[1054,1056],{"type":685,"value":1055},"Обновление cookie (по сути — повторная установка с тем же именем):\n",{"type":680,"tag":704,"props":1057,"children":1059},{"className":1058},[],[1060],{"type":685,"value":1061},"document.cookie = \"theme=light; Path=/; Max-Age=31536000\";",{"type":680,"tag":681,"props":1063,"children":1064},{},[1065,1067,1072,1074,1079,1081],{"type":685,"value":1066},"Удаление cookie (истечение срока; важны совпадения ",{"type":680,"tag":704,"props":1068,"children":1070},{"className":1069},[],[1071],{"type":685,"value":741},{"type":685,"value":1073}," и при наличии — ",{"type":680,"tag":704,"props":1075,"children":1077},{"className":1076},[],[1078],{"type":685,"value":733},{"type":685,"value":1080},"):\n",{"type":680,"tag":704,"props":1082,"children":1084},{"className":1083},[],[1085],{"type":685,"value":1086},"document.cookie = \"theme=; Path=/; Max-Age=0\";",{"type":680,"tag":681,"props":1088,"children":1089},{},[1090],{"type":685,"value":1091},"Пример Cookie Store API (установка и чтение):",{"type":680,"tag":1093,"props":1094,"children":1098},"pre",{"className":1095,"code":1097,"language":685},[1096],"language-text","async function demo() {\n  await cookieStore.set(\"cookie1\", \"value1\");\n  const c = await cookieStore.get(\"cookie1\");\n  console.log(c);\n}\n",[1099],{"type":680,"tag":704,"props":1100,"children":1102},{"__ignoreMap":1101},"",[1103],{"type":685,"value":1097},{"data":1105,"body":1106},{},{"type":677,"children":1107},[1108],{"type":680,"tag":681,"props":1109,"children":1110},{},[1111,1113,1118,1120,1125],{"type":685,"value":1112},"Ситуация «cookie видна в DevTools, но не читается через ",{"type":680,"tag":704,"props":1114,"children":1116},{"className":1115},[],[1117],{"type":685,"value":709},{"type":685,"value":1119},"» чаще всего объясняется атрибутом ",{"type":680,"tag":704,"props":1121,"children":1123},{"className":1122},[],[1124],{"type":685,"value":725},{"type":685,"value":1126}," и является ожидаемым поведением.",{"data":1128,"body":1129},{},{"type":677,"children":1130},[1131,1160,1165],{"type":680,"tag":681,"props":1132,"children":1133},{},[1134,1136,1141,1143,1146,1148,1151,1153,1158],{"type":685,"value":1135},"Cookie с атрибутом ",{"type":680,"tag":704,"props":1137,"children":1139},{"className":1138},[],[1140],{"type":685,"value":725},{"type":685,"value":1142}," принципиально недоступны JavaScript: они предназначены для передачи только через HTTP и скрываются от скриптовых API.",{"type":680,"tag":950,"props":1144,"children":1145},{},[],{"type":685,"value":1147},"\nНельзя корректно «заставить» браузер принять cookie для произвольного чужого домена из кода страницы: область cookie связана с доменными правилами и origin-ограничениями.",{"type":680,"tag":950,"props":1149,"children":1150},{},[],{"type":685,"value":1152},"\nНельзя считать надёжным «управлением cookie» попытку вручную подставлять заголовок ",{"type":680,"tag":704,"props":1154,"children":1156},{"className":1155},[],[1157],{"type":685,"value":779},{"type":685,"value":1159}," в запросах: браузер формирует отправку cookie сам, по cookie-движку и политикам безопасности.",{"type":680,"tag":681,"props":1161,"children":1162},{},[1163],{"type":685,"value":1164},"Таблица возможностей:",{"type":680,"tag":1166,"props":1167,"children":1168},"table",{},[1169,1194],{"type":680,"tag":1170,"props":1171,"children":1172},"thead",{},[1173],{"type":680,"tag":1174,"props":1175,"children":1176},"tr",{},[1177,1183,1189],{"type":680,"tag":1178,"props":1179,"children":1180},"th",{},[1181],{"type":685,"value":1182},"Действие",{"type":680,"tag":1178,"props":1184,"children":1186},{"align":1185},"right",[1187],{"type":685,"value":1188},"Возможно с клиента",{"type":680,"tag":1178,"props":1190,"children":1191},{},[1192],{"type":685,"value":1193},"Комментарий",{"type":680,"tag":1195,"props":1196,"children":1197},"tbody",{},[1198,1232,1262,1306,1329,1346],{"type":680,"tag":1174,"props":1199,"children":1200},{},[1201,1207,1212],{"type":680,"tag":1202,"props":1203,"children":1204},"td",{},[1205],{"type":685,"value":1206},"Прочитать обычные cookie текущего документа",{"type":680,"tag":1202,"props":1208,"children":1209},{"align":1185},[1210],{"type":685,"value":1211},"Да",{"type":680,"tag":1202,"props":1213,"children":1214},{},[1215,1217,1222,1224,1230],{"type":685,"value":1216},"Через ",{"type":680,"tag":704,"props":1218,"children":1220},{"className":1219},[],[1221],{"type":685,"value":709},{"type":685,"value":1223}," или ",{"type":680,"tag":704,"props":1225,"children":1227},{"className":1226},[],[1228],{"type":685,"value":1229},"cookieStore.get*()",{"type":685,"value":1231}," (если доступно).",{"type":680,"tag":1174,"props":1233,"children":1234},{},[1235,1240,1244],{"type":680,"tag":1202,"props":1236,"children":1237},{},[1238],{"type":685,"value":1239},"Записать/обновить cookie текущего контекста",{"type":680,"tag":1202,"props":1241,"children":1242},{"align":1185},[1243],{"type":685,"value":1211},{"type":680,"tag":1202,"props":1245,"children":1246},{},[1247,1248,1253,1254,1260],{"type":685,"value":1216},{"type":680,"tag":704,"props":1249,"children":1251},{"className":1250},[],[1252],{"type":685,"value":709},{"type":685,"value":1223},{"type":680,"tag":704,"props":1255,"children":1257},{"className":1256},[],[1258],{"type":685,"value":1259},"cookieStore.set()",{"type":685,"value":1261},", но с ограничениями атрибутов и области.",{"type":680,"tag":1174,"props":1263,"children":1264},{},[1265,1270,1274],{"type":680,"tag":1202,"props":1266,"children":1267},{},[1268],{"type":685,"value":1269},"Удалить cookie",{"type":680,"tag":1202,"props":1271,"children":1272},{"align":1185},[1273],{"type":685,"value":1211},{"type":680,"tag":1202,"props":1275,"children":1276},{},[1277,1278,1284,1286,1292,1294,1299,1300,1305],{"type":685,"value":1216},{"type":680,"tag":704,"props":1279,"children":1281},{"className":1280},[],[1282],{"type":685,"value":1283},"Max-Age=0",{"type":685,"value":1285},"/прошлый ",{"type":680,"tag":704,"props":1287,"children":1289},{"className":1288},[],[1290],{"type":685,"value":1291},"Expires",{"type":685,"value":1293},", при совпадении ",{"type":680,"tag":704,"props":1295,"children":1297},{"className":1296},[],[1298],{"type":685,"value":741},{"type":685,"value":735},{"type":680,"tag":704,"props":1301,"children":1303},{"className":1302},[],[1304],{"type":685,"value":733},{"type":685,"value":789},{"type":680,"tag":1174,"props":1307,"children":1308},{},[1309,1319,1324],{"type":680,"tag":1202,"props":1310,"children":1311},{},[1312,1314],{"type":685,"value":1313},"Прочитать/изменить ",{"type":680,"tag":704,"props":1315,"children":1317},{"className":1316},[],[1318],{"type":685,"value":725},{"type":680,"tag":1202,"props":1320,"children":1321},{"align":1185},[1322],{"type":685,"value":1323},"Нет",{"type":680,"tag":1202,"props":1325,"children":1326},{},[1327],{"type":685,"value":1328},"Флаг создан для защиты от чтения из JS (снижение риска кражи при XSS).",{"type":680,"tag":1174,"props":1330,"children":1331},{},[1332,1337,1341],{"type":680,"tag":1202,"props":1333,"children":1334},{},[1335],{"type":685,"value":1336},"Установить cookie «на чужой домен»",{"type":680,"tag":1202,"props":1338,"children":1339},{"align":1185},[1340],{"type":685,"value":1323},{"type":680,"tag":1202,"props":1342,"children":1343},{},[1344],{"type":685,"value":1345},"Браузер применяет доменные правила и не даёт произвольно расширять область.",{"type":680,"tag":1174,"props":1347,"children":1348},{},[1349,1354,1358],{"type":680,"tag":1202,"props":1350,"children":1351},{},[1352],{"type":685,"value":1353},"Гарантировать отправку в third-party контекстах",{"type":680,"tag":1202,"props":1355,"children":1356},{"align":1185},[1357],{"type":685,"value":1323},{"type":680,"tag":1202,"props":1359,"children":1360},{},[1361,1363,1368,1369,1374],{"type":685,"value":1362},"Отправка зависит от ",{"type":680,"tag":704,"props":1364,"children":1366},{"className":1365},[],[1367],{"type":685,"value":755},{"type":685,"value":850},{"type":680,"tag":704,"props":1370,"children":1372},{"className":1371},[],[1373],{"type":685,"value":748},{"type":685,"value":1375}," и политик браузера (third-party блокировки).",{"data":1377,"body":1378},{},{"type":677,"children":1379},[1380],{"type":680,"tag":681,"props":1381,"children":1382},{},[1383,1385,1390,1392,1398,1399,1405,1406,1412,1414,1420,1422,1427,1428,1431,1433,1436,1438,1444],{"type":685,"value":1384},"Атрибут ",{"type":680,"tag":704,"props":1386,"children":1388},{"className":1387},[],[1389],{"type":685,"value":755},{"type":685,"value":1391}," управляет тем, будет ли cookie отправляться в кросс-сайтовых контекстах (",{"type":680,"tag":704,"props":1393,"children":1395},{"className":1394},[],[1396],{"type":685,"value":1397},"Strict",{"type":685,"value":850},{"type":680,"tag":704,"props":1400,"children":1402},{"className":1401},[],[1403],{"type":685,"value":1404},"Lax",{"type":685,"value":850},{"type":680,"tag":704,"props":1407,"children":1409},{"className":1408},[],[1410],{"type":685,"value":1411},"None",{"type":685,"value":1413},"), при этом для ",{"type":680,"tag":704,"props":1415,"children":1417},{"className":1416},[],[1418],{"type":685,"value":1419},"SameSite=None",{"type":685,"value":1421}," обычно требуется ",{"type":680,"tag":704,"props":1423,"children":1425},{"className":1424},[],[1426],{"type":685,"value":748},{"type":685,"value":789},{"type":680,"tag":950,"props":1429,"children":1430},{},[],{"type":685,"value":1432},"\nИз‑за ужесточения политики third-party cookie в браузерах поведение embedded-сценариев (iframe, виджеты, сторонняя авторизация) всё чаще определяется настройками приватности и механизмами анти-трекинга, а не только кодом.",{"type":680,"tag":950,"props":1434,"children":1435},{},[],{"type":685,"value":1437},"\nДля совместимости развиваются подходы вроде партиционирования cookie (CHIPS/",{"type":680,"tag":704,"props":1439,"children":1441},{"className":1440},[],[1442],{"type":685,"value":1443},"Partitioned",{"type":685,"value":1445},") и Storage Access API, но они не дают «полного контроля», а задают регламентированный путь к ограниченному доступу.",{"data":1447,"body":1448},{},{"type":677,"children":1449},[1450],{"type":680,"tag":681,"props":1451,"children":1452},{},[1453],{"type":685,"value":46},{"data":1455,"body":1456},{},{"type":677,"children":1457},[1458],{"type":680,"tag":681,"props":1459,"children":1460},{},[1461,1463,1468,1470,1475,1477,1482,1484,1489,1490,1495],{"type":685,"value":1462},"Кратко: С клиента управлять cookie можно, но не полностью: разрешены чтение/запись и удаление обычных cookie в рамках текущего сайта через ",{"type":680,"tag":704,"props":1464,"children":1466},{"className":1465},[],[1467],{"type":685,"value":709},{"type":685,"value":1469}," (и иногда ",{"type":680,"tag":704,"props":1471,"children":1473},{"className":1472},[],[1474],{"type":685,"value":717},{"type":685,"value":1476},"), однако ",{"type":680,"tag":704,"props":1478,"children":1480},{"className":1479},[],[1481],{"type":685,"value":725},{"type":685,"value":1483}," скрывает cookie от JavaScript, а ",{"type":680,"tag":704,"props":1485,"children":1487},{"className":1486},[],[1488],{"type":685,"value":748},{"type":685,"value":735},{"type":680,"tag":704,"props":1491,"children":1493},{"className":1492},[],[1494],{"type":685,"value":755},{"type":685,"value":1496}," и third-party ограничения браузеров определяют, будут ли cookie работать и отправляться в запросах.",1775735659908]