Authentication vs Authorization
สองคำนี้ฟังคล้ายกันแต่ทำงานคนละหน้าที่ แยกให้ชัดตั้งแต่ต้นแล้วทั้ง code และ status code ของคุณจะกระจ่างขึ้นเอง
ความแตกต่าง
หัวข้อที่มีชื่อว่า “ความแตกต่าง”- Authentication (authn) — คุณคือใคร? client พิสูจน์ตัวตนด้วย credential ได้แก่ API key, session cookie หรือ bearer token
- Authorization (authz) — คุณได้รับอนุญาตให้ทำอะไรได้บ้าง? เมื่อรู้ตัวตนแล้ว server จะตัดสินว่าผู้เรียกใช้คนนี้ทำ action นี้กับ resource นี้ได้หรือไม่
Authentication มาก่อน แล้ว authorization จึงต่อยอดจากผลลัพธ์นั้น request หนึ่งอาจผ่าน authenticated แล้ว (เรารู้ว่าคุณคือใคร) แต่ยัง unauthorized อยู่ได้ (คุณยังทำสิ่งนั้นไม่ได้)
status code ของแต่ละตัว
หัวข้อที่มีชื่อว่า “status code ของแต่ละตัว”401 Unauthorized— authentication ล้มเหลวหรือขาดหายไป client ควรส่งหรือ refresh credentials โดยทั่วไปจะมาพร้อมกับ headerWWW-Authenticate403 Forbidden— authentication สำเร็จ แต่ผู้เรียกใช้ไม่มีสิทธิ์ การส่ง credentials ตัวอื่นมาก็ไม่ช่วยอะไร
การพก credential ไปด้วย
หัวข้อที่มีชื่อว่า “การพก credential ไปด้วย”ตัวตนเดินทางอยู่ใน header Authorization:
GET /me HTTP/1.1Authorization: Bearer eyJhbGciOiJI...ด่าน auth แบบขั้นต่ำ
หัวข้อที่มีชื่อว่า “ด่าน auth แบบขั้นต่ำ”| Concept | คำถาม | ตัวอย่าง |
|---|---|---|
| Authentication | คุณคือใคร? | login, verify JWT token |
| Authorization | คุณทำอะไรได้บ้าง? | check role, check permission |
| Status Code | ความหมาย | เมื่อใช้ |
|---|---|---|
| 401 Unauthorized | ยังไม่ได้ authenticate | ไม่มี token, token หมดอายุ |
| 403 Forbidden | authenticate แล้วแต่ไม่มีสิทธิ์ | role ไม่พอ, ไม่ใช่เจ้าของ resource |
ข้อผิดพลาดที่พบบ่อย
หัวข้อที่มีชื่อว่า “ข้อผิดพลาดที่พบบ่อย”Return 403 แทน 401 เมื่อไม่มี Token อาการ:
- request ไม่มี Authorization header → server return 403
- client ไม่รู้ว่าต้อง login ก่อน — คิดว่าตัวเองไม่มีสิทธิ์
- ไม่มี token หรือ token invalid → 401; authenticate แล้วแต่สิทธิ์ไม่พอ → 403
Authorization Check ที่ไม่ครบ อาการ:
- check permission ที่ route level แต่ไม่ check ที่ resource level
GET /ordersblock คนที่ไม่มีสิทธิ์ แต่GET /orders/\{id\}ไม่ check ว่า order นั้นเป็นของ user หรือไม่- ต้อง check ทั้ง action permission และ resource ownership
💡 ตัวอย่างจากของจริง
GitHub API:
- 401 เมื่อ token ไม่ valid หรือหมดอายุ
- 403 เมื่อ token valid แต่ไม่มีสิทธิ์ทำ operation นั้น (เช่น push ไปยัง repo ที่ไม่ใช่เจ้าของ)
AWS API:
- authentication ผ่าน SigV4 — sign ทุก request
- authorization ผ่าน IAM policy — ระบุ action ที่ทำได้ต่อ resource ใด