tl; dr:ทั้งหมดนี้เป็นเพราะเหตุผลด้านความปลอดภัย
OAuth 2.0 ต้องการเป็นไปตามเกณฑ์ทั้งสองนี้:
- คุณต้องการอนุญาตให้นักพัฒนาซอฟต์แวร์ใช้การเปลี่ยนเส้นทาง URI ที่ไม่ใช่ HTTPS เนื่องจากนักพัฒนาซอฟต์แวร์บางรายไม่มีเซิร์ฟเวอร์ที่เปิดใช้งาน SSL และหากไม่ได้กำหนดค่าไว้อย่างถูกต้องเสมอ (ใบรับรอง SSL ที่เชื่อถือได้ที่ไม่ได้ลงชื่อด้วยตนเอง
- คุณไม่ต้องการให้แฮกเกอร์สามารถขโมยโทเค็นการเข้าถึง / รีเฟรชโดยการดักคำขอ
รายละเอียดด้านล่าง:
โฟลว์ทางอ้อมเป็นไปได้เฉพาะในสภาพแวดล้อมของเบราว์เซอร์เนื่องจากเหตุผลด้านความปลอดภัย:
ในโฟลว์การเข้าถึงโทเค็นจะถูกส่งผ่านโดยตรงเป็นส่วนแฮช (ไม่ใช่พารามิเตอร์ URL) สิ่งหนึ่งที่สำคัญเกี่ยวกับแฮชแฟรกเมนต์คือเมื่อคุณติดตามลิงก์ที่มีแฟรกเมนต์แฮชเพียงเบราว์เซอร์เท่านั้นที่จะทราบถึงส่วนแฮช เบราว์เซอร์จะส่งชิ้นส่วนแฮชโดยตรงไปยังหน้าเว็บปลายทาง (URI เปลี่ยนเส้นทาง / หน้าเว็บของลูกค้า) ส่วนแฮชมีคุณสมบัติดังต่อไปนี้:
- พวกเขาไม่ได้เป็นส่วนหนึ่งของคำขอ HTTP ดังนั้นจึงไม่สามารถอ่านได้โดยเซิร์ฟเวอร์และเนื่องจากพวกเขาไม่สามารถดักจับโดยเซิร์ฟเวอร์ตัวกลาง / เราเตอร์ (นี่เป็นสิ่งสำคัญ)
- มีอยู่ในเบราว์เซอร์เท่านั้น - ฝั่งไคลเอ็นต์ - ดังนั้นวิธีเดียวที่จะอ่านส่วนแฮชคือการใช้ JavaScript ที่ทำงานบนหน้าเว็บ
สิ่งนี้ทำให้เป็นไปได้ที่จะส่งโทเค็นการเข้าใช้งานโดยตรงไปยังไคลเอนต์โดยไม่ต้องเสี่ยงกับการถูกขัดขวางโดยเซิร์ฟเวอร์ตัวกลาง นี่เป็นเพียงข้อสังเกตว่าเป็นฝั่งไคลเอ็นต์ที่เป็นไปได้และต้องการจาวาสคริปต์ที่รันฝั่งไคลเอ็นต์เพื่อใช้โทเค็นการเข้าถึง
โฟลว์ implicit ยังมีปัญหาด้านความปลอดภัยที่ต้องใช้ตรรกะเพิ่มเติมเพื่อแก้ไขปัญหา / หลีกเลี่ยงตัวอย่างเช่น:
- ผู้โจมตีอาจได้รับโทเค็นการเข้าถึงจากผู้ใช้ในเว็บไซต์ / แอพอื่น (สมมติว่าเขาเป็นเจ้าของเว็บไซต์ / แอปอื่น) ล็อกโทเค็นบนเว็บไซต์ของพวกเขาแล้วส่งเป็น URL พารามิเตอร์ในเว็บไซต์ของคุณ ดังนั้นการแอบอ้างเป็นผู้ใช้ในเว็บไซต์ของคุณ เพื่อหลีกเลี่ยงปัญหานี้คุณต้องตรวจสอบ ID ลูกค้าที่เกี่ยวข้องกับโทเค็นการเข้าถึง (ตัวอย่างเช่นสำหรับ Google คุณสามารถใช้โทเค็นปลายทาง) เพื่อให้แน่ใจว่าโทเค็นนั้นได้รับการออกด้วย ID ลูกค้าของคุณเอง ถ้าคุณใช้ IDToken (แต่นั่นต้องใช้ความลับของลูกค้าของคุณ)
- หากคำขอรับรองความถูกต้องไม่ได้มาจากคุณสมบัติของคุณเอง (เรียกว่าการโจมตีการตรึงเซสชัน) เพื่อหลีกเลี่ยงปัญหานี้คุณจะต้องสร้างแฮชแบบสุ่มจากเว็บไซต์ของคุณบันทึกในคุกกี้และส่งแฮชเดียวกันใน URL URL ของ คำขอรับรองความถูกต้องเมื่อผู้ใช้กลับมาคุณตรวจสอบสถานะพารามิเตอร์กับคุกกี้และจะต้องตรงกับ
ในโฟลว์การให้สิทธิ์รหัสนั้นเป็นไปไม่ได้ที่จะส่งโทเค็นการเข้าถึงโดยตรงในพารามิเตอร์ URL เนื่องจากพารามิเตอร์ URL เป็นส่วนหนึ่งของคำขอ HTTP ดังนั้นเซิร์ฟเวอร์ตัวกลาง / เราเตอร์ใด ๆ ที่คำขอของคุณจะผ่าน (อาจเป็นหลายร้อย) อ่านโทเค็นการเข้าถึงหากคุณไม่ได้ใช้การเชื่อมต่อที่เข้ารหัส (HTTPS) เพื่อให้สิ่งที่เรียกว่าการโจมตีแบบ Man-in-the-middle
การส่งผ่านโทเค็นการเข้าถึงโดยตรงในพารามิเตอร์ URL อาจเป็นไปได้ในทางทฤษฎี แต่การรับรองความถูกต้องจะต้องตรวจสอบให้แน่ใจว่า URI การเปลี่ยนเส้นทางใช้ HTTPS พร้อมการเข้ารหัส TLS และใบรับรอง SSL ที่ 'เชื่อถือได้' (โดยทั่วไปจากผู้ออกใบรับรอง เพื่อให้แน่ใจว่าเซิร์ฟเวอร์ปลายทางนั้นถูกต้องตามกฎหมายและคำขอ HTTP นั้นถูกเข้ารหัสอย่างสมบูรณ์ การมีนักพัฒนาซอฟต์แวร์ทั้งหมดซื้อใบรับรอง SSL และกำหนดค่า SSL บนโดเมนของตนอย่างถูกต้องจะเป็นปัญหาใหญ่และจะชะลอการยอมรับอย่างมาก นี่คือเหตุผลที่คนกลางใช้ "รหัสการอนุญาต" แบบใช้ครั้งเดียวโดยมีเงื่อนไขว่ามีเพียงผู้รับที่ถูกกฎหมายเท่านั้นที่จะสามารถแลกเปลี่ยน (เพราะคุณต้องการความลับของลูกค้า) และรหัสนั้นจะไร้ประโยชน์กับแฮ็กเกอร์ที่อาจขัดขวางการทำธุรกรรม (เพราะพวกเขาไม่ '
นอกจากนี้คุณยังสามารถยืนยันได้ว่าการไหลโดยนัยมีความปลอดภัยน้อยกว่ามีเวกเตอร์การโจมตีที่อาจเกิดขึ้นเช่นการปลอมแปลงโดเมนเมื่อเปลี่ยนเส้นทางตัวอย่างเช่นการไฮแจ็กที่อยู่ IP ของเว็บไซต์ลูกค้า นี่คือหนึ่งในเหตุผลที่การไหลโดยนัยเพียงให้การเข้าถึงโทเค็น (ซึ่งควรจะมีการใช้เวลาที่ จำกัด ) และไม่เคยรีเฟรชโทเค็น (ซึ่งไม่ จำกัด เวลา) เพื่อแก้ไขปัญหานี้ฉันแนะนำให้คุณโฮสต์หน้าเว็บของคุณบนเซิร์ฟเวอร์ที่เปิดใช้งาน HTTPS ทุกครั้งที่ทำได้