Cookie — cookie-parser, httpOnly, secure, sameSite
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: truebilan 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