บทความทั้งหมด

HTTP Basic Auth: เฮดเดอร์ Authorization ถูกสร้างขึ้นอย่างไร

HTTP Basic Authentication เป็นวิธีปกป้องทรัพยากรด้วยรหัสผ่านที่เก่าแก่และเรียบง่ายที่สุดวิธีหนึ่ง เบราว์เซอร์จะถามหาชื่อผู้ใช้และรหัสผ่าน แล้วส่งทั้งคู่ไปพร้อมกับทุกคำขอไปยังเซิร์ฟเวอร์ ความเรียบง่ายนี้เองที่เป็นจุดอ่อนสำคัญที่สุดของมัน

Authorization header ถูกสร้างขึ้นอย่างไร

ชื่อผู้ใช้และรหัสผ่านถูกนำมาต่อกันด้วยเครื่องหมายโคลอน (username:password) จากนั้นทั้งสตริงจะถูกเข้ารหัสแบบ Base64 แล้วใส่ไว้ใน header Authorization: Basic <สตริงที่เข้ารหัสแล้ว> เบราว์เซอร์จะแนบ header นี้อัตโนมัติในทุกคำขอถัดไปหลังจากล็อกอินสำเร็จครั้งแรก

ทำไม Base64 ไม่ใช่ความปลอดภัย

Base64 เป็นแค่วิธีเข้ารหัสข้อมูล ไม่ใช่การเข้ารหัสลับ (encryption) — ใครก็ตามสามารถถอดสตริงนี้กลับเป็น username:password ได้ภายในไม่กี่วินาที โดยไม่ต้องใช้กุญแจใด ๆ เลย หากคำขอถูกดักจับระหว่างทาง เช่น ผ่าน Wi-Fi สาธารณะที่ไม่มีการป้องกัน ข้อมูลล็อกอินจะถูกเปิดเผยทันที

ตัวอักษรไทยกับขนาดของ Base64

Base64 เข้ารหัสระดับไบต์ ไม่ใช่ระดับตัวอักษร ดังนั้นการเข้ารหัสของสตริงต้นฉบับจึงมีผลโดยตรง ตัวอักษรละตินใช้พื้นที่เพียง 1 ไบต์ใน UTF-8 แต่ตัวอักษรไทยแต่ละตัว รวมถึงสระลอยและวรรณยุกต์ที่เขียนซ้อนกันโดยไม่มีช่องว่างระหว่างคำ ใช้พื้นที่ถึง 3 ไบต์ต่อตัว รหัสผ่านอย่าง รหัสผ่าน123 จึงให้โทเค็น Base64 ที่ยาวกว่ารหัสผ่านภาษาอังกฤษที่มีจำนวนตัวอักษรเท่ากันอย่างเห็นได้ชัด ก่อนมี RFC 7617 ในปี 2015 ข้อกำหนด Basic Auth ดั้งเดิมไม่ได้ระบุการเข้ารหัสตัวอักษรสำหรับชื่อผู้ใช้และรหัสผ่านไว้เลย ทำให้ HTTP client แต่ละตัวตีความอักขระนอก ASCII แตกต่างกันได้

ใช้ทำอะไรได้บ้าง

  • ปกป้อง staging server หรือเครื่องมือภายในองค์กรด้วยรหัสผ่านอย่างรวดเร็วระหว่างการพัฒนา
  • สร้าง Authorization header ที่ถูกต้องสำหรับทดสอบ API ด้วยตนเองผ่าน curl หรือ Postman
  • เข้าใจว่าทำไมการใช้ Basic Auth ผ่าน HTTP ธรรมดา (ไม่ใช่ HTTPS) จึงถือเป็นช่องโหว่ความปลอดภัยที่ร้ายแรง

Basic Auth ไม่มีกลไกล็อกเอาต์ในตัว

เบราว์เซอร์จะแคชข้อมูลล็อกอินไว้ และแนบ header Authorization อัตโนมัติในทุกคำขอถัดไปที่ไปยัง origin เดียวกัน จนกว่าแท็บจะถูกปิด — โปรโตคอลนี้ไม่มีปุ่ม "ล็อกเอาต์" มาตรฐานเลย เพื่อบังคับให้ผู้ใช้ออกจากระบบ เซิร์ฟเวอร์มักใช้วิธีแก้ขัด เช่น ส่งค่า 401 กลับมาพร้อมค่า realm ที่ต่างออกไปโดยตั้งใจ หรือหวังพึ่งให้ผู้ใช้ปิดแท็บเบราว์เซอร์ทั้งหมดเอง

ลองใช้เครื่องมือ