Express sessiya va cookie
Serveringiz hozir har so’rovni birinchi marta ko’rayotgandek qabul qiladi. Bir foydalanuvchi o’nta so’rov yuborsa, server o’nta notanish odamni ko’radi. “Siz kirgan edingiz”, “savatingizda uch mahsulot bor” degan gaplar mumkin emas.
Bu darsda serverga xotira beramiz.
HTTP holatsiz protokol
Yechim — har so’rovda mijozning o’zi “men o’shaman” deb belgi ko’rsatishi. Bu belgi cookie.
Cookie o’rnatish va o’qish
Cookie o’rnatish uchun qo’shimcha paket kerak emas — response.cookie()
Express’ning o’zida bor. O’qish uchun esa cookie-parser qulay:
npm install cookie-parser
const express = require("express");
const cookieParser = require("cookie-parser");
const app = express();
// request.cookies obyektini to'ldiradi
app.use(cookieParser());
app.get("/set-cookie", (request, response) => {
// Bir soatga mo'ljallangan cookie
response.cookie("theme", "dark", { httpOnly: true, maxAge: 1000 * 60 * 60 });
response.send("Cookie o'rnatildi");
});
app.get("/read-cookie", (request, response) => {
const theme = request.cookies.theme || "light";
response.json({ theme: theme });
});
app.listen(3000, () => {
console.log("Server ishga tushdi: http://localhost:3000");
});
curl da cookie’ni saqlash uchun -c (yozish) va -b (o’qish)
bayroqlari ishlatiladi:
curl -i -c cookies.txt http://localhost:3000/set-cookie
HTTP/1.1 200 OK
Set-Cookie: theme=dark; Max-Age=3600; Path=/; Expires=Sat, 12 Sep 2026 15:06:28 GMT; HttpOnly
curl -b cookies.txt http://localhost:3000/read-cookie
{"theme":"dark"}
Set-Cookie sarlavhasi — serverning “buni saqlab qo’ying” so’rovi.
Brauzer (yoki curl) uni saqlaydi va keyingi so’rovda qaytaradi.
maxAge millisekundlarda beriladi: 1000 * 60 * 60 — bir soat. Javobdagi
Max-Age=3600 esa sekundlarda, chunki HTTP standarti shunday.
Cookie’ga maxfiy narsa solmang
Cookie brauzerda oddiy matn sifatida yotadi. Foydalanuvchi uni ochib o’qiy oladi va o’zgartira oladi.
Sessiya qanday ishlaydi
Oqim shunday:
- Foydalanuvchi birinchi marta keladi — server sessiya yaratadi va
tasodifiy
idberadi; idcookie orqali brauzerga yuboriladi;- Keyingi so’rovda brauzer
idni qaytaradi; - Server
idbo’yicha o’z xotirasidan ma’lumotni topadi.
Foydalanuvchi cookie’dagi id ni o’zgartirsa nima bo’ladi? Hech narsa
topilmaydi — u tasodifiy va uzun, boshqa birovnikini taxmin qilib
bo’lmaydi. Shuning uchun isAdmin cookie’da emas, sessiyada saqlanadi.
express-session
npm install express-session
const express = require("express");
const session = require("express-session");
const app = express();
app.use(
session({
// Sessiya cookie'sini imzolash uchun maxfiy kalit
secret: process.env.SESSION_SECRET || "sinov-uchun-maxfiy-kalit",
resave: false,
saveUninitialized: false,
cookie: {
httpOnly: true,
secure: false,
sameSite: "lax",
maxAge: 1000 * 60 * 60,
},
})
);
app.get("/counter", (request, response) => {
if (request.session.views === undefined) {
request.session.views = 0;
}
request.session.views = request.session.views + 1;
response.json({
views: request.session.views,
sessionId: request.sessionID,
});
});
app.listen(3000, () => {
console.log("Server ishga tushdi: http://localhost:3000");
});
request.session — oddiy obyekt. Unga yozganingiz keyingi so’rovda ham
turadi. Sinab ko’ring:
curl -i -c session.txt http://localhost:3000/counter
HTTP/1.1 200 OK
Set-Cookie: connect.sid=s%3AGKAYh87Ozh1yObeQXQ-47m9rzVEpphSm...; Path=/; HttpOnly; SameSite=Lax
Content-Type: application/json; charset=utf-8
{"views":1,"sessionId":"GKAYh87Ozh1yObeQXQ-47m9rzVEpphSm"}
curl -b session.txt http://localhost:3000/counter
{"views":2,"sessionId":"GKAYh87Ozh1yObeQXQ-47m9rzVEpphSm"}
curl -b session.txt http://localhost:3000/counter
{"views":3,"sessionId":"GKAYh87Ozh1yObeQXQ-47m9rzVEpphSm"}
Hisoblagich o’sdi, sessionId esa o’zgarmadi. Endi cookie’siz so’rang:
curl http://localhost:3000/counter
{"views":1,"sessionId":"KrvPoaxhcJRi9rEGAlvoyDT0S02WTSVm"}
Boshqa sessionId, hisoblagich yana birdan boshlandi. Cookie yo’q —
server sizni tanimadi. Bu brauzerda “yashirin oyna” ochish bilan bir xil.
Sozlamalarni tushunish
session() ga berilgan har parametr aniq ish qiladi.
| Parametr | Ma’nosi |
|---|---|
secret |
Cookie’ni imzolash kaliti; buzilgan id aniqlanadi |
resave: false |
O’zgarmagan sessiyani qayta yozmaydi |
saveUninitialized: false |
Bo’sh sessiya uchun cookie yuborilmaydi |
cookie.maxAge |
Sessiya qancha yashashi (millisekund) |
saveUninitialized: false qiymati muhim: usiz server har tashrifchiga,
hatto hech narsa saqlanmagan bo’lsa ham, cookie beradi. Bu keraksiz
xotira sarfi va ko’p mamlakatda cookie bo’yicha rozilik talabiga tegadi.
Uch bayroq: httpOnly, secure, sameSite
Cookie sozlamalaridagi uch bayroq — xavfsizlikning asosiy qatlami.
| Bayroq | Nima qiladi | Nimadan himoya qiladi |
|---|---|---|
httpOnly: true |
JavaScript cookie’ni o’qiy olmaydi | XSS orqali sessiya o’g’irlash |
secure: true |
Cookie faqat HTTPS orqali yuboriladi | Tarmoqda tinglash |
sameSite: "lax" |
Boshqa saytdan kelgan so’rovga qo’shilmaydi | CSRF |
Sessiyani tugatish
Chiqish (logout) uchun sessiya butunlay o’chiriladi:
app.post("/reset", (request, response) => {
request.session.destroy((error) => {
if (error) {
return response.status(500).json({ error: "Sessiya o'chmadi" });
}
// Brauzerdagi keraksiz cookie'ni ham olib tashlaymiz
response.clearCookie("connect.sid");
response.json({ message: "Sessiya tozalandi" });
});
});
curl -c reset.txt http://localhost:3000/counter
{"views":1,"sessionId":"-fkw-JCjVQLvv2rxY2E4ss5MqhpNAXf3"}
curl -b reset.txt -X POST http://localhost:3000/reset
{"message":"Sessiya tozalandi"}
curl -b reset.txt http://localhost:3000/counter
{"views":1,"sessionId":"uZt01X1QfEtVnjkwMBK_BtaIV-O8vIRB"}
sessionId yangi, hisoblagich noldan. Eski sessiya serverda o’chdi.
destroy funksiyasi callback qabul qiladi — u sessiyani omborga yozish
tugaganda chaqiriladi. Javobni callback ichida berish kerak.
Sessiya qayerda saqlanadi
Standart holatda express-session ma’lumotni server xotirasida
saqlaydi. Bu sinov uchun yetarli, lekin ikki muammosi bor.
| Muammo | Nima bo’ladi |
|---|---|
| Server qayta yuklanadi | Hamma foydalanuvchi tizimdan chiqib ketadi |
| Ikki server ishlaydi | Birinchisida kirgan odam ikkinchisida notanish |
Sessiya va cookie farqi
Ikkalasi bir-birini almashtirmaydi — birgalikda ishlaydi.
| Cookie | Sessiya | |
|---|---|---|
| Ma’lumot qayerda | Brauzerda | Serverda |
| Foydalanuvchi o’zgartira oladimi | Ha | Yo’q |
| Hajmi | ~4 KB gacha | Cheklanmagan |
| Nimaga mos | Mavzu, til, sozlama | Kim kirgani, huquqlar |
Sessiya ham cookie ishlatadi — faqat unda id dan boshqa hech narsa
yo’q.
Amaliy mashq
task-app loyihasida davom eting:
cookie-parserni o’rnatib ulang,/set-cookieva/read-cookiemarshrutlarini yozing;curl -cvacurl -bbilan cookie’ning saqlanib qaytishini tasdiqlang;express-sessionni sozlab,/countermarshrutini yozing va uch marta so’rab hisoblagich o’sishini ko’ring;- Cookie’siz (
-bsiz) so’rab,sessionIdo’zgarishini kuzating; saveUninitializednitrueqilib, hech narsa saqlanmagan so’rovda hamSet-Cookiekelishinicurl -ibilan taqqoslang;/resetmarshrutidasession.destroyni yozing va hisoblagich noldan boshlanishini tekshiring.
4-qadam darsning asosini ko’rsatadi: cookie yo’q bo’lsa, server sizni mutlaqo tanimaydi — HTTP shunday ishlaydi.
Qisqacha xulosa
- HTTP holatsiz: server so’rovni bajarib, uni unutadi.
- Cookie — brauzer saqlaydigan va har so’rovga avtomatik qo’shadigan matn juftligi.
- Cookie’dagi ma’lumotni foydalanuvchi o’zgartira oladi —
userIdyokiisAdminunga solinmaydi. - Sessiyada ma’lumot serverda, cookie’da esa faqat tasodifiy
idyuradi. httpOnlyXSS orqali cookie o’g’irlashni,sameSiteCSRF ni,secureesa tarmoqda tinglashni to’sadi.secure: truenilocalhostda yoqmang — sessiya ishlamay qoladi.- Xotiradagi sessiya ombori server qayta yuklanganda tozalanadi — ishlab turgan serverda tashqi ombor kerak.
Keyingi darsda ro’yxatdan o’tish va parol hash — foydalanuvchi yaratish va parolni xavfsiz saqlash.