เจาะลึกการยืนยันผู้ใช้

เอกสารนี้อธิบายความหมายของ userVerification ใน WebAuthn และลักษณะการทำงานของเบราว์เซอร์ที่ส่งผลให้เมื่อมีการระบุ userVerification ระหว่างการสร้างหรือการตรวจสอบสิทธิ์พาสคีย์

"การยืนยันผู้ใช้" ใน WebAuthn คืออะไร

พาสคีย์สร้างขึ้นบนวิทยาการเข้ารหัสคีย์สาธารณะ เมื่อสร้างพาสคีย์ ระบบจะสร้างคู่คีย์สาธารณะ-ส่วนตัวขึ้น ผู้ให้บริการพาสคีย์จะจัดเก็บคีย์ส่วนตัว และคีย์สาธารณะจะส่งกลับไปยังเซิร์ฟเวอร์ (RP) ของฝ่ายที่เกี่ยวข้องเพื่อจัดเก็บ เซิร์ฟเวอร์จะตรวจสอบสิทธิ์ผู้ใช้ได้โดยยืนยันลายเซ็นที่รับรองด้วยพาสคีย์เดียวกันโดยใช้คีย์สาธารณะที่จับคู่ไว้ แฟล็ก "ผู้ใช้อยู่" (UP) ในข้อมูลเข้าสู่ระบบคีย์สาธารณะจะพิสูจน์ว่ามีคนโต้ตอบกับอุปกรณ์ในระหว่างการตรวจสอบสิทธิ์

การยืนยันผู้ใช้เป็นระบบการรักษาความปลอดภัยที่เลือกได้ซึ่งจะช่วยยืนยันว่าบุคคลที่ถูกต้องปรากฏอยู่ในการตรวจสอบสิทธิ์ ไม่ใช่บุคคลบางคน ตามที่สถานะผู้ใช้ยืนยัน บนสมาร์ทโฟน มักจะทำได้โดยใช้กลไกการล็อกหน้าจอ ไม่ว่าจะเป็นข้อมูลไบโอเมตริกหรือ PIN หรือรหัสผ่าน มีการรายงานการยืนยันผู้ใช้หรือไม่ในแฟล็ก "UV" ที่ส่งกลับมาในข้อมูล Authenticator ระหว่างการลงทะเบียนและการตรวจสอบสิทธิ์พาสคีย์

ภาพหน้าจอของกล่องโต้ตอบการยืนยันผู้ใช้ในพวงกุญแจ iCloud ใน macOS กล่องโต้ตอบแจ้งให้ผู้ใช้ลงชื่อเข้าใช้ด้วย Touch ID ซึ่งจะแสดงต้นทางที่ขอการตรวจสอบสิทธิ์ รวมถึงชื่อผู้ใช้ ที่ด้านขวาบนของกล่องโต้ตอบจะมีปุ่มที่มีป้ายกำกับว่า "ยกเลิก"
กล่องโต้ตอบการยืนยันผู้ใช้ในพวงกุญแจ iCloud ใน macOS
ภาพหน้าจอของกล่องโต้ตอบการยืนยันผู้ใช้ใน Chrome สำหรับ Android กล่องโต้ตอบจะแจ้งให้ผู้ใช้ยืนยันตัวตนโดยใช้การจดจำใบหน้าหรือการตรวจจับลายนิ้วมือ และแสดงต้นทางที่ขอการตรวจสอบสิทธิ์ ที่ด้านซ้ายล่างคือตัวเลือกให้ยืนยันโดยใช้ PIN
กล่องโต้ตอบการยืนยันผู้ใช้ใน Android Chrome

วิธีตรวจสอบ UP และ UV บนเซิร์ฟเวอร์

ระบบจะส่งสัญญาณสถานะผู้ใช้ (UP) และธงบูลีนที่ยืนยันโดยผู้ใช้ (UV) ไปยังเซิร์ฟเวอร์ในช่องข้อมูล Authenticator ในระหว่างการตรวจสอบสิทธิ์ คุณสามารถตรวจสอบเนื้อหาในช่องข้อมูล Authenticator ได้ด้วยการยืนยันลายเซ็นโดยใช้คีย์สาธารณะที่จัดเก็บไว้ ตราบใดที่ลายเซ็นถูกต้อง เซิร์ฟเวอร์จะพิจารณาว่าการแจ้งว่าไม่เหมาะสมนั้นเป็นของแท้หรือไม่

ภาพโครงสร้างข้อมูลการตรวจสอบสิทธิ์ จากซ้ายไปขวา แต่ละส่วนของโครงสร้างข้อมูลคือ "RP ID HASH" (32 ไบต์), "FLAGS" (1 ไบต์), "COUNTER" (4 ไบต์, Big-endian uint32), "ATTESTE CRED DATA" (ความยาวแปรผันหากมี) และ "EXTENSIONS" (ความยาวแปรผันหากมี (CBOR)) ระบบจะขยายส่วน "FLAGS" เพื่อแสดงรายการการแฟล็กที่เป็นไปได้ ซึ่งมีป้ายกำกับจากซ้ายไปขวา ได้แก่ "ED", "AT", "0", "BS", "BE", "UV", "0" และ "UP"
ช่องข้อมูล Authenticator ในข้อมูลเข้าสู่ระบบคีย์สาธารณะ

ในการลงทะเบียนและการตรวจสอบสิทธิ์พาสคีย์ เซิร์ฟเวอร์ควรตรวจสอบว่าแฟล็ก UP เป็น true และ UV Flag เป็น true หรือ false ขึ้นอยู่กับข้อกำหนด

การระบุพารามิเตอร์ userVerification

ตามข้อกําหนดของ WebAuthn RP จะขอการยืนยันผู้ใช้ด้วยพารามิเตอร์ userVerification ได้ทั้งในการสร้างข้อมูลเข้าสู่ระบบและการยืนยัน และยอมรับ 'preferred', 'required' หรือ 'discouraged' ตามลําดับซึ่งมีความหมายดังนี้

  • 'preferred' (ค่าเริ่มต้น): การใช้วิธีการยืนยันผู้ใช้ในอุปกรณ์เป็นการใช้ แต่สามารถข้ามได้หากใช้ไม่ได้ ข้อมูลเข้าสู่ระบบที่เป็นการตอบกลับจะมีค่าแฟล็ก UV ที่ true หากได้ดำเนินการยืนยันผู้ใช้ และ false ในกรณีที่ไม่มี UV
  • 'required': คุณต้องเรียกใช้วิธีการยืนยันผู้ใช้ที่ใช้ได้ในอุปกรณ์ หากไม่มี คำขอจะดำเนินการไม่สำเร็จภายในเครื่อง ซึ่งหมายความว่าข้อมูลเข้าสู่ระบบการตอบสนองจะแสดงพร้อมตั้งค่า UV Flag เป็น true เสมอ
  • 'discouraged': เราไม่แนะนำให้ใช้วิธีการยืนยันผู้ใช้ อย่างไรก็ตาม อาจมีการดำเนินการยืนยันผู้ใช้ ทั้งนี้ขึ้นอยู่กับอุปกรณ์ และแฟล็ก UV อาจมี true หรือ false

โค้ดตัวอย่างสำหรับการสร้างพาสคีย์

const publicKeyCredentialCreationOptions = {
  // ...
  authenticatorSelection: {
    authenticatorAttachment: 'platform',
    residentKey: 'required',
    requireResidentKey: true,
    userVerification: 'preferred'
  }
};

const credential = await navigator.credentials.create({
  publicKey: publicKeyCredentialCreationOptions
});

ตัวอย่างโค้ดสำหรับการตรวจสอบสิทธิ์ด้วยพาสคีย์

const publicKeyCredentialRequestOptions = {
  challenge: /* Omitted challenge data... */,
  rpId: 'example.com',
  userVerification: 'preferred'
};

const credential = await navigator.credentials.get({
  publicKey: publicKeyCredentialRequestOptions
});

คุณควรเลือกตัวเลือกใดสำหรับ userVerification

ค่า userVerification ที่คุณควรใช้ขึ้นอยู่กับข้อกำหนดของแอปพลิเคชัน รวมถึงความต้องการประสบการณ์ของผู้ใช้ด้วย

กรณีที่ควรใช้ userVerification='preferred'

ใช้ userVerification='preferred' หากคุณให้ความสำคัญกับประสบการณ์ของผู้ใช้มากกว่าการป้องกัน

การยืนยันผู้ใช้อาจราบรื่นกว่าการปกป้องในหลายกรณี ตัวอย่างเช่น ใน macOS ที่ Touch ID ไม่พร้อมใช้งาน (เนื่องจากอุปกรณ์ไม่รองรับ ปิดใช้อยู่ หรืออุปกรณ์อยู่ในโหมดฝาพับ) ระบบจะขอให้ผู้ใช้ป้อนรหัสผ่านระบบแทน ซึ่งจะทำให้เกิดการใช้งานที่ติดขัด และผู้ใช้อาจออกจากการตรวจสอบสิทธิ์โดยสิ้นเชิง หากการขจัดอุปสรรคสำคัญกว่าสำหรับคุณ ให้ใช้ userVerification='preferred'

ภาพหน้าจอของกล่องโต้ตอบพาสคีย์ใน macOS ที่ปรากฏขึ้นเมื่อ Touch ID ไม่พร้อมใช้งาน กล่องโต้ตอบจะมีข้อมูล เช่น ต้นทางที่ขอการตรวจสอบสิทธิ์ รวมถึงชื่อผู้ใช้ ที่ด้านขวาบนของกล่องโต้ตอบจะมีปุ่มที่มีป้ายกำกับว่า "ยกเลิก"
กล่องโต้ตอบพาสคีย์แสดงขึ้นใน macOS เมื่อ Touch ID ไม่พร้อมใช้งาน

เมื่อใช้ userVerification='preferred' แฟล็ก UV จะเป็น true หากยืนยันผู้ใช้สำเร็จ และ false ในกรณีที่ข้ามการยืนยันผู้ใช้ ตัวอย่างเช่น ใน macOS ที่ Touch ID ไม่พร้อมใช้งาน ระบบจะขอให้ผู้ใช้คลิกปุ่มเพื่อข้ามการยืนยันผู้ใช้ และข้อมูลเข้าสู่ระบบของคีย์สาธารณะจะมี UV Flag false

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

กรณีที่ควรใช้ userVerification='required'

ใช้ userVerification='required' หากคิดว่าทั้ง UP และ UV จำเป็นจริงๆ

ข้อเสียของตัวเลือกนี้คือผู้ใช้อาจพบอุปสรรคมากขึ้นเมื่อลงชื่อเข้าใช้ ตัวอย่างเช่น ใน macOS ที่ Touch ID ไม่พร้อมใช้งาน ระบบจะขอให้ผู้ใช้ป้อนรหัสผ่านระบบ

userVerification='required' จะช่วยให้มั่นใจว่ามีการยืนยันผู้ใช้ในอุปกรณ์แล้ว ตรวจสอบว่าเซิร์ฟเวอร์ยืนยันว่าค่าสถานะ UV เป็น true

บทสรุป

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