How does JWT work?

26 July 2023

How does JWT work

edit: I updated the post to correct the JWT validation procedure.

Web application တွေရေးတဲ့အခါ များသောအားဖြင့် REST API တွေရေးတဲ့အခါမှာ API တွေကို secured ဖြစ်အောင်လုပ်ဖို.လိုလာပါတယ်။ အဲ့ဒီအခါကျရင် API တွေကို token based authentication အနေနဲ. authenticate လုပ်လို.ရပါတယ်။

HTTP protocol သည် နဂိုမူလ သဘာဝအရကို stateless protocol ဖြစ်ပါတယ်။ဆိုချင်တာက user id 1 ကနေ request 1, ပြီးရင် request.2 လွှတ်မယ် ဒါပေမဲ့ request 1 နဲ. request 2 ဆက်စပ်နေတယ် user တယောက်ထဲက လုပ်တဲ့ action တွေဆိုတာကို မသိပါဘူး.။ အဲ့တော့ ခုနက ကောင်ကိုထိန်းဖို.အတွက် session ဆိုတာမျိုးကိုသုံးရပါတယ်။ session ဆိုတာ အလွယ် မြင်သာအောင်ပြောရရင် user တယောက်ကို unique session id တခုပေးလိုက်တယ်ပေါ့။
ဒါဆို browser ကနေ server ကိုသွားတဲ့ request တိုင်းအတွက် အဲ့ဒီ session ကို http request မှာထဲ့ပေးလိုက်ပါတယ်။ ဒါဆို ဒီ request သည် ဘယ် user ကလုပ်တာ ဆိုပြီး သိနိုင်ပါပြီ။
Http operation တွေလုပ်တိုင်း user ဘယ်သူက လုပ်တာဟေ့ နော်ဆိုပြီးပြောနေရတာမျိုးပါ၊ ဒါမှ stateful ဖြစ်အောင် application ကအလုပ်လိုပ်နိုင်ပါမှာပါ။

အဲ့တော့ REST API တွေသည် stateless ဖြစ်တယ်ပေါ့ session မသုံးဘူး။ session id ကို request တိုင်းမှာထဲ့မပေးနိုင်ဘူး။ အဲ့ဒီအစား user ဘယ်သူမှန်းသိစေချင်ရင် username, password ကို request တိုင်းမှာ ထဲ့ပေးမယ်ဆိုပါစို.။ အဲ့ကျရင် man in the middle attack လိုမျိုး ကြားထဲက data transmission က encrypt လုပ်မထားဘူးဆိုရင် ပြဿနာတက်နိုင်ပါတယ်။

အဲ့တော့ ဘယ်လို apporach မျိုးကိုစဉ်းစားလဲဆိုရင် cryptography က algorithm တွေ hashing အစရှိတာတွေသုံးပြီးတော့ user ကို ပထမ login ဝင်ခိုင်းပါတယ်။ user က login မှန်သွားပြီဆိုရင် ခုနက user အတွက် ဒီလူသည် valid user ဖြစ်ကြောင်း hash code တခုထုတ်ပေးလိုက်ပါတယ်။ ပွဲတွေမှာ ဝင်ခွင့်လက်မှတ်ပေးလိုက်သလိုပေါ့ ဉပမာ လက်မှတ်မှာ လူနာမည်မပါတော့ပဲ token တခုခုပြန်ပေးတယ်ပေါ့။(technically အရတော့ hash ပေါ့)

အဲ့ဒီ hash token ကို ရပြီဆိုရင် နောက်ပိုင်းမှာ username ,login ပေးစရာမလိုတော့ပဲနဲ. ခုနက hash token ကိုပေးလိုက်တာနဲ. ဆာဗာက နေ ဒီ user သည် valid ဖြစ်မဖြစ်ဆိုတာကိုသိပါပြီ။ အဲ့ကနေ access ပေးလို.ရပါပြီ။ JWT မှာကျတော့ authenticaion hash token တင်မကပဲနဲ. ဒီ user သည် ဘာ user ဘယ် လို role အစရှိတာတွေဖြစ်တဲ့ additional information ပါထဲ့ပေးလို.ရပါတယ် အဲ့ကောင်ကို payload လို.ခေါ်ပါတယ်။

ဒီနေရာမှာ hashing ကို နည်းနည်းလောက်ပြောရပါမယ်။ Hash ဆိုတာ one way cryptographic function ဖြစ်ပါတယ်။ နားလည်အောင်ပြောရရင် hash သည် plin text( such as password) စတာမျိုးကို input အနေနဲ.ယူပါတယ် ပြီးရင် fixed size string ထုတ်ပေးပါတယ်။

ဉပမာ sha256 ဆိုပါစို.ဒီက online tool ကနေ သုံးပြီးထုတ်မယ်ဆိုပါစို.
https://emn178.github.io/online-tools/sha256.html
plain text ကို admin လို.ပေးလိုက်ရင် hash က ဒီလိုရပါမယ်
8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918

hash ရဲ.အားသာတာက ခုနက hash ကို plain text ဖြစ်အောင် ပြန်ထုတ်ဖို.မလွယ်တာပါ( rainbow table , bruce force ဘာညာနဲ.တိုက်ရင်တော့ တမျိုးပေါ့ ) ဆိုချင်တာက plain text ကနေ hash algorithm သိရင် hash ထုတ်လို.ရပေမဲ့ hash ပဲသိမယ် algorithm ပဲသိမယ်ဆိုရင် plain text ပြန်ထုတ်မရတာပါပဲ၊
ခုနက admin လိုကောင်မျိုးဆိုရင်တော့ ထုတ်ပြီးသား hash တွေ ရှိတဲ့အတွက် တိုက်ရလွယ်နိုင်ပါတယ် ဒါမျိုးဆို admin တခုထဲမသုံးပဲ ကိုယ်ပဲသိတဲ့ secret key တခုခုနဲ. hash လုပ်မယ်ဆိုရင် hash သည် (rainbow table)စတာတွေနဲ.တွက်ရတာပိုခက်သွားပါမယ်။
အဲ့တော့ hash ကိုသုံးပြီးတော့ authentication ကိုဒီလိုစစ်လို.ပါတယ်

hash(password+secret_key) = hash token
User register လုပ်တဲ့အခါ password ကိုမသိမ်းထားပဲ ခုနကရတဲ့ hash token ကိုပဲသိမ်းထားပါတယ်. secrte_key ကို salt လို.လူသိများတယ်။

နောက် login ဝင်တဲ့အခါ hash(password+secret_key) ကိုတွက်ပါတယ် ရတဲ့ hash နဲ.သိမ်းထားတဲ့ hash တူရင် login မှန်တယ်ပေါ့။
အဲ့တော့ hash သည်Non-reversibility ဖြစ်တယ်ပေါ့။ JWT ကိုနားလည်ဖို. ဘာလိုသေးလဲဆိုတော့ encoding ပါ။
Encoding ကကျတော့ reversibility ဖြစ်ပါတယ် ဉပမာ A ကို ASCII နဲ. encode လုပ်ရင် 65ပါပဲ ဒါသည် encode ပါပဲ။ လူတိုင်းဖတ်လို.ရပါတယ် ပုံစံပြောင်းသိမ်းထားတာပါပဲ။ ကားကို ဗမာလို ကားလို. encode လုပ်ပြီး english လို car လို. encode လုပ်သလိုပါပဲ။

ခုနက JWT ကိုပြန်ဆက်ရရင်
1 Login ဝင်မယ် အိုကေရင် JWT Token ပြန်ပေးမယ်
2 Token မှာ user ကို authenticated လုပ်လို.ရတဲ့ hash ရယ် payload ရယ်ပါမယ်။ Payload သည် encode လုပ်ထားတာဖြစ်တဲ့အတွက် လူတိုင်းဖတ်လို.ရမယ်။ ဒါမို. sensisitive ဖြစ်တဲ့ data မသိမ်းသင့်ဘူး။
3. App က authenticate လုပ်တဲ့အခါ JWT Token ပေးလိုက်မယ်။
4. Server က JWT Token သည် ဟုတ်ရဲ.လားမှန်ရဲ.လားဆိုပြီး စစ်မယ် hashing algorithm တွေနဲ.ပေါ့. အိုကေရင် access ပေးလုပ်မယ်ပေါ့၊

JWT Token မှာ ၃ ပိုင်းပါတယ်။

const token = base64urlEncoding(header) + ‘.’ + base64urlEncoding(payload) + ‘.’ + base64urlEncoding(signature)

header မှာဘာပါတာလဲဆိုတော့ hashing algorithm ဘာသုံးထားလဲပါမယ်။ eg ဒါမျိုးပေါ့
{
“alg” : “HS256”,
“typ” : “JWT”
}
Payload မှာတော့ user role တွေဘာညာပါမယ် (payload သည် လူတိုင်းဖတ်လို.ရတယ်ဆိုတာသတိထားပါ) ဒါမျိုးပေါ့
{
“loggedInAs” : “admin”,
“iat” : 1422779638
}
နောက်ဆုံးအပိုင်း signature ကတော့ ဒီလိုနည်းနဲ.ရတာ

HMAC-SHA256(
secret,
base64urlEncoding(header) + ‘.’ +
base64urlEncoding(payload)
)

အဲ့မှာ secret ဆိုတာ ဆာဗာကပဲသိတဲ့ key ပေါ့ ပြောရရင်
အဲ့တော့ စဉ်းစားကြည့်ရင် JWT ကို verification ဘယ်လိုလုပ်သလဲဆိုရင် user ပို.လိုက်တဲ့ပို.လိုက်တဲ့ header ရယ် payload ရယ်ရှိမယ် အဲ့တာကို အရင် hashing example မှာပြတဲ့ plain text (password) သဘောထားပါစို. ဒါဆို server က secret key နဲ.ပေါင်းပြီးနဲ. hash တွက်လိုက်လို. မှန်မှ authenticate ဖြစ်မယ်။ အပေါ်က data တွေကို JWT ထုတ်ရင် ဒီလိုရမယ်ပေါ့။

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 သည် header သူ.ကို base64 decode လုပ်ရင်ဒါရမယ်
https://www.base64decode.org ဒါကိုသုံးပေါ့
{“alg”:”HS256″,”typ”:”JWT”}

JWT ကဒီနေရာမှာသုံးတာ hashing ထက် signing ကိုသုံးတာ ဘာကွာလဲဆိုတော့ signing ဆိုတာ hash algorithm ထဲကို user data အပြင် secrete key ပါထဲ့ပေးလိုက်တာ။

နောက်တပိုင်း

eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9 ကို based64 decode လုပ်ရင်
ဒါရမယ် {“loggedInAs”:”admin”,”iat”:1422779638}

နောက်ဆုံးအပိုင်း
သည် HMAC-SHA256(
secret,
base64urlEncoding(header) + ‘.’ +
base64urlEncoding(payload)
) ကရတဲ့ကောင်

အဲ့တော့ ခုနက user ပေးထားတဲ့ header payload ရယ် server က secret_key ရယ် ကို HMAC-SHA256 တွက်မယ်ဆို.ပါစို.

https://www.devglan.com/online-tools/hmac-sha256-online
ဒီမှာ plain text ကို ဒါပေး

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9

(base64urlEncoding(header) + ‘.’ +
base64urlEncoding(payload) နဲ. အပိုင်းပေါ့)

ဒီနေရာမှာသုံးသွားတဲ့ secrte_key က ‘secrtekey’ ဆိုတဲ့ string ပါ. Wikipeida က example ကိုယူသုံးပါတယ်။

ပြီး output ကို base64 ထုတ်ရင် ဒါရမယ်။ တကယ်က urlencode နဲ.ဆိုဒါရမယ်
gzSraSYS8EXBxLN/oWnFSRgCzcmJmMjLiuyu5CSpyHI

ဒါဆိုရတဲ့ကောင်နဲ. jwttoken နောက်ဆုံးအပိုင်းတူရင်မှန်ပြီ.

JWT တခြား အားသာတာတွေက multiple server တွေသုံးတဲ့အခါ load balancing လိုကောင်မျိုးမှာ scalable ဖြစ်ပါတယ်။

Original link

crd=>(https://m.facebook.com/story.php?story_fbid=pfbid0JPgpLg5rekRY6tEo26JfXooLu2RDf8dKt7p2dG53DHvV3hRuudsaajieZUGEsUJjl&id=1819241055&mibextid=Nif5oz)

One thought on “How does JWT work?”

Leave a comment