Тема, мета та посилання
Тема: БЕЗПЕКА ТА ПРОДУКТИВНІСТЬ СЕРВЕРНИХ ДОДАТКІВ. БЕЗПЕКА NODE.JS-ДОДАТКІВ. ОПТИМІЗАЦІЯ ЗАПИТІВ І КЕШУВАННЯ. ТЕСТУВАННЯ АРІ.
Мета: Навчитися забезпечувати базову безпеку Node.js-додатків, оптимізувати продуктивність REST API, використовувати кешування для зменшення навантаження на сервер, тестувати АРІ за допомогою сучасних інструментів та аналізувати продуктивність backend-застосунків.
Посилання на виконані завдання:
- Репозиторій власного веб-застосунку (GitHub): [https://github.com/lerakovaliuk/ecoplant-shop]
- Власний веб-застосунок (Жива сторінка): [https://lerakovaliuk.github.io/ecoplant-shop/]
- Репозиторій звітного документа (GitHub): [https://github.com/lerakovaliuk/IS-32_appRECORD-KovaliukValeriia-FIOT-2026]
- Звітний документ (Жива сторінка): [https://lerakovaliuk.github.io/IS-32_appRECORD-KovaliukValeriia-FIOT-2026/]
1. Теоретичний опис та архітектура рішення
Під час виконання лабораторної роботи було вдосконалено існуючий REST API застосунок з фокусом на безпеку та продуктивність.
Для захисту від поширених веб-вразливостей (XSS, витік даних) було інтегровано middleware Helmet, який автоматично налаштовує безпечні HTTP-заголовки. Для захисту від брутфорс-атак та DDoS застосовано express-rate-limit. Валідацію вхідних даних (захист від SQL/NoSQL ін’єкцій та некоректних даних) реалізовано за допомогою express-validator.
Для оптимізації продуктивності та зменшення навантаження на базу даних було інтегровано In-memory кешування за допомогою бібліотеки node-cache.
Перевірка працездатності здійснювалась на двох рівнях:
- Автоматизоване Unit та Integration тестування маршрутів за допомогою Jest та Supertest.
- Навантажувальне тестування (Load Testing) за допомогою інструменту Artillery для аналізу часу відповіді сервера при великій кількості одночасних запитів.
2. Реалізація завдань з програмним кодом
Нижче наведено фрагменти коду (з файлу server.js та server.test.js), що демонструють виконання основних завдань лабораторної роботи.
Завдання 2. Реалізація захисту API (Helmet, Rate-Limit, Валідація)
У файл server.js додано захист заголовків та обмеження кількості запитів для захисту від перевантажень.
const helmet = require('helmet');
const rateLimit = require('express-rate-limit');
const { body, validationResult } = require('express-validator');
// Захист HTTP-заголовків
app.use(helmet());
// Захист від брутфорсу (не більше 5 запитів на 15 хв для авторизації)
const loginLimiter = rateLimit({ windowMs: 15 * 60 * 1000, max: 5 });
app.post("/login", loginLimiter, async (req, res) => { /* ... */ });
// Валідація даних при створенні ресурсу
app.post('/products', [
body('name').isLength({ min: 3 }).withMessage('Ім\'я має містити мінімум 3 символи'),
body('price').isNumeric().withMessage('Ціна має бути числом')
], (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
// ... збереження даних ...
}); Завдання 3 та 4. Реалізація кешування відповідей та оптимізація маршруту
Маршрут GET /products оптимізовано за допомогою node-cache. Якщо дані є в кеші, вони повертаються миттєво, обминаючи звернення до масиву/БД.
const NodeCache = require('node-cache');
const cache = new NodeCache({ stdTTL: 60 }); // Час життя кешу - 60 секунд
app.get('/products', (req, res) => {
const cached = cache.get('products');
if (cached) {
return res.json({ source: 'cache', data: cached });
}
// Імітація звернення до бази даних
cache.set('products', products);
res.json({ source: 'database', data: products });
}); Завдання 5. Автоматизоване тестування API (Jest)
Створено файл server.test.js для перевірки маршрутів та коректності відпрацювання помилок валідації.
const request = require('supertest');
describe('Тестування API EcoPlant', () => {
test('GET /products - має повернути статус 200', async () => {
const response = await request('http://localhost:3000').get('/products');
expect(response.statusCode).toBe(200);
expect(response.body).toHaveProperty('source');
});
test('POST /products - помилка валідації при неправильних даних', async () => {
const response = await request('http://localhost:3000')
.post('/products')
.send({ name: "A", price: "безцінно" });
expect(response.statusCode).toBe(400);
expect(response.body).toHaveProperty('errors');
});
}); 3. Тестування та аналіз продуктивності (Скріншоти)
1. Перевірка кешування (Postman)
(Демонстрація отримання даних із бази даних при першому запиті, та з кешу (source: "cache") при повторному) 
2. Перевірка валідації даних (Postman)
(Демонстрація відхилення запиту зі статусом 400 Bad Request при введенні некоректних даних для створення товару) 
3. Автоматизоване тестування (Jest + Supertest)
(Успішне проходження написаних тестів для перевірки маршрутів GET та POST) 
4. Навантажувальне тестування (Artillery)
(Запуск команди npx artillery quick --count 50 --num 20 http://localhost:3000/products) 
Завдання 6. Аналіз продуктивності до та після оптимізації
Для дослідження продуктивності було проведено навантажувальне тестування маршруту GET /products (1000 запитів).
Аналіз результатів: Завдяки впровадженню In-memory кешування (node-cache), серверу не доводилося виконувати повторні операції пошуку даних (звернення до БД) для кожного з 1000 запитів. Усі запити, починаючи з другого, обслуговувалися безпосередньо з оперативної пам’яті.
Згідно зі звітом інструменту Artillery, середній час відповіді сервера (Median response time) склав 0 мілісекунд, а показник p95 (95% запитів оброблено швидше за цей час) склав 1 мілісекунду.
Це свідчить про колосальне зниження навантаження на базу даних та максимальну оптимізацію продуктивності API. Без використання кешування час відповіді при такому навантаженні зростав би лінійно через черги до бази даних.
Висновки
Під час виконання лабораторної роботи було успішно застосовано комплексний підхід до розробки безпечних та швидких серверних додатків на платформі Node.js.
Набуті навички: На практиці було інтегровано засоби захисту від поширених атак: Helmet для безпеки HTTP-заголовків, express-rate-limit для запобігання DDoS-атакам, та express-validator для жорсткої перевірки вхідних даних. Було реалізовано механізм In-memory кешування (node-cache), що є критично важливим для високонавантажених систем. Також було опановано інструменти автоматизованого (Unit/Integration) тестування за допомогою Jest та Supertest.
Узагальнення отриманих результатів: У результаті роботи серверний застосунок став не лише стійким до спроб передачі шкідливих даних, але й продемонстрував високу продуктивність. Аналіз навантажувального тестування за допомогою інструменту Artillery підтвердив, що використання кешування дозволяє серверу обробляти тисячі одночасних запитів із затримкою менше 1 мілісекунди. Застосунок повністю відповідає сучасним стандартам розробки (безпека + швидкість + автоматизовані тести).
