Оршил
Орчин үеийн веб болон мобайл системүүд аюулгүй, өргөтгөх боломжтой authentication шийдэл шаардах болсон. Өмнө нь сервер дээр session хадгалдаг уламжлалт арга түгээмэл байсан бол өнөөдөр JWT (JSON Web Token) нь distributed system, microservice, API-д суурилсан архитектурт хамгийн их ашиглагддаг стандарт болсон.
Гэхдээ JWT-г буруу ашиглавал аюулгүй байдлын ноцтой асуудал үүсэх эрсдэлтэй. Тиймээс software engineer хүн JWT-г зүгээр нэг “token” гэж харах биш, дотоод бүтэц, зорилго, сул тал, зөв ашиглах аргачлалыг бүрэн ойлгох ёстой.
Энэ нийтлэлээр:
- JWT гэж юу вэ
- Яагаад хэрэгтэй болсон бэ
- Яаж ажилладаг вэ
- Хаана ашиглах нь зөв бэ
- Шилдэг практикууд (best practices)
гэсэн сэдвүүдийг гүнзгий тайлбарлах гэж хичээх болноо.
JWT Token гэж юу вэ?
JWT (JSON Web Token) гэдэг нь хоёр талын хооронд мэдээллийг JSON хэлбэрээр аюулгүй дамжуулах зориулалттай, compact буюу богино token формат юм. JWT нь digital signature-аар хамгаалагдсан байдаг тул token доторх мэдээлэл өөрчлөгдөөгүй гэдгийг баталгаажуулах боломжтой.
JWT-г ихэвчлэн дараах зорилгоор ашигладаг:
- Хэрэглэгчийг баталгаажуулах (Authentication)
- Эрх шалгах (Authorization)
- Service хооронд identity дамжуулах
JWT-ийн гол онцлог нь stateless буюу сервер дээр session хадгалах шаардлагагүй явдал юм.
JWT яагаад хэрэгтэй болсон бэ?
JWT гарч ирэхээс өмнө ихэнх системүүд session-based authentication ашигладаг байсан.
Тэр процесс нь:
- Хэрэглэгч login хийнэ
- Сервер session үүсгэнэ
- Session ID-г database эсвэл memory-д хадгална
- Client session ID-г request бүрт явуулна
Энэ арга нь дараах сул талтай:
- Серверийг олон болгоход session хуваалцах асуудал үүснэ
- Redis, DB зэрэг нэмэлт storage шаардлагатай
- Microservice архитектурт тохиромжгүй
- Performance болон scalability муу
JWT нь эдгээр асуудлыг дараах байдлаар шийддэг:
- Session хадгалах шаардлагагүй
- Request бүр өөрөө identity агуулдаг
- Серверүүд хооронд state хуваалцах шаардлагагүй
- Cloud болон microservice-д маш тохиромжтой
JWT-ийн бүтэц
JWT нь 3 хэсгээс бүрдэнэ. Эдгээр нь цэгээр тусгаарлагдана.
header.payload.signature
1. Header
Header хэсэгт token-ий мета мэдээлэл байна.
{
"alg": "HS256",
"typ": "JWT"
}
alg– гарын үсэг зурах алгоритмtyp– token-ийн төрөл
2. Payload
Payload хэсэгт claims буюу token-д агуулагдах мэдээлэл байна.
{
"sub": "user_id_123",
"email": "user@example.com",
"role": "admin",
"iat": 1710000000,
"exp": 1710003600
}
Claim-үүд 3 төрөлтэй:
- Registered claims (
exp,iat,iss,aud) - Public claims
- Private claims (таны системд зориулсан)
Чухал анхаарах зүйл:
Payload нь encryption хийгдээгүй, зөвхөн base64 encoding хийдэг. Тиймээс хэн ч decode хийж уншиж чадна.
3. Signature
Signature нь token өөрчлөгдөөгүй гэдгийг баталгаажуулна.
HMACSHA256(
base64(header) + "." + base64(payload),
secret
)
Хэрвээ payload эсвэл header өөрчлөгдвөл signature таарахгүй болно.
JWT Authentication хэрхэн ажилладаг вэ?
JWT ашигласан стандарт authentication урсгал:
- Хэрэглэгч login хийнэ
- Сервер хэрэглэгчийн мэдээллийг шалгана
- Сервер JWT token үүсгэнэ
- Token-ийг client-д илгээнэ
- Client request бүрт token явуулна
- Сервер token-ийг шалгана
- Эрх байвал хүсэлтийг зөвшөөрнө
Token ихэвчлэн дараах header-ээр дамждаг:
Authorization: Bearer <JWT>
Stateless Authentication гэж юу вэ?
JWT-ийн хамгийн том давуу тал нь stateless байдал юм.
Өөрөөр хэлбэл:
- Сервер session хадгалахгүй
- Request бүр өөрөө identity агуулна
- Сервер зөвхөн token шалгана
Энэ нь:
- Microservice
- API Gateway
- Cloud-native систем
- Mobile application
зэрэг орчинд маш тохиромжтой.
JWT болон Session-ийн харьцуулалт
| Шинж | JWT | Session |
|---|---|---|
| Сервер storage | Байхгүй | Байна |
| Scalability | Маш сайн | Хязгаарлагдмал |
| Logout | Хэцүү | Амар |
| Token size | Том | Жижиг |
| Аюулгүй байдал | Буруу ашиглавал эрсдэлтэй | Тогтвортой |
JWT бол session-ийг бүрэн орлох зүйл биш, зөвхөн зөв тохиолдолд ашиглах хэрэгсэл юм.
JWT ашиглах түгээмэл тохиолдлууд
- REST API
- Single Page Application
- Mobile app
- Microservice хоорондын authentication
- OAuth access token
JWT ашиглах шилдэг практикууд
Энэ хэсэг хамгийн чухал.
1. JWT дотор нууц мэдээлэл бүү хадгал
JWT payload нь уншигдах боломжтой.
Хадгалж болохгүй зүйлс:
- Password
- Card number
- Private key
- Sensitive personal data
Зөвхөн ID, role, permission зэрэг мэдээлэл хадгал.
2. Заавал HTTPS ашигла
JWT-г HTTP-ээр дамжуулах нь маш аюултай.
HTTPS байхгүй бол:
- Token хулгайлагдана
- User impersonation боломжтой
HTTPS бол заавал байх ёстой шаардлага.
3. Token-ийн хугацааг богино байлга
Санал болгож буй хугацаа:
- Access token: 5–15 минут
- Refresh token: 7–30 хоног
exp claim-ийг заавал ашигла.
4. Refresh Token зөв ашигла
Урт хугацаатай access token ашиглаж болохгүй.
Зөв загвар:
- Богино access token
- Урт refresh token
- Refresh token revoke хийх боломжтой байх
5. Зөв signing algorithm сонго
Зөвлөмж:
- RS256
- ES256
HS256 ашиглах бол secret маш сайн хамгаалагдсан байх ёстой.
6. Claim шалгалтыг бүрэн хий
Заавал шалгах:
- Signature
- Expiration (
exp) - Issuer (
iss) - Audience (
aud) - Not before (
nbf)
7. Client дээр token-ийг аюулгүй хадгал
Сайн сонголт:
- HttpOnly cookie
- Secure cookie
Муу сонголт:
- LocalStorage (XSS эрсдэлтэй)
8. Token revoke стратеги төлөвлө
JWT stateless тул revoke хийх хэцүү.
Шийдлүүд:
- Богино expiration
- Token blacklist
- Refresh token rotation
jtiашиглах
9. JWT-г session орлуулах гэж сохроор бүү ашигла
JWT тохиромжгүй нөхцөл:
- Admin panel
- Banking систем
- Шууд logout шаардлагатай систем
10. Monitoring болон logging хий
Анзаарах зүйлс:
- Token reuse
- Suspicious refresh
- Replay attack
Security гэдэг бол зөвхөн код биш, хяналт юм.
JWT ашиглах үед гардаг нийтлэг алдаа
- JWT-г encryption гэж ойлгох
- Урт хугацаатай access token ашиглах
- LocalStorage-д token хадгалах
- Expiration шалгахгүй байх
- JWT-г бүх асуудлын шийдэл гэж бодох
JWT ашиглах ёсгүй нөхцөлүүд
JWT ашиглахгүй байсан нь дээр:
- Энгийн монолит систем
- Шууд logout чухал үед
- Compliance өндөр шаардлагатай систем
- Session storage асуудал биш үед
Орчин үеийн Software Engineering дахь JWT
JWT нь дараах архитектурт төгс тохирно:
- Zero-trust system
- API Gateway
- Microservice
- Cloud deployment
- Mobile-first application
JWT-г сайн ойлгодог инженер бол authentication дизайныг зөв хийдэг.
Дүгнэлт
JWT бол орчин үеийн программ хангамжийн салбарт маш хүчирхэг хэрэгсэл юм. Гэхдээ хүчтэй зэвсэг буруу гарт орвол аюултайтай адил, JWT-г буруу ашиглавал системийн аюулгүй байдалд том эрсдэл үүсгэнэ.
Жинхэнэ software engineer хүн:
- JWT хэрхэн ажилладгийг ойлгодог
- Хэзээ ашиглах, хэзээ ашиглахгүйг мэддэг
- Best practice-уудыг мөрддөг
- Security-г нэгдүгээрт тавьдаг
JWT-г зөв ашиглавал scalable, найдвартай системийн суурь болж чадна.