nmk

Лекція №18 (2 години). Деплоймент, безпека та архітектура: Життєвий цикл Production-додатку

План лекції

  1. CI/CD пайплайни: Автоматизація збірки та тестування (GitHub Actions).
  2. Стратегії розгортання (Deployment): PaaS (Vercel/Netlify) проти Контейнеризації (Docker/AWS).
  3. Web Security у React: Захист від XSS (Cross-Site Scripting) та CSRF.
  4. Управління секретами (Environment Variables) та безпека токенів.
  5. Макро-архітектури Frontend-у: Моноліт, Мікрофронтенди (Module Federation).
  6. Моніторинг та аналітика Production-середовища (Sentry, Lighthouse).
  7. Огляд впливу Штучного Інтелекту (AI) на процес розробки та етика інженера.

Перелік умовних скорочень

Вступ

Розгляд завершальних етапів розробки: збирання, тестування (CI/CD) та розгортання на хостингах (Vercel, AWS). Аналіз основних вразливостей (XSS), налаштування систем моніторингу помилок після релізу та розгляд архітектурних рішень (Мікрофронтенди) для масштабних корпоративних систем.

Доведення коду до стану git commit — це лише середина життєвого циклу програмного продукту. Для інженерів 4-го курсу критично важливо розуміти процес “доставки” цього коду до кінцевого мільйонного користувача так, щоб система не впала від навантаження, не була зламана хакерами та автоматично оновлювалась без втручання людини. Ця фінальна лекція присвячена “дорослому” світу Frontend-архітектури (DevOps для Frontend), стандартам веб-безпеки OWASP та сучасним підходам до масштабування кодових баз, коли в одному репозиторії працюють сотні розробників одночасно.


1. CI/CD пайплайни: Залізний конвеєр

Continuous Integration (CI): Безперервна інтеграція. Це процес, який автоматизує злиття коду (Merge) від багатьох розробників у головну гілку main. Замість того, щоб вірити розробнику “на слово”, що його код працює, підключається CI-сервер (наприклад, GitHub Actions, GitLab CI).

Continuous Deployment (CD): Безперервне розгортання. Процес автоматичної доставки перевіреного коду на публічні сервери, щоб його побачили користувачі.

Типовий Pipeline (Github Actions YAML файл):

  1. Розробник робить push своєї гілки.
  2. Сервер Github піднімає віртуальну Linux-машину на 2 хвилини.
  3. Встановлює залежності (npm ci замість npm i для точної фіксації версій).
  4. Запускає сканер лінтера: npm run lint (Перевірка на сміття у коді).
  5. Запускає всі тести: npm run test (Якість логіки).
  6. Запускає збірку npm run build (Чи компілюється TypeScript? Чи не падає Webpack/Vite?).
  7. Якщо пункти 4-6 успішні -> зелена галочка, код дозволено зливати. Якщо злиття пройшло в main -> автоматично відправити файли збірки (/dist або /.next) на AWS або Vercel.

2. Стратегії розгортання (Deployment)

Frontend-системи зараз деплояться двома принципово різними шляхами.

Шлях А: PaaS (Platform as a Service)

Лідери — Vercel, Netlify, Cloudflare Pages. Цей шлях створений спеціально для сучасних SSG/SSR фреймворків (Next.js, Remix). Ви просто даєте Vercel посилання на ваш GitHub репозиторій. Vercel сам відстежує коміти, сам запускає білд і миттєво роздає ваш сайт на 300+ серверів по всьому світу (CDN edge networks) так, що користувач в Японії і користувач в Україні отримують сайт з найближчого до них дата-центру за 50 мілісекунд.

Шлях Б: Контейнеризація (Docker & Kubernetes)

Використовується корпораціями з високими вимогами до безпеки (Банки, Медицина), які не можуть віддавати свій код на публічний Vercel, або використовують класичні SPA додатки (без SSR).

  1. Репозиторій містить файл Dockerfile. Це інструкція збірки.
  2. У Dockerfile описано: “Візьми чистий Nginx (веб-сервер), поклади в папку /usr/share/nginx/html файли після npm run build і відкрий порт 80”.
  3. Збірка перетворюється на “Контейнер” (ніби віртуальну флешку), яку можна запустити на будь-якому сервері (AWS, Azure) за допомогою команди docker run.

3. Web Security у React: Захист від XSS

Світ фронтенду є публічним (будь-хто може натиснути F12 і прочитати ваш JS код). Тому головне правило архітектури: “Ніколи не довіряй клієнту”.

Головна вразливість клієнтських додатків — XSS (Cross-Site Scripting). Це коли зловмисник вставляє (injects) шкідливий JavaScript замість тексту, наприклад, у форму коментарів: <img src="x" onerror="alert(document.cookie)">. Коли інші користувачі відкривають цей коментар, скрипт виконується у їхніх браузерах і краде їхні паролі чи сесії.

Як React захищає від XSS? React “з коробки” має сильну броню: всі дані (Props та State), що генеруються у JSX-дужках {user.name}, автоматично проходять процес Екранування (Escaping). Тег <script> перетвориться у безпечний рядок &lt;script&gt; і просто відрендериться як текст, не виконавшись як код.

Коли React вразливий: Проте є обхідний маневр (Escape Hatch). Властивість dangerouslySetInnerHTML. Її використовують для рендеру статей з баз даних формату WYSIWYG або Markdown.

// ❌ АРХІТЕКТУРНА ПОМИЛКА: XSS ВРАЗЛИВІСТЬ!
// Якщо в user.bio буде <script>...</script>, він виконається!
const UserProfile = () => {
  return <div dangerouslySetInnerHTML=></div>;
};

// ✅ РІШЕННЯ: САНІТАРИЗАЦІЯ (Sanitization)
// Використовуємо бібліотеку DOMPurify перед рендером
import DOMPurify from "dompurify";

const SafeProfile = () => {
  // Всі шкідливі теги (object, script, iframe) будуть вирізані, залишаться лише безпечні (p, b, i)
  const cleanHtml = DOMPurify.sanitize(user.bio);
  return <div dangerouslySetInnerHTML=></div>;
};

4. Безпека Авторизації: Де зберігати JWT токени?

Після логіну сервер віддає клієнту Токен доступу (JWT). Клієнтський додаток має його десь зберігати, щоб відправляти з кожним наступним API-запитом.

Поширені помилки Junior-розробників:

Правильний Enterprise-шлях (BFF - Backend for Frontend):


5. Макро-архітектури: Мікрофронтенди (Micro Frontends)

Коли додаток (Моноліт) розростається до масштабів Netflix або AliExpress, збірка Webpack може тривати годину, а зміни команди “А” постійно ламають код команди “Б”.

Парадигма Мікросервісів для бекенду отримала свого брата у фронтенді — Мікрофронтенди. Це архітектура, де візуально єдиний сайт (Single Page Application) насправді є агрегацією кількох абсолютно незалежних міні-додатків, розроблених різними командами.


6. Sentry: Моніторинг Production-середовища

“В мене на локальному комп’ютері працює”, — ця фраза не має сенсу у Production, де у мільйонів клієнтів можуть бути старі браузери, AdBlock-розширення чи перебої з інтернетом.

Коли після релізу в додаток заходить клієнт, і в нього стається фатальний JavaScript Error, екран стає білим. Розробники ніколи про це не дізнаються, бо це сталося у браузері клієнта, а не на сервері.

Для вирішення цього використовують системи “Відстеження помилок” (Error Tracking), стандартом з яких є Sentry.io. В корінь React-проєкту додається ErrorBoundary від Sentry. Якщо будь-який компонент викидає TypeError чи обривається Promise, Sentry “перехоплює” його і робить скріншот стек-трейсу, версію браузера клієнта, інформацію про його кліки перед помилкою і відправляє це JSON-звітом на сервер розробників у Telegram/Slack або Jira. Це дозволяє команді швидко писати Hotfixes ще до того, як клієнти залишать скарги у підтримці.


Висновки (до всього курсу React)

  1. Шлях розробника 4-го курсу еволюціонує від простого створення “кнопок з компонентами” до розуміння життєвого циклу інженерного продукту (CI/CD Pipeline), де автоматизація контролю якості замінює “людський фактор”.
  2. З точки зору архітектури інфраструктури, вибір між PaaS (Vercel) та IaaS (Docker-контейнери) диктується бізнес-вимогами до швидкості доступу клієнтів (CDN) та корпоративними стандартами контролю над серверами.
  3. Безпека Frontend додатку (Web Security) будується на параноїдальній недовірі до будь-яких даних, що приходять із зовнішнього середовища. Вмонтована екранізація (Escaping) у React має підкріплюватися санітаризацією сирого HTML-вводу через бібліотеки типу DOMPurify для запобігання XSS-атакам.
  4. Правильне управління авторизацією забороняє зберігання критичних даних (JWT) у сховищах, вразливих до клієнтського скриптингу (localStorage), передаючи відповідальність за керування сесіями у захищені HttpOnly Cookies.
  5. Зростання кодової бази, яке неминуче приносить проблеми з часом компіляції та командної синхронізації у Монолітах, ефективно вирішується стратегією Мікрофронтендів (Module Federation).
  6. Реальний стан додатку в Production неможливо об’єктивно оцінити без телеметрії. Встановлення і аналіз метрик через сервіси типу Sentry є ключовою компетенцією DevOps та Senior Frontend Engineering, забезпечуючи перехід коду від стану “написано” до стану “створює цінність”.

Джерела

  1. Офіційна документація GitHub Actions “CI/CD Introduction”. URL: https://docs.github.com/en/actions
  2. Docker Documentation. “Containerizing a React/Node app”.
  3. OWASP (Open Web Application Security Project) “Cross Site Scripting (XSS) Prevention Cheat Sheet”. URL: https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html
  4. “Why You Should Never Store JWT In localStorage”. DEV Community Articles.
  5. “Micro Frontends Architecture” by Cam Jackson (MartinFowler.com). URL: https://martinfowler.com/articles/micro-frontends.html
  6. Webpack 5 Release Notes - Module Federation.
  7. Sentry.io Official Documentation for React. URL: https://docs.sentry.io/platforms/javascript/guides/react/

Запитання для самоперевірки

  1. Опишіть 5 ключових кроків автоматизованого пайплайну (CI/CD) на базі GitHub Actions після того, як розробник відкрив Pull Request з новою фічею. Які операції обов’язково повинні завершитися без помилок перед дозволом на злиття коду?
  2. В чому полягає різниця між підходом PaaS (Vercel), де розробник просто вказує репозиторій, і підходом IaaS (Docker), і в якій індустрії (наприклад, банківській чи медійній) і чому архітектор обере другий варіант?
  3. З точки зору кібербезпеки, детально поясніть вектор атаки XSS (Cross-Site Scripting) у React-додатку. Яка специфічна властивість React “відкриває” двері для цієї вразливості та за допомогою якого підходу її можна нейтралізувати?
  4. Проаналізуйте недоліки збереження токену доступу (JWT) у localStorage браузера порівняно з Cookie, яка має прапорець HttpOnly. Чим зловмисник може скористатися в першому випадку і що блокує його в другому?
  5. Які організаційні та інженерні проблеми (командна робота, час компіляції) класичної Монолітної Frontend-архітектури вирішує парадигма “Мікрофронтендів”?
  6. Чому наявність ідеальних E2E тестів до фінального релізу все одно змушує інженерні команди інтегрувати системи моніторингу типу Sentry під час експлуатації продукту в Production-середовищі? Що вони можуть зафіксувати такого, чого не помітять тести?