ข้ามไปยังเนื้อหา

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 อยู่ได้ (คุณยังทำสิ่งนั้นไม่ได้)

  • 401 Unauthorized — authentication ล้มเหลวหรือขาดหายไป client ควรส่งหรือ refresh credentials โดยทั่วไปจะมาพร้อมกับ header WWW-Authenticate
  • 403 Forbidden — authentication สำเร็จ แต่ผู้เรียกใช้ไม่มีสิทธิ์ การส่ง credentials ตัวอื่นมาก็ไม่ช่วยอะไร

ตัวตนเดินทางอยู่ใน header Authorization:

GET /me HTTP/1.1
Authorization: Bearer eyJhbGciOiJI...
JavaScript
Conceptคำถามตัวอย่าง
Authenticationคุณคือใคร?login, verify JWT token
Authorizationคุณทำอะไรได้บ้าง?check role, check permission
Status Codeความหมายเมื่อใช้
401 Unauthorizedยังไม่ได้ authenticateไม่มี token, token หมดอายุ
403 Forbiddenauthenticate แล้วแต่ไม่มีสิทธิ์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 /orders block คนที่ไม่มีสิทธิ์ แต่ 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 ใด
authorization ตอบคำถามข้อใด?
มีการส่ง token ที่ถูกต้องมา แต่ user ไม่มีสิทธิ์ลบ resource นี้ ควรใช้ status ใด?
มี request เข้ามาโดยไม่มี credentials ใด ๆ เลย ควรใช้ status ใด?