Mundarija (34)
- Bu darsda
- 1. Nega bu kerak?
- 2. Sarlavha nima?
- 2.1 Yorliq sifatida sarlavha
- 2.2 Haqiqiy sarlavhalarni ko'ramiz
- 2.3 Kim qaysi sarlavhani yuboradi?
- 3. MIME turlari: Content-Type va Accept
- 3.1 MIME turi nima?
- 3.2 charset — matn kodlashi
- 3.3 Content-Type va Accept farqi
- 3.4 Server noto'g'ri tur aytsa nima bo'ladi?
- 4. Cookie: sayt sizni qanday eslab qoladi
- 4.1 Muammo: server xotirasiz
- 4.2 Cookie qanday ishlaydi
- 4.3 Haqiqiy Set-Cookie
- 4.4 Cookie atributlari
- 5. Kesh: faylni qayta yuklamaslik
- 5.1 Nega kesh kerak?
- 5.2 Cache-Control — keshlash qoidasi
- 5.3 ETag va 304 Not Modified
- 6. Yana uchta foydali sarlavha
- 7. Hujumchi nigohi
- 8. Ko'p uchraydigan xatolar
- 8.1 CSS ulanmadi: "MIME type ('text/html')"
- 8.2 "Saytni yangiladim, lekin o'zgarish ko'rinmayapti"
- 8.3 Sessiya cookie'sida HttpOnly yo'q
- 8.4 JSON yuborib, Content-Type ni unutish
- 8.5 Cookie'ga maxfiy ma'lumot yozish
- 9. Mashqlar
- 1-mashq (oson): Sarlavhalarni o'qish
- 2-mashq (o'rta): Cookie'ni tahlil qilish
- 3-mashq (qiyin): 304 ni o'zingiz oling
- 10. Real ishda
- Xulosa
HTTP sarlavhalari: MIME turlari, cookie va kesh
Qisqacha: HTTP sarlavhalari (headers) — so'rov va javob ustidagi
Nom: qiymatko'rinishidagi yorliqlar. Masalan,Content-Typejavob nima ekanini aytadi: HTML, rasm yoki JSON. Cookie sarlavhalari sayt sizni "eslab qolishi"ga yordam beradi. Kesh sarlavhalari (Cache-Control,ETag) esa faylni qayta yuklamaslikni boshqaradi.
Bu darsda
- Sarlavha nima ekanini va uni
curl -Ibilan qanday ko'rishni bilasiz. - MIME turini (
text/html,application/json,image/png) o'qiy olasiz vaContent-TypebilanAcceptfarqini tushuntira olasiz. - Cookie qanday ishlashini va
HttpOnly,Secure,SameSiteatributlari nimadan himoya qilishini bilasiz. Cache-Control,ETagva304 Not Modifiedyordamida kesh qanday ishlashini o'z ko'zingiz bilan ko'rasiz.- CSS yuklanmay qolishi va "yangilanish ko'rinmayapti" kabi keng tarqalgan muammolarning sababini topasiz.
Oldin bilishingiz kerak: Client–server modeli va HTTP xabari, HTTP metodlari va status kodlari, Matnli va binar fayllar.
1. Nega bu kerak?
Oldingi darsda javobning birinchi qatorini — status kodini o'rgandik. 200 OK — "hammasi joyida". Lekin brauzerda hali ham savollar ko'p.
Malika onlayn do'kon ochdi. Uning sayti brauzerga har xil fayllar yuboradi: HTML sahifa, CSS, logotip rasmi, mahsulotlar ro'yxati. Matnli va binar fayllar darsida ko'rgandik: tarmoqdan kelgan narsa — shunchaki baytlar. Brauzer quyidagilarni qayerdan biladi?
- Bu baytlar rasmmi yoki HTML'mi? Chizish kerakmi yoki yuklab olish?
- Mijoz 5 daqiqa oldin login qilgan edi. Server uni qanday taniydi? Axir HTTP xotirasiz (stateless) edi.
- Logotip har safar qayta yuklansinmi? Telefonda internet sekin bo'lsa-chi?
Uchala savolning javobi — sarlavhalarda. Bu darsda eng muhimlari bilan tanishamiz.
2. Sarlavha nima?
2.1 Yorliq sifatida sarlavha
Pochtaga posilka jo'natganingizni eslang. Qutining ichida — narsa. Qutining ustida esa yorliq: "Ehtiyot bo'ling, shisha", "Kimga", "Og'irligi 2 kg". Pochtachi qutini ochmaydi — faqat yorliqni o'qib, nima qilishni biladi.
Sarlavha (header) — HTTP xabarining xuddi shunday yorlig'i. Xabar tanasi (body) — qutining ichi, sarlavhalar — ustidagi yozuvlar. Har bir sarlavha bitta qatorda yoziladi: avval nom, keyin ikki nuqta, keyin qiymat.
Content-Type: text/html
Content-Length: 12502.2 Haqiqiy sarlavhalarni ko'ramiz
Terminalda curl -I buyrug'i serverdan faqat sarlavhalarni so'raydi (tanani emas). -I — --head ning qisqasi: u oldingi darsdagi HEAD metodini yuboradi. Git Bash'da yozing:
curl -I https://example.comMaslahat: Windows PowerShell 5.1 da
curl— boshqa buyruqning taxallusi. U yerdacurl.exe -I https://example.comdeb yozing. Buni PowerShell darsida ko'rgan edik.
Natija (2026-yil sentabr, qisqartirilgan):
HTTP/1.1 200 OK
Date: Mon, 28 Sep 2026 12:30:23 GMT
Content-Type: text/html
Connection: keep-alive
Server: cloudflare
last-modified: Sat, 26 Sep 2026 09:10:30 GMT
Age: 11992
cf-cache-status: HITBirinchi qator — tanish status qatori. Qolganlari — sarlavhalar. Bir nechtasini o'qib ko'ramiz:
Content-Type: text/html— "ichida HTML sahifa bor".Server: cloudflare— javobni qaysi server dasturi bergan.Age: 11992— bu javob keshda 11 992 soniya (3 soatdan ko'proq) turibdi. Kesh haqida pastroqda, alohida bo'limda gaplashamiz.
E'tibor bering: last-modified kichik harf bilan, Content-Type katta harf bilan yozilgan. Sarlavha nomida katta-kichik harf farq qilmaydi — content-type va Content-Type bir xil narsa. HTTP/2 da esa hamma nomlar kichik harfda yuboriladi.
cf-cache-status kabi nomlarni standartda topmaysiz. Server o'zi uchun yangi sarlavha qo'shishi mumkin — bu yerda Cloudflare shunday qilgan.
2.3 Kim qaysi sarlavhani yuboradi?
Ba'zi sarlavhalar faqat so'rovda, ba'zilari faqat javobda keladi, ba'zilari ikkalasida ham:
| Sarlavha | Kim yuboradi | Nima deydi |
|---|---|---|
Host |
Brauzer | Qaysi saytga murojaat |
User-Agent |
Brauzer | "Men qanday dasturman" |
Accept |
Brauzer | "Menga shu formatlar kerak" |
Cookie |
Brauzer | Saqlangan cookie'lar |
Content-Type |
Ikkalasi | Tanadagi ma'lumot turi |
Set-Cookie |
Server | "Buni saqlab qo'y" |
Cache-Control |
Ikkalasi | Keshlash qoidasi |
Location |
Server | "Boshqa manzilga o't" |
Tekshirib ko'ring:
CONTENT-TYPE: text/htmlvacontent-type: text/html— bu ikki xil sarlavhami?
Javob
Yo'q, bir xil. HTTP sarlavha nomlarida katta-kichik harfni farqlamaydi. Shuning uchun curl chiqishida bir javobning o'zida Content-Type va last-modified aralash uchrashi mumkin.
3. MIME turlari: Content-Type va Accept
3.1 MIME turi nima?
MIME turi (MIME type) — ma'lumot turining standart nomi. U ikki qismdan iborat: tur/kichik_tur. Masalan, image/png: bu rasm (image), aniqrog'i PNG formatidagi rasm.
Fayl nomidagi .png qo'shimchasini eslang. Kompyuter faylning turini shu qo'shimchadan taxmin qiladi. Internetda esa fayl nomi bo'lmasligi ham mumkin. Shuning uchun server turini sarlavhada aniq aytadi.
Eng ko'p uchraydigan turlar:
| MIME turi | Nima | Qayerda uchraydi |
|---|---|---|
text/html |
HTML sahifa | Har bir veb-sahifa |
text/css |
CSS stil fayli | Saytning dizayni |
text/javascript |
JavaScript kod | Sayt skriptlari |
application/json |
JSON ma'lumot | API javoblari |
image/png, image/webp |
Rasmlar | Logotip, surat |
image/svg+xml |
SVG rasm | Ikonkalar |
application/pdf |
PDF hujjat | Shartnoma, chek |
application/octet-stream |
"Noma'lum baytlar" | Yuklab olinadigan fayl |
Yana ikkitasi formalar bilan bog'liq. application/x-www-form-urlencoded — oddiy forma yuborilganda. multipart/form-data — forma bilan birga fayl (masalan, pasport rasmi) yuborilganda. Formalarni HTML qismida batafsil ko'ramiz.
Maslahat: JavaScript uchun eski kodlarda
application/javascriptham uchraydi. Masalan, jsDelivr CDN hozir ham shunday yuboradi. 2022-yildan beri rasmiy standarttext/javascript, lekin brauzerlar ikkalasini ham tushunadi.
3.2 charset — matn kodlashi
Matnli turlardan keyin ko'pincha charset qo'shiladi:
Content-Type: text/html; charset=utf-8Bu "matn UTF-8 da kodlangan" degani. Matn kodlash darsida ko'rganimizdek, noto'g'ri kodlashda o' o'rniga о kabi "qarg'a tuyoq" belgilar chiqadi. Shuning uchun HTML va JSON uchun charset=utf-8 qo'yish odat.
3.3 Content-Type va Accept farqi
Ikkala sarlavha ham MIME turi haqida, lekin yo'nalishi boshqa:
Content-Type— "men yuborayotgan narsa shu turda". Javobda ham,POSTso'rovida ham keladi.Accept— "men shu turlarni qabul qila olaman". Faqat so'rovda keladi.
Restoranda buyurtma berganingizni tasavvur qiling. "Menga plov yoki lag'mon bo'lsa bo'ladi" — bu Accept. Ofitsiant "Mana, plov" deb olib keladi — bu Content-Type.
GET /api/mahsulotlar HTTP/1.1
Host: example.com
Accept: application/jsonHTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
[{"nomi":"Non","narxi":4000}]Xuddi shu "kelishuv" boshqa sarlavhalarda ham bor:
Accept-Language: uz, ru— "o'zbekcha bo'lsa yaxshi, bo'lmasa ruscha". Ko'p tilli saytlar shunga qarab tilni tanlaydi.Accept-Encoding: gzip, br— "siqilgan holda yuborsang ham tushunaman". Server siqsa, javobdaContent-Encoding: brdeb yozadi. Matn 3–5 barobar kichrayadi.
3.4 Server noto'g'ri tur aytsa nima bo'ladi?
Brauzer fayl nomiga emas, Content-Type ga ishonadi. Server rasmni text/plain deb yuborsa, brauzer uni rasm qilib chizmaydi — ekranda tushunarsiz belgilar chiqadi.
Serverlar ko'pincha yana bitta sarlavha qo'shadi:
X-Content-Type-Options: nosniff"nosniff" — "hidlab ko'rma". Ya'ni: "Tarkibga qarab turni o'zing taxmin qilma, men aytgan turga qat'iy amal qil." Bu xavfsizlik uchun: hujumchi rasm nomi ostida skript yuklab qo'ya olmaydi.
Faylni ochish emas, yuklab olishga majburlash uchun esa Content-Disposition ishlatiladi:
Content-Disposition: attachment; filename="chek.pdf"Tekshirib ko'ring: Brauzer serverga
Accept: image/webp,image/pngyubordi. ServerContent-Type: image/pngbilan javob berdi. Server nima qildi?
Javob
Brauzer "WebP yoki PNG qabul qila olaman" dedi. Server ikkalasidan PNG'ni tanladi va tanada PNG rasm yubordi. Accept — so'rov (istak), Content-Type — haqiqatda nima yuborilgani.
4. Cookie: sayt sizni qanday eslab qoladi
4.1 Muammo: server xotirasiz
Client–server darsida ko'rdik: server har bir so'rovni yangi, notanish odamdan kelgandek qabul qiladi. Siz login qildingiz, keyin "Savatcha" sahifasini ochdingiz. Server qanday biladi — bu o'sha login qilgan odammi?
Teatr garderobini eslang. Paltoingizni topshirasiz, sizga raqamli jeton berishadi. Garderobchi sizni eslab qolmaydi. Lekin jetonni ko'rsatsangiz — paltoingizni topib beradi.
Cookie (cookie) — xuddi shu jeton. Bu server brauzerga saqlab qo'yish uchun beradigan kichik matn: nom=qiymat. Brauzer keyingi har bir so'rovda uni o'zi qaytarib yuboradi.
4.2 Cookie qanday ishlaydi
1. Brauzer: POST /login (login va parol)
2. Server: 200 OK
Set-Cookie: sessiya=a8f3k2; HttpOnly; Secure
3. Brauzer cookie'ni shu sayt uchun saqlaydi.
4. Brauzer: GET /savatcha
Cookie: sessiya=a8f3k2
5. Server: "a8f3k2 — bu Malika. Mana uning savatchasi."Ikki xil sarlavha bor, adashtirmang:
Set-Cookie— server javobda yuboradi: "buni saqla".Cookie— brauzer so'rovda yuboradi: "mana, saqlaganim".
Cookie ichida parol emas, faqat tasodifiy "jeton" (a8f3k2) saqlanadi. Jeton kimga tegishli ekanini server o'zida yozib qo'ygan. Bunday jeton sessiya (session) deyiladi — autentifikatsiya qismida uni to'liq quramiz.
4.3 Haqiqiy Set-Cookie
GitHub bosh sahifasi curl -I https://github.com so'roviga shunday cookie qaytardi (qisqartirilgan):
Set-Cookie: logged_in=no; expires=Tue, 28 Sep 2027 12:31:48 GMT;
domain=.github.com; path=/; HttpOnly; secure; SameSite=LaxBirinchi qism — logged_in=no — cookie'ning o'zi: nom va qiymat. Nuqtali verguldan keyingilari — atributlar. Ular brauzerga cookie bilan qanday muomala qilishni aytadi.
4.4 Cookie atributlari
| Atribut | Nima qiladi |
|---|---|
Expires / Max-Age |
Qachon o'chadi. Yo'q bo'lsa — brauzer yopilganda |
Domain |
Qaysi domen(lar)ga yuboriladi |
Path |
Qaysi yo'llarga yuboriladi (/ — hammasiga) |
Secure |
Faqat HTTPS orqali yuboriladi |
HttpOnly |
JavaScript o'qiy olmaydi |
SameSite |
Boshqa saytdan kelgan so'rovlarda yuborilsinmi |
Uchta xavfsizlik atributini batafsilroq ko'ramiz:
Secure— cookie shifrlanmaganhttp://orqali hech qachon yuborilmaydi. Shifrlashni keyingi darsda (HTTPS va TLS) o'rganamiz.HttpOnly— sahifadagi JavaScript bu cookie'ni o'qiy olmaydi. Brauzer uni faqat so'rovlarga qo'shib yuboradi. Nega bu muhim — "Hujumchi nigohi" bo'limida ko'ramiz.SameSite— uch qiymati bor.Strict: faqat shu saytning o'zidan kelgan so'rovlarda yuboriladi.Lax: boshqa saytdagi havolani bosib kelganda ham yuboriladi, lekin yashirin so'rovlarda — yo'q.None: har doim (faqatSecurebilan birga). Atribut yozilmasa, Chrome uniLaxdeb hisoblaydi.
Yana ikki cheklov: bitta cookie ~4 KB dan oshmaydi, va brauzer uni har bir so'rovga qo'shadi. Shuning uchun cookie'ga katta ma'lumot yozilmaydi — faqat qisqa jeton.
Tekshirib ko'ring:
Set-Cookie: til=uz; Max-Age=86400— bu cookie qancha yashaydi va JavaScript uni o'qiy oladimi?
Javob
Max-Age soniyalarda: 86 400 soniya = 24 soat (1 kun). HttpOnly yozilmagan, demak JavaScript uni o'qiy oladi. Til tanlovi uchun bu normal — u maxfiy emas. Sessiya jetoni uchun esa HttpOnly shart.
5. Kesh: faylni qayta yuklamaslik
5.1 Nega kesh kerak?
Malikaning saytida logotip 200 KB. Har bir sahifada u bor. Mijoz 10 ta sahifani ko'rsa — 2 MB faqat logotip uchun ketadi. Mobil internetda bu sekin ham, qimmat ham.
Kesh (cache) — bir marta yuklangan faylni yaqin joyda saqlab qo'yish. Keyingi safar internetdan emas, o'sha joydan olinadi. Xuddi uyda bir qop un saqlaganingizdek: har safar non yopish uchun bozorga bormaysiz.
Brauzer keshi sizning kompyuteringizda turadi. Yo'lda boshqa keshlar ham bor. Eng muhimi — CDN: dunyoning ko'p shaharlarida fayllar nusxasini saqlab turadigan serverlar tarmog'i. Uni to'liq sayohat darsida batafsil ko'ramiz.
5.2 Cache-Control — keshlash qoidasi
Server javobida Cache-Control sarlavhasi bilan "bu faylni qancha saqlash mumkin" deydi. Qiymatlari direktiva deyiladi:
| Direktiva | Ma'nosi |
|---|---|
max-age=3600 |
3600 soniya (1 soat) so'ramasdan ishlatish mumkin |
no-cache |
Saqla, lekin har safar serverdan "o'zgarganmi?" deb so'ra |
no-store |
Umuman saqlama (bank sahifalari) |
private |
Faqat brauzer saqlasin, oraliq keshlar emas |
public |
Oraliq keshlar (CDN) ham saqlashi mumkin |
immutable |
Fayl hech qachon o'zgarmaydi, tekshirish shart emas |
Diqqat:
no-cachenomi aldaydi. U "keshlama" degani emas — "ishlatishdan oldin tekshir" degani. "Umuman saqlama" — buno-store.
jsDelivr CDN'dagi JavaScript kutubxona fayli (curl -I natijasi, qisqartirilgan):
HTTP/1.1 200 OK
Content-Type: application/javascript; charset=utf-8
Content-Length: 7160
Cache-Control: public, max-age=31536000, immutable
ETag: W/"1bf8-ailNY4aqrCR1iwkSkw1leTi0218"
Age: 1175977max-age=31536000 — 31 536 000 soniya, ya'ni 1 yil. immutable — "bu fayl o'zgarmaydi". Age: 1175977 — fayl CDN keshida 13 kundan ortiq turibdi.
Bir yil saqlasa, yangilanish qanday yetib boradi? Hiyla shunda: fayl manzilida versiya bor — dayjs@1.11.13. Yangi versiya chiqsa, manzil ham o'zgaradi (@1.11.14). Brauzer uchun bu butunlay yangi fayl. Saytlar shuning uchun fayllarni app.3f9a2c.js kabi nomlaydi — bu kesh buzish (cache busting) deyiladi.
5.3 ETag va 304 Not Modified
no-cache bo'lsa, brauzer har safar "o'zgarganmi?" deb so'raydi. Lekin butun faylni qayta yuklamasdan qanday so'raydi?
Server javobga ETag qo'shadi — fayl versiyasining "barmoq izi". Fayl o'zgarsa, ETag ham o'zgaradi. Brauzer keyingi safar shu izni If-None-Match sarlavhasida yuboradi: "Menda shu versiya bor. O'zgargan bo'lsa, yangisini ber."
Buni terminalda o'zingiz sinab ko'rasiz. -H bayrog'i so'rovga o'zimiz xohlagan sarlavhani qo'shadi:
curl -I -H 'If-None-Match: W/"1bf8-ailNY4aqrCR1iwkSkw1leTi0218"' \
https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.jsQator oxiridagi \ — "buyruq keyingi qatorda davom etadi" degani.
Natija:
HTTP/1.1 304 Not Modified
ETag: W/"1bf8-ailNY4aqrCR1iwkSkw1leTi0218"304 Not Modified — status kodlari darsidan tanish. "Fayl o'zgarmagan, keshdagisini ishlating." Javobda tana yo'q — 7 KB o'rniga bir necha yuz bayt keldi.
ETag oldidagi W/ — "weak" (kuchsiz): "ma'nosi bir xil" degani. Buni bilish shart emas, faqat chiqishda ko'rsangiz hayron bo'lmang.
ETag'ga o'xshash eski usul ham bor: server Last-Modified (oxirgi o'zgarish vaqti) yuboradi, brauzer If-Modified-Since bilan so'raydi. Yuqoridagi example.com javobida last-modified aynan shu.
Tekshirib ko'ring: Saytning bosh sahifasi (HTML) uchun
Cache-Control: max-age=31536000qo'ysak nima bo'ladi?
Javob
Brauzer bosh sahifani bir yil davomida serverdan so'ramaydi. Siz saytni yangilasangiz ham, eski mijozlar eski sahifani ko'rib yuraveradi. Shuning uchun HTML odatda no-cache bilan beriladi. Uzoq max-age esa nomida versiyasi bor CSS, JS va rasmlarga qo'yiladi.
6. Yana uchta foydali sarlavha
Location — 3xx yo'naltirishlar bilan birga keladi: "boshqa manzilga o't". curl -I http://google.com natijasi:
HTTP/1.1 301 Moved Permanently
Location: http://www.google.com/Brauzer Location dagi manzilni o'zi ochadi. Siz buni sezmaysiz ham.
User-Agent — so'rov yuborgan dastur o'zini tanishtiradi. curl o'zini User-Agent: curl/8.19.0 kabi ataydi (raqam — o'rnatilgan versiya: Git Bash'dagi va Windows'dagi curl'da har xil bo'lishi mumkin). Chrome esa uzun satr yuboradi: Mozilla/5.0 (Windows NT 10.0; Win64; x64) ... Chrome/.... Server shunga qarab statistika yig'adi. Lekin unga ishonib bo'lmaydi — istalgan dastur o'zini istalgan nom bilan atay oladi.
Content-Length — tana hajmi baytlarda. Yuklab olishdagi "qancha qoldi" chizig'i shu raqamdan hisoblanadi.
7. Hujumchi nigohi
Cookie — sayt sizni taniydigan jeton. Kim jetonni qo'lga kiritsa, sayt uni siz deb o'ylaydi. Shuning uchun hujumchilar aynan cookie'ni ovlaydi. Uch xil yo'l bor.
1. Ochiq Wi-Fi'da tinglash. Choyxonadagi ochiq Wi-Fi'da hujumchi tarmoqdagi paketlarni o'qiydi. Sayt http:// bo'lsa, Cookie: sessiya=a8f3k2 ochiq matn bo'lib uchadi. Hujumchi uni o'z brauzeriga qo'yadi va sizning akkauntingizga kiradi. Himoya: sayt faqat HTTPS'da ishlaydi, cookie esa Secure bilan beriladi.
2. Sahifaga zararli skript kiritish (XSS). Hujumchi saytdagi izoh maydoniga skript yozib qoldiradi. Sayt uni tekshirmasa, skript boshqa mijozlar brauzerida ishga tushadi. U document.cookie bilan cookie'larni o'qib, hujumchiga yuboradi. XSS'ni DOM xavfsizligi darsida chuqur o'rganamiz. Himoya: sessiya cookie'si HttpOnly bo'lsa, skript uni umuman ko'rmaydi.
3. Begona saytdan so'rov (CSRF). Siz bankka kirgansiz. Boshqa tabda zararli sayt ochiladi va yashirincha bankka "pul o'tkaz" so'rovini yuboradi. Brauzer bank cookie'sini avtomatik qo'shib yuborsa — bank so'rovni sizniki deb o'ylaydi. Himoya: SameSite=Lax yoki Strict — brauzer begona saytdan kelgan bunday so'rovga cookie qo'shmaydi.
Shuning uchun sessiya cookie'si uchun oltin qoida:
Set-Cookie: sessiya=a8f3k2; HttpOnly; Secure; SameSite=Lax; Path=/8. Ko'p uchraydigan xatolar
8.1 CSS ulanmadi: "MIME type ('text/html')"
Sahifa dizaynsiz ochildi. Brauzer konsolida (F12 → Console) shunday qizil yozuv:
Refused to apply style from 'http://localhost:5500/css/stil.css'
because its MIME type ('text/html') is not a supported stylesheet
MIME type, and strict MIME checking is enabled.Tarjimasi: "stil.css ni qo'llashni rad etdim, chunki uning MIME turi text/html — bu stil fayli turi emas."
G'alati, to'g'rimi? Siz CSS so'radingiz, server HTML qaytardi. Sababi ko'pincha oddiy: fayl yo'li noto'g'ri. Server faylni topmadi va "404 — sahifa topilmadi" degan HTML sahifani yubordi. Brauzer uni Content-Type ga qarab rad etdi. Tuzatish: xato matnidagi manzilni brauzerda alohida oching. 404 chiqsa — yo'lni tuzating (nisbiy va absolyut yo'llar).
8.2 "Saytni yangiladim, lekin o'zgarish ko'rinmayapti"
Brauzer eski CSS yoki JS'ni keshdan olyapti. Tuzatish: Ctrl + Shift + R — keshni chetlab qayta yuklash. Doimiy yechim — fayl nomida versiya (stil.v2.css) yoki HTML uchun no-cache.
8.3 Sessiya cookie'sida HttpOnly yo'q
Sayt ishlayveradi, xato chiqmaydi — shuning uchun sezilmaydi. Lekin bitta XSS teshigi bo'lsa, hamma mijozlarning sessiyasi o'g'irlanadi. Tuzatish: login bilan bog'liq har bir cookie'ga HttpOnly; Secure; SameSite.
8.4 JSON yuborib, Content-Type ni unutish
Serverga {"ism":"Ali"} yubordingiz, lekin Content-Type: application/json qo'ymadingiz. Server tanani JSON deb tanimaydi va bo'sh ma'lumot oldi deb hisoblaydi. Tuzatish: tana yuborganda uning turini doim ayting. fetch bilan buni ma'lumot yuborish darsida qilamiz.
8.5 Cookie'ga maxfiy ma'lumot yozish
Set-Cookie: parol=12345 — hech qachon. Cookie brauzerda ochiq saqlanadi, uni foydalanuvchi ham, kompyuterdagi boshqa dasturlar ham ko'ra oladi. Cookie'da faqat ma'nosiz jeton bo'lsin.
9. Mashqlar
1-mashq (oson): Sarlavhalarni o'qish
Terminalda bajaring (PowerShell'da curl.exe):
curl -I https://example.comChiqishdan toping: Content-Type qiymati, Server qiymati va Age qiymati. Age ni soatga aylantiring.
Bo'sh joylarni to'ldiring: HTML sahifaning MIME turi — [:text/html]. JSON ma'lumotning MIME turi — [:application/json].
Yechim
Bizda Content-Type: text/html, Server: cloudflare, Age: 11992 chiqdi. Sizda Age boshqacha bo'ladi — u kesh yangilanganidan beri o'tgan vaqt. Soatga aylantirish: 11 992 ÷ 3600 ≈ 3,3 soat.
Age umuman chiqmasligi ham mumkin. Bu javob keshdan emas, to'g'ridan-to'g'ri asosiy serverdan kelgan degani.
2-mashq (o'rta): Cookie'ni tahlil qilish
Server shunday javob berdi:
Set-Cookie: savatcha=7k2p; Max-Age=3600; Secure; SameSite=Strict- Cookie'ning nomi va qiymati nima?
- U qancha vaqt yashaydi?
http://sahifada brauzer uni yuboradimi?- JavaScript uni o'qiy oladimi? Bu savatcha uchun xavflimi?
Yechim
- Nomi
savatcha, qiymati7k2p. Max-Age=3600— 3600 soniya, ya'ni 1 soat.- Yo'q.
Securebor — faqat HTTPS orqali yuboriladi. - Ha, o'qiy oladi —
HttpOnlyyo'q. Agar bu jeton bilan savatchani o'zgartirish yoki to'lov qilish mumkin bo'lsa,HttpOnlyqo'shish kerak. Aks holda XSS orqali jeton o'g'irlanishi mumkin.
3-mashq (qiyin): 304 ni o'zingiz oling
Maqsad: ETag orqali 304 Not Modified javobini olish. Sarlavhani ajratib olish uchun grep va pipe ishlatamiz. Git Bash'da:
- Fayl sarlavhalaridan faqat ETag qatorini chiqaring:
curl -sI https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js \
| grep -i etag-s — "jim rejim": curl yuklash jarayonini ko'rsatmaydi. grep -i — katta-kichik harfga qaramay qidiradi.
- Chiqqan qiymatni
If-None-Matchsarlavhasiga qo'yib, so'rovni qayta yuboring. - Status kodi nima bo'ldi? Nega javobda
Content-Lengthyo'q?
Yechim
1-qadam natijasi:
ETag: W/"1bf8-ailNY4aqrCR1iwkSkw1leTi0218"2-qadam:
curl -sI -H 'If-None-Match: W/"1bf8-ailNY4aqrCR1iwkSkw1leTi0218"' \
https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.jsNatija:
HTTP/1.1 304 Not Modified
ETag: W/"1bf8-ailNY4aqrCR1iwkSkw1leTi0218"- Status —
304. Server "sizdagi versiya hali yangi" dedi va tanani yubormadi. Tana yo'q — hajmini aytishga ham hojat yo'q. Brauzer ham xuddi shunday qiladi: F12 → Network panelida304qatorlarni ko'rsangiz, fayl keshdan olingan.
Agar sizda ETag boshqacha chiqsa — CDN faylni qayta joylagan. O'zingizda chiqqan qiymatni ishlating.
10. Real ishda
- Frontend: CSS ulanmay qolganda birinchi qadam — DevTools'da
Content-Typeva status kodini ko'rish. DevTools Network darsida buni har kuni qilasiz. - Backend: Express yoki NestJS'da javob yuborish — asosan status kodi, sarlavhalar va tanani to'g'ri qo'yish. Login tizimi cookie atributlarisiz yozilmaydi.
- Tezlik: Katta saytlarda to'g'ri
Cache-Controlsahifa yuklanishini bir necha barobar tezlashtiradi va server xarajatini kamaytiradi. - Intervyu: "
no-cachevano-storefarqi?", "HttpOnlynimadan himoya qiladi?", "304qachon qaytadi?" — frontend va backend intervyularida tez-tez so'raladi.
Xulosa
- Sarlavha — HTTP xabaridagi
Nom: qiymatyorlig'i; nomida katta-kichik harf farq qilmaydi. Content-Type— "nima yubordim" (MIME turi),Accept— "nimani qabul qila olaman".- Cookie — server bergan jeton:
Set-Cookiebilan beriladi,Cookiebilan qaytadi. - Sessiya cookie'si uchun:
HttpOnly; Secure; SameSite=Lax. Cache-Controlkeshlash qoidasini beradi;no-cache— "tekshir",no-store— "saqlama".ETag+If-None-Match→304 Not Modified: fayl qayta yuklanmaydi.
Keyingi dars: HTTPS va TLS — sarlavhalar va cookie'lar yo'lda ochiq matn bo'lib uchmasligi uchun ularni qanday shifrlashni o'rganamiz.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!