รักษาความปลอดภัยแอปพลิเคชันบนคลาวด์ด้วย OAuth 2.0 และ OpenID Connect
คู่มือฉบับสมบูรณ์สำหรับการรักษาความปลอดภัยแอปพลิเคชันบนคลาวด์ของคุณด้วย OAuth 2.0 และ OpenID Connect และวิธีการให้ประสบการณ์ผู้ใช้งานที่ยอดเยี่ยมด้วยการรับรองและการอนุญาต
บทนำ
แอปพลิเคชันที่ใช้งานบนคลาวด์เป็นแนวโน้มของยุคนี้ ในขณะที่ประเภทของแอปพลิเคชันมีความหลากหลาย (เว็บ, มือถือ, เดสก์ท็อป, ฯลฯ) ทั้งหมดมีคลาวด์แบ็กเอนด์ที่ให้บริการ เช่น การจัดเก็บข้อมูล, การประมวลผล, และฐานข้อมูล ส่วนใหญ่แล้ว แอปพลิเคชันเหล่านี้จำเป็นต้องรับรองตัวตนของผู้ใช้และอนุญาตให้เข้าถึงแหล่งข้อมูลบางอย่าง
แม้ว่าจะสามารถพัฒนากลไกรับรองและการอนุญาตได้เอง ความปลอดภัยเป็นหนึ่งในข้อกังวลหลักเมื่อพัฒนาแอปพลิเคชันบนคลาวด์ โชคดีที่อุตสาหกรรมของเรามีมาตรฐานที่ผ่านการทดลองมาหลายรอบแล้วเช่น OAuth 2.0 และ OpenID Connect ที่ช่วยให้เราดำเนินการรับรองและการอนุญาตที่ปลอดภัยได้
โพสต์นี้ถือว่าคุณมีพื้นฐานดังนี้:
- คุณมีความเข้าใจพื ้นฐานเกี่ยวกับการพัฒนาแอปพลิเคชัน (เว็บ, มือถือ, หรือประเภทใดๆ)
- คุณเคยได้ยินเกี่ยวกับแนวคิดของการรับรองและการอนุญาต
- คุณเคยได้ยินเกี่ยวกับ OAuth 2.0 และ OpenID Connect
ใช่, "เคยได้ยิน" ก็เพียงพอสำหรับข้อ 2 และ 3 โพสต์นี้จะใช้ตัวอย่างในโลกจริงเพื่ออธิบายแนวคิดและแสดงกระบวนการด้วยแผนภาพ มาเริ่มกันเลย!
OAuth 2.0 เทียบกับ OpenID Connect
หากคุณคุ้นเคยกับ OAuth 2.0 และ OpenID Connect คุณก็สามารถอ่านต่อได้เพราะเราจะครอบคลุมตัวอย่างในโลกจริงในส่วนนี้ด้วย; ถ้าคุณเป็นคนใหม่ในมาตรฐานเหล่านี้ ก็ปลอดภัยที่จะอ่านต่อเพราะเราจะแนะนำพวกเขาในวิธีที่ง่าย
OAuth 2.0
OAuth 2.0 เป็นกรอบการทำงานของการอนุญาตที่ช่วยให้แอปพลิเคชันได้รั บการเข้าถึงทรัพยากรที่ได้รับการป้องกันในแอปพลิเคชันอื่นในนามของผู้ใช้หรือแอปพลิเคชันเอง บริการยอดนิยมส่วนใหญ่เช่น Google, Facebook, และ GitHub ใช้ OAuth 2.0 สำหรับการลงชื่อเข้าสู่ระบบสังคม (เช่น "Sign in with Google")
ตัวอย่างเช่น คุณมีแอปพลิเคชันเว็บ MyApp ที่ต้องการเข้าถึง Google Drive ของผู้ใช้ แทนที่จะขอให้ผู้ใช้แชร์ข้อมูลประจำตัวของ Google Drive MyApp สามารถใช้ OAuth 2.0 เพื่อขอเข้าถึง Google Drive ในนามของผู้ใช้ ต่อไปนี้เป็นกระแสง่าย ๆ:
ในกระบวนการนี้ MyApp ไม่เคยเห็นข้อมูลประจำตัว Google Drive ของผู้ใช้ ในทางกลับกัน มันจะได้รับ โทเค็นการเข้าถึง จาก Google ที่ช่วยให้มันสามารถเข้าถึง Google Drive ในนามของผู้ใช้ได้
ในแง่ของ OAuth 2.0, MyApp คือลูกค้า client, Google เป็นทั้ง เซิร์ฟเวอร์การอนุญาต และ เซิร์ฟเวอร์ทรัพยากร เพื่อความง่าย ในโลกจริง ส่วนใหญ่เรามีเซิร์ฟเวอร์การอนุญาตและเซิร์ฟเวอร์ทรัพยากรแยกกันเพื่อนำเสนอประสบการณ์การลงชื่อเข้าใช้ครั้งเดียว (SSO) ตัวอย่างเช่น Google เป็นเซิร์ฟเวอร์การอนุญาตและอาจมีเซิร์ฟเวอร์ทรัพยากรหลายตัวเช่น Google Drive, Gmail, และ YouTube
โปรดทราบว่ากระบวนการอนุญาตจริงนั้นซับซ้อนกว่านี้ OAuth 2.0 มีประเภทการอนุญาตที่แตกต่างกัน ขอบเขต และแนวคิดอื่น ๆ ที่คุณควรทราบ เป็นการดีที่เรามาข้ามเรื่องนั้นชั่วคราวแล้วไปสู่ OpenID Connect
OpenID Connect (OIDC)
OAuth 2.0 ยอดเยี่ยมในการอนุญาต แต่คุณอาจสังเกตว่ามันไม่มีวิธีระบุผู้ใช้ (เช่น การระบุตัวตน) OpenID Connect เป็นชั้นบ่งชี้ที่ทำงานบน OAuth 2.0 ที่เพิ่มความสามารถในการระบุตัวตน
ในตัวอย่างข้างต้น MyApp จำเป็นต้องรู้ว่าผู้ใช้คือใครก่อนเริ่มกระบวนการอนุญาต โปรดทราบว่านี่มีผู้ใช้สองคนที่เกี่ยวข้อง: ผู้ใช้ของ MyApp และผู้ใช้ของ Google Drive ในกรณีนี้ MyApp จำเป็นต้องรู้ผู้ใช้ของแอปพลิเคชันของตนเอง
ลองดูตัวอย่างที่ตรงไปตรงมา สมมติว่าผู้ใช้สามารถลงชื่อเข้าใช้ MyApp โดยใช้ชื่อผู้ใช้และรหัสผ่าน:
เนื่องจากเรากำลังรับรองผู้ใช้แอปพลิเคชันของเรา มักจะไม่มีความจำเป็นต้องขออนุญาตเช่นเดียวกับที่ Google ทำในกระบวนการ OAuth 2.0 ในขณะเดียวกัน เราต้องการสิ่งที่สามารถระบุผู้ใช้ได้ OpenID Connect แนะนำแนวคิด เช่น โทเค็น ID และ จุดสิ้นสุดผู้ใช้ เพื่อช่วยเราในนั้น
คุณอาจสังเกตว่า ผู้ให้บริการเอกลักษณ์ (IdP) เป็นผู้เข้าร่วมใหม่ในกระบวนการนี้ มันเหมือนกับเซิร์ฟเวอร์การอนุญาตใน OAuth 2.0 แต่เพื่อความชัดเจน เราใช้คำว่า IdP เพื่อแสดงว่ามันรับผิดชอบในการรับรองความถูกต้องของผู้ใช้และการจัดการเอกลักษณ์
เมื่อธุรกิจของคุณเติบโต คุณอาจมีแอปพลิเคชันหลายตัวที่ใช้ฐานข้อมูลผู้ใช้เดียวกัน เช่นเดียวกับ OAuth 2.0, OpenID Connect ช่วยให้คุณมีเซิร์ฟเวอร์การอนุญาตเดียวที่สามารถรับรองความถูกต้องของผู้ใช้ได้หลายแอปพ ลิเคชัน หากผู้ใช้ได้ลงชื่อเข้าใช้แอปพลิเคชันหนึ่งแล้ว พวกเขาไม่จำเป็นต้องป้อนข้อมูลรับรองอีกครั้งเมื่อแอปพลิเคชันอื่นเปลี่ยนเส้นทางพวกเขาไปยัง IdP กระบวนการสามารถทำได้อัตโนมัติโดยไม่ต้องบินทบการโต้ตอบกับผู้ใช้ นั่นเรียกว่าการลงชื่อเข้าใช้ครั้งเดียว (SSO)
อีกครั้ง นี่เป็นกระบวนการที่ง่ายที่สุดที่สามารถทำได้และมีรายละเอียดมากกว่านี้ใต้เครื่อง ให้เราข้ามไปสู่ส่วนถัดไปก่อนที่จะเกิดภาระข้อมูลเกินกำลัง
ประเภทของแอปพลิเคชัน
ในส่วนก่อนหน้า เราใช้แอปพลิเคชันเว็บเป็นตัวอย่างในขณะที่โลกนี้มีความหลากหลายกว่านั้น สำหรับผู้ให้บริการเอกลักษณ์แล้ว ภาษาโปรแกรม, เฟรมเวิร์ก, หรือแพลตฟอร์มที่คุณใช้นั้นไม่สำคัญจริง ๆ ในทางปฏิบัติ หนึ่งความแตกต่ างที่สำคัญคือว่าแอปพลิเคชันนั้นเป็น ลูกค้าสาธารณะ หรือ ลูกค้าเอกชน (ที่ได้รับความเชื่อถือ):
- ลูกค้าสาธารณะ: ลูกค้าที่ไม่สามารถเก็บข้อมูลความลับของตนเองไว้แอบได้ ซึ่งหมายความว่าเจ้าของทรัพยากร (ผู้ใช้) สามารถเข้าถึงข้อมูลเหล่านั้นได้ เช่น แอปพลิเคชันเว็บที่ทำงานในเบราว์เซอร์ (เช่น แอปพลิเคชันหน้าเดียว)
- ลูกค้าเอกชน: ลูกค้าที่มีความสามารถในการเก็บข้อมูลความลับของตนเองโดยไม่เปิดเผยแก่ (เจ้าของทรัพยากร) ผู้ใช้ เช่น แอปพลิเคชันเว็บที่ทำงานบนเซิร์ฟเวอร์ (เช่น แอปพลิเคชันเว็บฝั่งเซิร์ฟเวอร์) หรือบริการ API
โดยมุมมองนี้ ให้เราดูว่า OAuth 2.0 และ OpenID Connect สามารถใช้ในประเภทของแอปพลิเคชันที่แตกต่างกันได้อย่างไร
"แอปพลิเคชัน" และ "ลูกค้า" สามารถใช้แทนกันได้ในบ ริบทของโพสต์นี้
แอปพลิเคชันเว็บที่ทำงานบนเซิร์ฟเวอร์
แอปพลิเคชันทำงานบนเซิร์ฟเวอร์และให้บริการหน้า HTML แก่ผู้ใช้ เฟรมเวิร์กเว็บยอดนิยมหลายตัว เช่น Express.js, Django, และ Ruby on Rails เข้าข่ายนี้; และเฟรมเวิร์กที่เป็นส่วนหลังสำหรับส่วนหน้า (BFF) เช่น Next.js และ Nuxt.js ก็รวมอยู่ในนี้เช่นกัน แอปพลิเคชันเหล่านี้มีลักษณะดังนี้:
- เนื่องจากเซิร์ฟเวอร์อนุญาตให้เข้าถึงภายในอย่างเดียว (ไม่มีทางที่ผู้ใช้สาธารณะจะเห็นโค้ดหรือข้อมูลเฉพาะตัวของเซิร์ฟเวอร์) มันจึงถือเป็นลูกค้าเอกชน
- กระบวนการรับรองผู้ใช้ทั่วไปเหมือนกับที่เราพูดถึงในส่วน "OpenID Connect"
- แอปพลิเคชันสามารถใช้โทเค็น ID ที่ออกโดยผู้ให้บริการเอกลักษณ์ (เช่น ผู้ให้บริการ OpenID Connect) เพื่อตรวจสอบผู้ใช้และแสดงเนื้อหาเฉพาะผู้ใช้
- เพื่อความปลอดภัยของแอปพลิเคชัน แอปพลิเคชันมักจะใช้ การดำเนินการแบบมีโค้ดการอนุญาต สำหรับการรับรองผู้ใช้และการรับโทเค็น
ในขณะเดียวกัน แอปพลิเคชันอาจต้องเข้าถึงบริการ API ภายในอื่น ๆ ในสถาปัตยกรรมไมโครเซดะม หรือนั่นคือแอปพลิเคชันโมโนลิทที่ต้องการการควบคุมการเข้าถึงสำหรับส่วนต่าง ๆ ของแอปพลิเคชัน เราจะพูดถึงนี้ในส่วน "ป้องกัน API ของคุณ"
แอปพลิเคชันหน้าเดียว (SPAs)
แอปพลิเคชันทำงานในเบราว์เซอร์ของผู้ใช้และสื่อสารกับเซิร์ฟเวอร์ผ่าน API React, Angular, และ Vue.js เป็นเฟรมเวิร์กยอดนิยมในการสร้าง SPAs แอปพลิเคชันเหล่านี้มีลักษณะดังนี้:
- เนื่องจากโค้ดของแอปพลิเคชันนี้สามารถมองเห็นได้โดยสาธารณะ มันถือเป็นลูกค้าสาธารณะ
- กระบวนการรับรองผู้ใช้ทั่วไปเหมือนกับที่เราพูดถึงในส่วน "OpenID Connect"
- แอปพลิเคชันสามารถใช้โทเค็น ID ที่ออกโดยผู้ให้บริการเอกลักษณ์ (เช่น ผู้ให้บริการ OpenID Connect) เพื่อตรวจสอบผู้ใช้และแสดงเนื้อหาเฉพาะผู้ใช้
- เพื่อความปลอดภัยของแอปพลิเคชัน แอปพลิเคชันมักจะใช้ การดำเนินการแบบมีโค้ดการอนุญาตพร้อม PKCE (Proof Key for Code Exchange) สำหรับการรับรองผู้ใช้และการรับโทเค็น
โดยปกติ SPAs จำเป็นต้องเข้าถึงบริการ API อื่น ๆ สำหรับการดึงและการอัพเดทข้อมูล เราจะพูดถึงนี้ในส่วน "ป้องกัน API ของคุณ"
แอปพลิเคชันมือถือ
แอปพลิเคชันทำงานบนอุปกรณ์มือถือ (iOS, Android, ฯลฯ) และสื่อสารกับเซิร์ฟเวอร์ผ่าน API ในหลายกรณี แอปพลิเคชันเหล่านี้มีลักษณะเหมือนกับ SPAs