နားလည်ထားရမယ့် အချက်
Authentication နဲ့ authorization ဆိုတာ အသံထွက်တူသလို ခံစားရပေမယ့် လုံးဝကွဲပြားတဲ့ မေးခွန်းနှစ်ခုကို ဖြေဆိုနေတာပါ။
Authentication က "သင်ဘယ်သူလဲ" ဆိုတဲ့ မေးခွန်းကို ဖြေတယ်—password၊ passkey၊ (သို့) valid session token ဖြင့် identity ကို သက်သေပြတာပါ။
Authorization ကတော့ ဒီ identity က ဒီ resource အပေါ် အခုချိန်မှာ ဘာလုပ်ခွင့်ရှိလဲဆိုတာကို ဖြေတယ်။ တစ်ခုကျော်တာနဲ့ တခြားတစ်ခုကို အလိုလို မရရှိဘူး။
GET /users/123 ကို စဉ်းစားကြည့်ပါ။ login ဝင်ထားတယ်ဆိုတာနဲ့ user တိုင်းရဲ့ data ကို ကြည့်ခွင့်ရတာ မဟုတ်ဘူး။
Insecure Direct Object bug
login ဝင်ထားတဲ့ user တစ်ဦးက URL ထဲက ID ကို ပြောင်းပြီး တခြားသူ့ private data ကို မြင်နိုင်ရင်၊ authentication ပြီးပြည့်စုံစွာ အလုပ်လုပ်ခဲ့ပေမယ့် authorization ကျရှုံးသွားတာပါ။
ဒီနှစ်ခုကို အစဉ်လိုက် သီးခြားစစ်ဆေးရမည့် gate နှစ်ခုအဖြစ် သဘောထားပါ။ Authentication က identity ကို တစ်ကြိမ်တည်း အတည်ပြုပြီး authorization ကတော့ resource၊ action တစ်ခုချင်းစီအတွက် ပြန်လည်အကဲဖြတ်ရမယ်။
- Authentication
- user ဘယ်သူဖြစ်တယ်ဆိုတာ password၊ passkey၊ (သို့) valid session token လို credential ကို စစ်ဆေးခြင်းဖြင့် အတည်ပြုသည့် လုပ်ငန်းစဉ်။
- Authorization
- identity အတည်ပြုပြီးသား user တစ်ဦးက ဘာလုပ်ခွင့်ရှိသည်ကို resource၊ action တစ်ခုချင်းစီအလိုက် ဆုံးဖြတ်သည့် လုပ်ငန်းစဉ်။
AUTHENTICATION VS AUTHORIZATION
-------------------------------
REQUEST
|
v
[AUTHENTICATION] <- who are you?
|
| pass (identity confirmed)
v
[AUTHORIZATION] <- allowed to do THIS, on THIS resource?
|
+-- pass --> ALLOW (proceed)
|
+-- fail --> DENY (403, even though logged in)လက်တွေ့ scenario နဲ့ ချိတ်ကြည့်မယ်
အောက်က function က နှစ်ခုသီးခြား gate flow ကို ပကတိ runnable code အဖြစ် တင်ပြထားတယ်—boolean တစ်ခုတည်းအဖြစ် ပေါင်းမစဉ်းစားဘဲ gate တစ်ခုစီကို သီးခြားစစ်ဆေးတယ်။
Authentication fail ရင် function ချက်ချင်းရပ်ပြီး authorization ကို ကြည့်တောင် မကြည့်ဘဲ DENY ကို ပြန်ပေးတယ်။
Case 1 — owner မှား
User 456 က user 123 ပိုင်တဲ့ resource ကို တောင်းတယ်။ Authentication ကျော်ပေမယ့် authorization မှန်ကန်စွာ fail: DENY.
Case 2 — owner မှန်
user တစ်ယောက်တည်းက သူ့ resource ကိုယ်တိုင် တောင်းတယ်။ gate နှစ်ခုစလုံး ကျော်: ALLOW.
check နှစ်ခုကို structurally သီးခြားထား၊ output ထဲမှာလည်း result သီးခြားစီပြထားခြင်းက ဒီ bug ကို production မရောက်ခင် ဖမ်းမိစေတယ်။
အတူတူ စမ်းရေးကြည့်မယ်
function checkAccess(request) {
const authResult = request.isAuthenticated
? { gate: "authentication", passed: true }
: { gate: "authentication", passed: false, reason: "not logged in" };
if (!authResult.passed) {
return { authentication: authResult, authorization: null, decision: "DENY" };
}
const isOwner = request.requestedResourceOwnerId === request.actualUserId;
const authzResult = isOwner
? { gate: "authorization", passed: true }
: {
gate: "authorization",
passed: false,
reason: `user ${request.actualUserId} does not own resource owned by ${request.requestedResourceOwnerId}`,
};
return {
authentication: authResult,
authorization: authzResult,
decision: authzResult.passed ? "ALLOW" : "DENY",
};
}
const authenticatedButNotOwner = checkAccess({
isAuthenticated: true,
requestedResourceOwnerId: 123,
actualUserId: 456,
});
const fullyAuthorized = checkAccess({
isAuthenticated: true,
requestedResourceOwnerId: 123,
actualUserId: 123,
});
console.log("Case 1 - authenticated but not the owner:");
console.log(JSON.stringify(authenticatedButNotOwner, null, 2));
console.log("\nCase 2 - authenticated and owns the resource:");
console.log(JSON.stringify(fullyAuthorized, null, 2));Case 1 - authenticated but not the owner:
{
"authentication": {
"gate": "authentication",
"passed": true
},
"authorization": {
"gate": "authorization",
"passed": false,
"reason": "user 456 does not own resource owned by 123"
},
"decision": "DENY"
}
Case 2 - authenticated and owns the resource:
{
"authentication": {
"gate": "authentication",
"passed": true
},
"authorization": {
"gate": "authorization",
"passed": true
},
"decision": "ALLOW"
}၅ မိနစ် စမ်းကြည့်
checkAccess ကို "admin" ဆိုတဲ့ တတိယ role တစ်ခုအတွက် ချဲ့ကြည့်ပါ—admin ဆိုရင် ownership မစဉ်းစားဘဲ resource မည်သည့်ကိုမဆို authorize ဖြစ်ရမယ်။ request object ထဲမှာ role field တစ်ခု ထည့်ပြီး authorization check ကို ပြင်ကြည့်ပါ၊ ပြီးရင် admin က ပိုင်ဆိုင်မှုမရှိတဲ့ resource ကို ဝင်နိုင်ပေမယ့် ပုံမှန် user က ဆက်လက် ဝင်မရနိုင်ကြောင်း စစ်ဆေးပါ။
သတိလေးတစ်ချက်
"user login ဝင်ထားလား" ဆိုတာသာ စစ်ဆေးပြီး action တိုင်းအတွက် access control ကို ဖုံးလွှမ်းပြီဟု ယူဆခြင်း။
authenticated user က တကယ်ပိုင်ဆိုင်သလား၊ ဝင်ခွင့်ရှိသလားဆိုတာ မစစ်ဆေးဘဲ client ဘက်က resource ID (URL၊ body၊ query string) ကို ယုံကြည်ခြင်း။
နားလည်မှု စစ်ဆေးကြည့်ပါ
OWASP Authorization Cheat Sheet — Digital Privacy & Modern Security