Tarkibga o'tish

Authentication nima?

Autentifikatsiya (authentication) — foydalanuvchi o‘zini kim deb tanishtirgan bo‘lsa, haqiqatan ham o‘sha ekanini tekshirish. Qisqacha qilib aytganda, u "Siz kimsiz?" degan savolga ishonchli javob beradi.

Hayotdan misol: aeroportda chegara nazoratidan o‘tasiz. Xodim ismingizni so‘raydi, keyin pasportingizdagi rasmga qarab, yuzingiz bilan solishtiradi. Ism aytish hali isbot emas. Pasport va yuzingiz esa sizning aynan shu odam ekaningizni tasdiqlaydi. Autentifikatsiya ham xuddi shunday: "men Aliman" degan da’voni tekshiradi.

Uchta o‘xshash tushuncha

Bu mavzuda uchta atama ko‘p ishlatiladi. Ular ko‘pincha adashtiriladi, lekin har birining o‘z ma’nosi bor:

Tushuncha Savol Misol
Identifikatsiya (identification) Kim ekanini aytyapti? "Mening emailim [email protected]"
Autentifikatsiya (authentication) Haqiqatan o‘shami? Parol to‘g‘ri, demak bu haqiqatan Ali
Avtorizatsiya (authorization) Unga nima qilishga ruxsat bor? Ali o‘z kitoblarini o‘chira oladi, boshqalarnikini esa yo‘q

Ular doim shu tartibda keladi. Avval kim ekanligi aytiladi, keyin bu tekshiriladi, oxirida ruxsatlar aniqlanadi. Kim ekanini bilmasdan turib, unga nimaga ruxsat berilganini aniqlab bo‘lmaydi.

Ingliz tilidagi adabiyotlarda ko‘pincha qisqartmalar ishlatiladi: AuthN — autentifikatsiya, AuthZ — avtorizatsiya. Bu bo‘limda autentifikatsiya bilan shug‘ullanamiz. Avtorizatsiya esa keyingi bo‘limda ko‘riladi.

Autentifikatsiya omillari

Foydalanuvchi o‘zini uch xil yo‘l bilan isbotlashi mumkin:

Omil Ma’nosi Misollar
Biladigan narsa Faqat foydalanuvchi biladi Parol, PIN-kod, maxfiy savol javobi
Egalik qiladigan narsa Faqat foydalanuvchida bor Telefon (SMS kod), autentifikator ilovasi, apparat kalit
O‘zidagi narsa Foydalanuvchining tanasi Barmoq izi, yuz tuzilishi

Bitta omil ishlatilsa, bu bir bosqichli autentifikatsiya. Ikki xil omil birga ishlatilsa, masalan parol va telefondagi kod, bu ikki bosqichli autentifikatsiya (2FA — two-factor authentication) deyiladi.

2FA nima uchun kuchliroq? Hujumchi parolingizni bilib olgan taqdirda ham, telefoningiz uning qo‘lida bo‘lmaydi. Ikkita turli omilni bir vaqtda qo‘lga kiritish ancha qiyin.

E’tibor bering: parol va maxfiy savol — ikkalasi ham "biladigan narsa". Ular birga ishlatilsa, bu 2FA hisoblanmaydi.

HTTP va holatsizlik muammosi

HTTP holatsiz (stateless) protokol. Har bir so‘rov alohida va mustaqil. Server oldingi so‘rovni "eslab qolmaydi".

POST /login  {email, password}  → 200 OK, "Xush kelibsiz, Ali!"
GET  /me                        → Server: "Siz kimsiz?"

Foydalanuvchi bir soniya oldin tizimga kirgan bo‘lsa ham, ikkinchi so‘rovda server uni tanimaydi. Har bir so‘rovda parolni qayta yuborish esa ham noqulay, ham xavfli.

Yechim — login muvaffaqiyatli bo‘lgach, server klientga maxsus belgi beradi. Klient uni keyingi har bir so‘rovga qo‘shib yuboradi. Server bu belgiga qarab foydalanuvchini taniydi.

Kinoteatrni tasavvur qiling. Kassada chipta olasiz, ya’ni bir marta pul to‘lab, o‘zingizni tasdiqlaysiz. Keyin zalga kirishda faqat chiptani ko‘rsatasiz. Kassaga qaytib, hamma narsani qaytadan tushuntirish shart emas.

Bu belgi qanday ko‘rinishda bo‘lishiga qarab ikki asosiy yondashuv bor:

  • Session — server tasodifiy ID yaratadi va foydalanuvchi ma’lumotini o‘zida saqlaydi. Klient faqat ID’ni, odatda cookie ichida, yuboradi.
  • Token — server foydalanuvchi ma’lumotini imzolangan tokenga joylaydi. Klient tokenni saqlaydi va yuboradi, server esa imzoni tekshiradi.

Ularning farqi keyingi darsda batafsil ko‘riladi.

HTTP’da identifikatsiya ma’lumotini yuborish

Klient o‘zini tanishtirish uchun ma’lumotni odatda Authorization sarlavhasida yuboradi:

Authorization: <sxema> <ma’lumot>

Eng ko‘p uchraydigan sxemalar:

Sxema Ko‘rinishi Qayerda
Basic Basic YWxpOnBhcm9s Oddiy ichki vositalar. Login va parol Base64 bilan kodlanadi
Bearer Bearer eyJhbGciOi... Token asosidagi API’lar
Cookie Cookie: session_id=abc123 Brauzer va session asosidagi tizimlar
API kaliti X-API-Key: sk_live_... Serverlararo integratsiyalar

Warning

Basic sxemada Base64 — shifrlash emas, oddiy kodlash. YWxpOnBhcm9s qatorini istalgan odam bir buyruq bilan ali:parolga qaytaradi. Shu sababli har qanday autentifikatsiya ma’lumoti faqat HTTPS orqali yuborilishi kerak. HTTPS haqida alohida bo‘lim bor.

Go’da sarlavhani o‘qish:

auth := r.Header.Get("Authorization")
token, ok := strings.CutPrefix(auth, "Bearer ")
if !ok || token == "" {
    // token yuborilmagan
}

401 Unauthorized

Autentifikatsiya muvaffaqiyatsiz bo‘lganda server 401 Unauthorized status kodini qaytaradi. Nomi chalg‘itishi mumkin: u "ruxsat yo‘q" emas, balki "sizni tanimadim" degan ma’noni bildiradi.

401 quyidagi hollarda qaytariladi:

  • token umuman yuborilmagan;
  • token noto‘g‘ri yoki buzilgan;
  • token muddati tugagan;
  • login paytida email yoki parol noto‘g‘ri.

Standart bo‘yicha 401 javobida WWW-Authenticate sarlavhasi bo‘lishi kerak. U klientga qanday autentifikatsiya kutilayotganini bildiradi:

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer

Foydalanuvchi tanilgan, lekin unga biror amalga ruxsat berilmagan bo‘lsa, 403 Forbidden qaytariladi. Bu avtorizatsiyaga tegishli. Ikkalasining farqi 401, 403 va 500 statuslar darsida alohida tushuntiriladi.

Autentifikatsiyaning asosiy qoidalari

Keyingi darslarda kod yozishda quyidagi qoidalarga amal qilamiz:

  1. Parol faqat xesh ko‘rinishida saqlanadi. bcrypt yordamida.
  2. Barcha ma’lumot HTTPS orqali uzatiladi.
  3. Xato xabarlari hujumchiga ma’lumot bermaydi. "Bunday email yo‘q" va "parol noto‘g‘ri" o‘rniga bitta umumiy xabar: "email yoki parol noto‘g‘ri". Aks holda hujumchi qaysi emaillar ro‘yxatdan o‘tganini aniqlay oladi.
  4. Tokenlar qisqa muddatli bo‘ladi. O‘g‘irlangan token cheksiz ishlamasligi kerak.
  5. Maxfiy kalitlar koddan tashqarida saqlanadi.
  6. Kirishga urinishlar soni cheklanadi. Parolni tanlab topish (brute-force) qiyin bo‘lishi kerak.

Xulosa

  • Identifikatsiya — kim ekanini aytish, autentifikatsiya — buni tekshirish, avtorizatsiya — ruxsatlarni aniqlash.
  • Autentifikatsiya omillari: biladigan, egalik qiladigan va o‘zidagi narsa. Ikki turli omil birgalikda 2FA hosil qiladi.
  • HTTP holatsiz, shuning uchun login’dan keyin klient har so‘rovda session ID yoki token yuboradi.
  • Token odatda Authorization: Bearer ... sarlavhasida yuboriladi.
  • 401 — "sizni tanimadim", 403 — "tanidim, lekin ruxsat yo‘q".

Keyingi darsda session va token asosidagi autentifikatsiyani solishtiramiz.