Пошук уроків, статей та іншого контенту
Дізнаємося, як встановлювати, читати й видаляти cookies та налаштовувати їхні основні атрибути.
Cookie — це невеликий фрагмент даних, який браузер зберігає для певного домену та надсилає назад у наступних HTTP-запитах.
Cookies часто використовують для:
збереження ідентифікатора сесії;
запам’ятовування налаштувань користувача;
збереження стану авторизації;
тимчасового зберігання невеликих значень.
Cookie встановлюється сервером за допомогою заголовка Set-Cookie:
Set-Cookie: theme=dark; Max-Age=3600; Path=/Після цього браузер надсилатиме його серверу в заголовку
Cookie: theme=darkNode.js не зберігає cookies автоматично. Сервер має самостійно:
сформувати заголовок Set-Cookie;
прочитати заголовок Cookie;
за потреби видалити cookie.
У Node.js заголовки відповіді можна встановити за допомогою response.setHeader():
const http = require('node:http');
const server = http.createServer((request, response) => {
response.setHeader(
'Set-Cookie',
'theme=dark; Max-Age=3600; Path=/; HttpOnly; SameSite=Lax'
);
response.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
response.end('Cookie встановлено');
});
server.listen(3000, () => {
console.log('Сервер запущено на http://localhost:3000');
});У цьому прикладі:
theme=dark — ім’я та значення cookie;
Max-Age=3600 — cookie зберігатиметься 3600 секунд;
Path=/ — cookie доступна для всіх шляхів сайту;
HttpOnly — cookie недоступна для JavaScript у браузері;
SameSite=Lax — обмежує надсилання cookie у міжсайтових запитах.
Після того як відповідь буде надіслана, змінювати її заголовки вже не можна. Тому Set-Cookie потрібно встановити до виклику response.end() або до початку надсилання тіла відповіді.
Браузер надсилає cookies у заголовку Cookie:
Cookie: theme=dark; language=ukУ Node.js цей заголовок доступний через request.headers.cookie.
Node.js не має вбудованого методу для перетворення цього рядка на об’єкт, тому його потрібно розібрати самостійно або використати бібліотеку. Для простих випадків можна написати невелику функцію:
function parseCookies(cookieHeader = '') {
const cookies = {};
for (const part of cookieHeader.split(';')) {
const separatorIndex = part.indexOf('=');
if (separatorIndex === -1) {
continue;
}
const name = part.slice(0, separatorIndex).trim();
const value = part.slice(separatorIndex + 1).trim();
try {
cookies[name] = decodeURIComponent(value);
} catch {
// Якщо значення некоректно закодоване, залишаємо його як є
cookies[name] = value;
}
}
return cookies;
}Використання:
const cookies = parseCookies(request.headers.cookie);
const theme = cookies.theme;Значення cookie потрібно вважати зовнішніми даними. Не слід без перевірки довіряти йому, особливо якщо воно впливає на права доступу або інші важливі операції.
Наведений сервер має три маршрути:
GET /set — встановлює cookie;
GET /read — читає cookie;
GET /delete — видаляє cookie.
const http = require('node:http');
function parseCookies(cookieHeader = '') {
const cookies = {};
for (const part of cookieHeader.split(';')) {
const separatorIndex = part.indexOf('=');
if (separatorIndex === -1) {
continue;
}
const name = part.slice(0, separatorIndex).trim();
const value = part.slice(separatorIndex + 1).trim();
try {
cookies[name] = decodeURIComponent(value);
} catch {
// Якщо значення некоректно закодоване, залишаємо його як є
cookies[name] = value;
}
}
return cookies;
}
function sendText(response, statusCode, text) {
response.writeHead(statusCode, {
'Content-Type': 'text/plain; charset=utf-8'
});
response.end(text);
}
const server = http.createServer((request, response) => {
const requestUrl = new URL(
request.url,
`http://${request.headers.host || 'localhost'}`
);
if (request.method === 'GET' && requestUrl.pathname === '/set') {
const value = encodeURIComponent('Олена');
response.setHeader(
'Set-Cookie',
`username=${value}; Max-Age=3600; Path=/; HttpOnly; SameSite=Lax`
);
sendText(response, 200, 'Cookie username встановлено');
return;
}
if (request.method === 'GET' && requestUrl.pathname === '/read') {
const cookies = parseCookies(request.headers.cookie);
const username = cookies.username || 'Cookie не знайдено';
sendText(response, 200, `username: ${username}`);
return;
}
if (request.method === 'GET' && requestUrl.pathname === '/delete') {
response.setHeader(
'Set-Cookie',
'username=; Max-Age=0; Path=/; HttpOnly; SameSite=Lax'
);
sendText(response, 200, 'Cookie username видалено');
return;
}
sendText(response, 404, 'Сторінку не знайдено');
});
server.listen(3000, () => {
console.log('Сервер запущено на http://localhost:3000');
});Запустіть файл:
node server.jsПорядок перевірки у браузері:
Відкрийте /set.
Відкрийте /read і переконайтеся, що сервер прочитав cookie.
Відкрийте /delete.
Знову відкрийте /read.
Для перевірки через curl потрібно зберігати cookies у файлі:
curl -c cookies.txt http://localhost:3000/set
curl -b cookies.txt http://localhost:3000/read
curl -b cookies.txt http://localhost:3000/deleteПараметр -c зберігає cookies, отримані від сервера, а -b надсилає їх у наступному запиті.
PathВизначає, для яких шляхів cookie надсилатиметься:
Set-Cookie: theme=dark; Path=/Cookie з Path=/admin буде доступна для /admin та його підшляхів, але не для /shop.
Для cookie, яку потрібно використовувати в усьому застосунку, зазвичай встановлюють Path=/.
DomainВизначає домен, для якого призначена cookie:
Set-Cookie: preference=compact; Domain=example.com; Path=/Якщо Domain не вказати, браузер прив’яже cookie до поточного домену. Для більшості випадків це безпечніший і простіший варіант.
Max-AgeВизначає час життя cookie у секундах:
Set-Cookie: temporary=value; Max-Age=600; Path=/У цьому прикладі cookie діятиме 10 хвилин.
Значення Max-Age=0 або від’ємне значення використовується для видалення cookie.
ExpiresВизначає конкретну дату завершення дії:
Set-Cookie: temporary=value; Expires=Wed, 21 Oct 2026 07:28:00 GMT; Path=/Якщо одночасно вказано Max-Age і Expires, сучасні браузери зазвичай надають перевагу Max-Age.
HttpOnlySet-Cookie: sessionId=abc123; HttpOnly; Path=/Cookie з атрибутом HttpOnly не можна прочитати через document.cookie у браузері. Вона все одно надсилатиметься серверу в HTTP-запитах.
Цей атрибут корисний для сесійних ідентифікаторів, оскільки зменшує ризик їх викрадення через шкідливий JavaScript-код.
HttpOnly не захищає cookie від усіх видів атак і не замінює інші заходи безпеки.
SecureSet-Cookie: sessionId=abc123; Secure; HttpOnly; Path=/Cookie з Secure надсилається лише через HTTPS.
У робочому середовищі cookies із сесійними або іншими чутливими даними зазвичай потрібно встановлювати з Secure. Під час локальної розробки через звичайний HTTP ця cookie може не надсилатися браузером.
SameSiteАтрибут SameSite контролює, коли cookie можна надсилати у міжсайтових запитах.
Можливі значення:
Strict — найсуворіше обмеження;
Lax — помірне обмеження, часто підходить для звичайних сесій;
None — дозволяє міжсайтове надсилання, але потребує Secure.
Приклад:
Set-Cookie: sessionId=abc123; HttpOnly; Secure; SameSite=Lax; Path=/Cookie видаляється не спеціальним HTTP-методом, а встановленням її з минулим часом життя:
Set-Cookie: theme=; Max-Age=0; Path=/Також можна використати дату в минулому:
Set-Cookie: theme=; Expires=Thu, 01 Jan 1970 00:00:00 GMT; Path=/Під час видалення потрібно повторити ті самі атрибути Path і Domain, з якими cookie була створена.
Наприклад, якщо cookie встановили так:
Set-Cookie: theme=dark; Path=/accountто для її видалення потрібно використати:
Set-Cookie: theme=; Max-Age=0; Path=/accountСпроба видалити її з Path=/ не видалить cookie з Path=/account, оскільки це інша область дії.
Для встановлення кількох cookies потрібно передати масив значень заголовку Set-Cookie:
response.setHeader('Set-Cookie', [
'theme=dark; Max-Age=3600; Path=/; SameSite=Lax',
'language=uk; Max-Age=3600; Path=/; SameSite=Lax'
]);Не потрібно об’єднувати кілька cookies в один рядок через кому. Кожна cookie має бути окремим значенням Set-Cookie.
Set-Cookie після завершення відповідіНеправильно:
response.end('Готово');
response.setHeader('Set-Cookie', 'theme=dark; Path=/');Після response.end() заголовки вже надіслані. Спочатку встановіть заголовок, а потім завершуйте відповідь.
CookieУ запиті браузер надсилає лише ім’я та значення:
Cookie: theme=darkАтрибути Path, Max-Age, HttpOnly і SameSite належать до Set-Cookie і не повертаються клієнтом у заголовку Cookie.
PathCookie з Path=/account і cookie з Path=/ — це різні cookies. Під час видалення потрібно використовувати той самий шлях.
Користувач може переглядати та змінювати звичайні cookies. Не зберігайте в них паролі, ключі доступу або інші секрети у відкритому вигляді.
Для сесії зазвичай зберігають у cookie лише випадковий ідентифікатор, а дані сесії — на сервері.
Спеціальні символи можуть порушити формат cookie. Перед встановленням значення кодуйте його через encodeURIComponent(), а під час читання декодуйте через decodeURIComponent().
Сервер встановлює cookies через заголовок Set-Cookie.
Браузер надсилає збережені cookies у заголовку Cookie.
У Node.js заголовок Cookie потрібно розібрати самостійно або за допомогою бібліотеки.
Path і Domain визначають область дії cookie.
Max-Age та Expires визначають час її життя.
HttpOnly забороняє доступ до cookie з JavaScript.
Secure обмежує надсилання HTTPS.
SameSite контролює міжсайтове надсилання.
Для видалення потрібно встановити порожнє значення та Max-Age=0, використовуючи той самий Path і Domain.