Cookie — cookie-parser, httpOnly, secure, sameSite

~15 daq · Express · Autentifikatsiya va Xavfsizlik

Cookie nima?

Brauzer va server o'rtasida kichik ma'lumot saqlash uchun mexanizm. Server cookie o'rnatadi, brauzer uni saqlaydi va keyingi har so'rovda avtomatik yuboradi.

Hayotiy o'xshatma: do'konga kirdingiz, sizga "doimiy mijoz" kartasi berishdi. Keyingi safar kelganingizda kartani ko'rsatasiz — do'kon sizni taniydi. Cookie — o'sha karta.

Session ID, refresh token, foydalanuvchi tili, savatcha — bularning hammasi cookie da saqlanishi mumkin.


cookie-parser

Express cookie larni o'qish uchun cookie-parser middleware kerak:

npm install cookie-parser
const cookieParser = require('cookie-parser');

app.use(cookieParser(process.env.COOKIE_SECRET)); // imzolash uchun secret

Endi req.cookies va req.signedCookies mavjud.


Cookie o'rnatish va o'qish

// O'rnatish:
res.cookie('username', 'Ali', {
  maxAge:   7 * 24 * 60 * 60 * 1000, // 7 kun (millisekund)
  httpOnly: true,
  secure:   process.env.NODE_ENV === 'production',
});

// O'qish:
const username = req.cookies.username; // 'Ali'

// O'chirish:
res.clearCookie('username');

Cookie xavfsizlik sozlamalari

Bu sozlamalar cookie ni himoya qiladi. Har birini tushunish muhim.

httpOnly: true — JavaScript document.cookie orqali bu cookie ni o'qiy olmaydi. XSS hujumida hacker sahifaga zararli script kiritsa — cookie ni o'g'irlay olmaydi. Session va refresh token uchun har doim httpOnly: true.

secure: true — cookie faqat HTTPS orqali yuboriladi. HTTP orqali yuborilmaydi. Odam-o'rtada hujumida ushlab olinmaydi. Production da har doim true.

sameSite — boshqa saytdan kelgan so'rovlarda cookie yuborilsinmi? CSRF hujumidan himoya.

res.cookie('token', value, {
  httpOnly: true,
  secure:   true,
  sameSite: 'strict', // faqat bir xil saytdan
});

sameSite uch qiymat oladi:

  • 'strict' — cookie faqat bir xil saytdan kelgan so'rovlarda yuboriladi. Eng xavfsiz, lekin ba'zi holatlarda noqulay (boshqa saytdan havolani bosib kelganda cookie yuborilmaydi).
  • 'lax' — bir xil sayt va tashqi saytdan oddiy navigatsiyada yuboriladi. Ko'p hollarda yaxshi muvozanat.
  • 'none' — har qanday so'rovda yuboriladi. secure: true bilan birga ishlatiladi. Cross-origin so'rovlar uchun (masalan, boshqa domendan API chaqiruv).

Imzolangan cookie

Oddiy cookie ni foydalanuvchi brauzerda o'zgartirishi mumkin. Imzolangan cookie o'zgartirilsa — server biladi.

// O'rnatish (signed: true):
res.cookie('userId', '42', { signed: true, httpOnly: true });

// O'qish — req.signedCookies (oddiy req.cookies emas):
const userId = req.signedCookies.userId; // '42'
// Kimdir o'zgartirsa — false qaytariladi

cookieParser(secret) da berilgan secret bilan imzolanadi.


Refresh token cookie da

20-darsda refresh tokenni cookie da saqlash ko'rildi. Bu nima uchun yaxshi?

Refresh token uzun muddatli — o'g'irlansa xavfli. httpOnly cookie da saqlansa — JavaScript o'qiy olmaydi, XSS hujumida o'g'irlanmaydi.

// Login da:
res.cookie('refreshToken', refreshToken, {
  httpOnly: true,
  secure:   process.env.NODE_ENV === 'production',
  sameSite: 'strict',
  maxAge:   7 * 24 * 60 * 60 * 1000, // 7 kun
});

// Refresh endpointda:
const refreshToken = req.cookies.refreshToken;

Tez-tez uchraydigan xatolar

httpOnly ni unutish:

res.cookie('token', value); // httpOnly yo'q — JS o'qiy oladi, XSS xavfi
res.cookie('token', value, { httpOnly: true }); // to'g'ri

Production da secure: false:

res.cookie('token', value, { secure: false });
// HTTP orqali ham yuboriladi — odam-o'rtada hujumida ushlanishi mumkin

sameSite: 'none' bilan secure: false:

res.cookie('token', value, { sameSite: 'none', secure: false });
// Brauzer qabul qilmaydi — sameSite: 'none' faqat secure: true bilan ishlaydi

Xulosa

Cookie — brauzer va server o'rtasida kichik ma'lumot saqlash. Brauzer har so'rovda avtomatik yuboradi.

Xavfsizlik sozlamalari: httpOnly — JS o'qiy olmaydi. secure — faqat HTTPS. sameSite — CSRF dan himoya.

Refresh token va session ID — har doim httpOnly: true bilan.


Keyingi dars

26-dars: Helmet — xavfsizlik headerlari