การยืนยันตัวตน (Authentication) คือการตรวจสอบว่าคุณคือใคร ส่วนการกำหนดสิทธิ์ (Authorization) คือการตัดสินว่าคุณสามารถทำอะไรได้บ้าง แอปพลิเคชันที่ขับเคลื่อนด้วย AI จำนวนมากขึ้นเรื่อยๆ มักจะยืนยันตัวตนของผู้ใช้เพียงครั้งเดียวตอนเข้าสู่ระบบ จากนั้นก็ปล่อยให้เอเจนต์ (agent) ที่อยู่เบื้องหลังสามารถดำเนินการกับทรัพยากรใดๆ ก็ได้ตลอดช่วงเวลาที่ใช้งาน ซึ่งเปรียบเสมือนการมอบ "เช็คเปล่า" ให้กับมัน การออกแบบเช่นนี้เปิดช่องโหว่ให้เกิดข้อมูลรั่วไหลโดยไม่ตั้งใจ, การส่งอีเมลที่ไม่พึงประสงค์ หรือแม้แต่การอัปเดตฐานข้อมูลที่สร้างความเสียหาย และความเสี่ยงจะเพิ่มขึ้นทุกครั้งที่ผู้ช่วย AI สามารถเรียกใช้เครื่องมือหลายอย่างพร้อมกันด้วยความเร็วในระดับมิลลิวินาที

ทำไมความผิดพลาดนี้จึงยังเกิดขึ้นซ้ำๆ

นักพัฒนา AI ส่วนใหญ่มองว่าหน้าจอเข้าสู่ระบบเป็นประตูรักษาความปลอดภัยเพียงบานเดียว โค้ดจะถามหารหัสผ่านหรือโทเค็น ทำเครื่องหมายว่าเซสชันนั้น "ได้รับการยืนยันตัวตนแล้ว" และจากนั้นก็ทึกทักเอาเองว่าคำขอหลังจากนั้นทั้งหมดจะปลอดภัย ในเว็บแอปพลิเคชันแบบดั้งเดิม การคลิกที่เชื่องช้าของผู้ใช้ที่เป็นมนุษย์จะช่วยชะลอการทำงานโดยธรรมชาติ (natural throttling point) เพราะมนุษย์จะหยุดคิดก่อนที่จะกด "ลบ" แต่สำหรับเอเจนต์ AI นั้นสามารถเรียกใช้เครื่องมือ (tool calls) ได้หลายสิบรายการภายในไม่กี่วินาที หากแพลตฟอร์มถามเพียงแค่ว่า "ผู้ใช้เข้าสู่ระบบแล้วหรือยัง?" ทุกการเรียกใช้ก็จะได้รับสิทธิ์ที่ไม่มีข้อจำกัดเหมือนกันทั้งหมด

สาเหตุหลักคือความสะดวกสบาย ทีมงานมักจะจัดเตรียมบัญชีบริการ (service account) ที่มีอายุการใช้งานยาวนานเพียงบัญชีเดียวสำหรับทั้งแอปพลิเคชัน เพื่อที่โค้ดจะได้ไม่ต้องจัดการกับโทเค็นหรือขอบเขตสิทธิ์ (scopes) หลายตัว บัญชีดังกล่าวมักจะมีสิทธิ์ที่กว้างขวาง เช่น อ่าน, เขียน, ลบ ในทุกๆ โปรเจกต์ เมื่อผู้ช่วย AI ทำงานภายใต้เซสชันนั้น มันจะได้รับสิทธิ์เหล่านั้นโดยอัตโนมัติ โดยไม่คำนึงว่างานที่กำลังทำอยู่นั้นจำเป็นต้องใช้สิทธิ์เหล่านั้นจริงหรือไม่

สิ่งที่อาจได้รับความเสียหาย

  • การเปิดเผยข้อมูล – เอเจนต์ที่สามารถอ่านไฟล์ใดก็ได้หลังจากผู้ใช้เข้าสู่ระบบ อาจดึงเอกสารลับเข้าไปอยู่ในคำตอบที่ถูกแชร์ออกไปนอกองค์กรโดยไม่ตั้งใจ
  • การดำเนินการที่ไม่ตั้งใจ – ผู้ช่วย AI ของวิศวกรฝ่ายสนับสนุนอาจรันคำสั่ง SQL query ต่อฐานข้อมูลจริง (production) เพียงเพราะเซสชันของวิศวกรยังคงทำงานอยู่ แม้ว่าคำสั่งนั้นจะไม่เกี่ยวข้องกับตั๋ว (ticket) ที่กำลังจัดการอยู่ก็ตาม
  • การปฏิบัติตามกฎระเบียบ – กฎการคุ้มครองข้อมูลหลายฉบับกำหนดให้การเข้าถึงข้อมูลต้องจำกัดอยู่เพียงเท่าที่จำเป็นเท่านั้น โมเดลการให้สิทธิ์แบบเหมาเข่ง (blanket permission model) อาจละเมิดหลักการเหล่านี้ และนำไปสู่การตรวจสอบหรือการถูกปรับได้
  • ต้นทุนการดำเนินงาน – ความผิดพลาดที่ลบหรือแก้ไขข้อมูลทำให้ทีมต้องย้อนกลับการเปลี่ยนแปลง (roll back), ตรวจสอบหาสาเหตุ และสร้างความเชื่อมั่นกับผู้ใช้ใหม่ ซึ่งทั้งหมดนี้เป็นการสิ้นเปลืองทั้งเวลาและเงินทอง

ขั้นตอนที่ขาดหายไป: การกำหนดสิทธิ์ตามการกระทำ (per-action authorization)

การกำหนดสิทธิ์ควรได้รับการประเมินที่ "ประตู" ทุกบานภายในระบบ ไม่ใช่แค่ที่ประตูทางเข้าหลัก คำถามจะเปลี่ยนจาก "นี่คือใคร?" เป็น "การกระทำเฉพาะเจาะจงนี้บนทรัพยากรเฉพาะเจาะจงนี้ สามารถทำได้ในตอนนี้หรือไม่?" การนำการตรวจสอบนี้มาใช้ไม่จำเป็นต้องออกแบบระบบใหม่ทั้งหมด เพียงแค่ต้องเปลี่ยนจากการใช้แฟล็กเซสชัน (session flag) เพียงตัวเดียว มาเป็นการใช้โทเค็นที่มีขอบเขตและมีอายุการใช้งานสั้น (short-lived, scoped tokens) แทน

วิธีการทำงานในทางปฏิบัติ

  1. ขอโทเค็นที่มีการกำหนดขอบเขต (scope) ที่ชัดเจน – เมื่อเอเจนต์ AI จำเป็นต้องเรียกใช้เครื่องมือ มันจะต้องขอโทเค็นที่ระบุสิทธิ์ที่จำเป็นต้องใช้พอดี (เช่น read:ticket, execute:sql_query)
  2. ตรวจสอบความถูกต้องของโทเค็นในทุกการเรียกใช้ – ก่อนที่เครื่องมือจะทำงาน บริการจะตรวจสอบว่าโทเค็นนั้นมีขอบเขตที่ต้องการและโทเค็นยังไม่หมดอายุ
  3. จับคู่ทรัพยากรกับขอบเขตสิทธิ์ – หากคำขอพุ่งเป้าไปที่โปรเจกต์หรือฐานข้อมูลเฉพาะ โทเค็นจะต้องได้รับอนุญาตให้เข้าถึงตัวระบุ (identifier) นั้นอย่างชัดเจน
  4. ปฏิเสธหรืออนุญาต – หากการตรวจสอบใดล้มเหลว การเรียกใช้นั้นจะถูกปฏิเสธ และเอเจนต์จะได้รับข้อผิดพลาดเพื่อแจ้งให้ผู้ใช้ทราบ

ความแตกต่างของโค้ดนั้นตรงไปตรงมา แนวทางที่ "ไม่ดี" อาจเป็นดังนี้:

if session.is_authenticated():
    tool.run(params)

แนวทางที่ "ดี" จะขยายการตรวจสอบออกไป:

token = get_scoped_token(user, required_scope)
if token.is_valid() and token.allows(required_scope, resource_id):
    tool.run(params)
else:
    raise PermissionError

รูปแบบที่สองเพิ่มโค้ดขึ้นเพียงไม่กี่บรรทัด แต่บังคับให้ระบบต้องถามคำถามที่ถูกต้องสำหรับการทำงานทุกครั้ง

มาตรฐานที่ช่วยให้ง่ายขึ้น

OAuth 2.0 scopes เป็นวิธีที่ได้รับการยอมรับอย่างแพร่หลายในการจำกัดสิ่งที่โทเค็นสามารถทำได้ การออก access tokens ที่มีอายุการใช้งานสั้นและเข้ารหัสขอบเขตสิทธิ์ เช่น project:1234:write หรือ email:send จะช่วยให้นักพัฒนาสามารถใช้ไลบรารีที่มีอยู่แล้วในการดำเนินการขั้นตอนการตรวจสอบได้

Rich Authorization Requests (RFC 9396) ที่ใหม่กว่าได้ต่อยอดแนวคิดนี้ โดยอนุญาตให้ไคลเอนต์ (client) สามารถขอสิทธิ์ที่ละเอียด (granular permissions) ได้ในขณะรันไทม์ (runtime) แทนที่จะต้องกำหนดรายการแบบคงที่ไว้ล่วงหน้า ความยืดหยุ่นนี้มีประโยชน์มากเมื่อเวิร์กโฟลว์ของ AI อาจจำเป็นต้องเพิ่มหรือลดความสามารถได้ทันทีตามความต้องการของผู้ใช้

ข้อโต้แย้ง: ความเรียบง่ายเทียบกับความปลอดภัย

บางทีมโต้แย้งว่าการตรวจสอบในแต่ละการกระทำ (per-action checks) เพิ่มความหน่วง (latency) และความซับซ้อนของโค้ด โดยเฉพาะอย่างยิ่งเมื่อผู้ช่วย AI ต้องเรียกใช้เครื่องมือหลายอย่างอย่างต่อเนื่องและรวดเร็ว พวกเขาชี้ให้เห็นว่าการใช้ session token เพียงอันเดียวช่วยหลีกเลี่ยงภาระ (overhead) ในการดึงและตรวจสอบความถูกต้องของโทเคนใหม่ในทุกๆ การเรียกใช้งาน อย่างไรก็ตาม สิ่งที่ต้องแลกมาคือความเสี่ยงต่อการใช้งานในทางที่ผิดที่เพิ่มสูงขึ้นอย่างมาก บริการตรวจสอบความถูกต้องของโทเคนในปัจจุบันถูกออกแบบมาให้ทำงานในระดับไมโครวินาที และการรับส่งข้อมูลผ่านเครือข่าย (network round-trip) ที่เพิ่มขึ้นมานั้นสามารถทำแบบรวมกลุ่ม (batching) หรือทำแคช (caching) ได้ โดยไม่สูญเสียหลักการสิทธิ์ขั้นต่ำที่จำเป็น (principle of least privilege) ในสภาพแวดล้อมที่ความถูกต้องของข้อมูล (data integrity) และการปฏิบัติตามกฎระเบียบ (compliance) เป็นเรื่องที่ต่อรองไม่ได้ ต้นทุนด้านประสิทธิภาพที่เพิ่มขึ้นเพียงเล็กน้อยนั้นถือว่าคุ้มค่าเมื่อเทียบกับการลดความเสี่ยงที่เกิดขึ้น

สิ่งที่ควรจับตามองต่อไป

  • การนำ scoped tokens มาใช้ใน AI SDKs – คอยติดตามการอัปเดตชุดเครื่องมือ (toolkits) ของแพลตฟอร์ม AI รายใหญ่ ซึ่งหลายแห่งเริ่มเปิดให้ใช้งานฟังก์ชันช่วยเหลือ (helper functions) สำหรับขอบเขตการเข้าถึง (scopes) ที่อิงตาม OAuth แล้ว
  • เฟรมเวิร์กแบบ Policy-as-code – โซลูชันที่กำลังเกิดขึ้นใหม่ช่วยให้ทีมสามารถประกาศกฎการอนุญาตสิทธิ์ (authorization rules) ในไฟล์แบบ declarative ซึ่งจะบังคับใช้กฎเหล่านั้นโดยอัตโนมัติในขณะรันไทม์ (runtime)
  • บันทึกการตรวจสอบ (Audit logs) ที่แสดงการตัดสินใจในแต่ละการกระทำ – เมื่อแพลตฟอร์มต่างๆ เริ่มบันทึกการตรวจสอบสิทธิ์ในแต่ละครั้งมากขึ้น องค์กรจะสามารถมองเห็นภาพรวมได้ว่าการกระทำใดของ AI ที่ได้รับอนุญาตหรือถูกบล็อก ซึ่งจะช่วยเป็นข้อมูลในการปรับปรุงนโยบายในอนาคต

บทสรุป

การปฏิบัติกับเซสชันที่ล็อกอินอยู่เสมือนว่าเป็นสิทธิ์ในการทำทุกอย่าง คือสูตรสำเร็จที่นำไปสู่ผลลัพธ์ที่ไม่พึงประสงค์ ด้วยการย้ายการตัดสินใจอนุญาตสิทธิ์จากช่วงเวลาที่ล็อกอิน ไปเป็นการตรวจสอบในทุกๆ การเรียกใช้เครื่องมือ—และด้วยการใช้ scoped tokens ที่มีอายุสั้น—แอปพลิเคชัน AI จะสามารถรักษาความสะดวกสบายของเอเจนต์อัตโนมัติ (autonomous agents) ไว้ได้ ในขณะที่ยังสามารถปกป้องข้อมูล ปฏิบัติตามกฎระเบียบ และหลีกเลี่ยงความผิดพลาดที่มีมูลค่าความเสียหายสูง โค้ดที่เพิ่มขึ้นมาไม่กี่บรรทัดถือเป็นราคาที่ถูกมากสำหรับระบบที่รู้จักตั้งคำถามที่ถูกต้องในทุกครั้งที่มีการพยายามดำเนินการใดๆ