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 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:

  1. Foydalanuvchi birinchi marta keladi — server sessiya yaratadi va tasodifiy id beradi;
  2. id cookie orqali brauzerga yuboriladi;
  3. Keyingi so’rovda brauzer id ni qaytaradi;
  4. Server id bo’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

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:

  1. cookie-parser ni o’rnatib ulang, /set-cookie va /read-cookie marshrutlarini yozing;
  2. curl -c va curl -b bilan cookie’ning saqlanib qaytishini tasdiqlang;
  3. express-session ni sozlab, /counter marshrutini yozing va uch marta so’rab hisoblagich o’sishini ko’ring;
  4. Cookie’siz (-b siz) so’rab, sessionId o’zgarishini kuzating;
  5. saveUninitialized ni true qilib, hech narsa saqlanmagan so’rovda ham Set-Cookie kelishini curl -i bilan taqqoslang;
  6. /reset marshrutida session.destroy ni 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 oladiuserId yoki isAdmin unga solinmaydi.
  • Sessiyada ma’lumot serverda, cookie’da esa faqat tasodifiy id yuradi.
  • httpOnly XSS orqali cookie o’g’irlashni, sameSite CSRF ni, secure esa tarmoqda tinglashni to’sadi.
  • secure: true ni localhost da 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.

Bu dars foydali bo'ldimi?

marta ko'rildi