โทเค็นการรีเฟรชทำหน้าที่อย่างน้อยสองวัตถุประสงค์ ประการแรกโทเค็นการรีเฟรชเป็น 'หลักฐาน' ชนิดหนึ่งที่ไคลเอ็นต์ OAuth2 มีอยู่แล้วได้รับอนุญาตจากผู้ใช้สามารถเข้าถึงข้อมูลของพวกเขาและเพื่อให้สามารถร้องขอการเข้าถึงใหม่ token อีกครั้งโดยไม่ต้องให้ผู้ใช้ที่จะไปไหลผ่าน OAuth2 ทั้งหมด และประการที่สองช่วยเพิ่มขั้นตอนการรักษาความปลอดภัยทั้งหมดเมื่อเทียบกับโทเค็นการเข้าถึงที่มีอายุการใช้งานยาวนาน ฉันจะพูดถึงทั้งสองจุดนี้โดยละเอียด
รีเฟรชโทเค็นเพื่อไม่ให้ผู้ใช้รำคาญ
มาพูดถึงจุดประสงค์แรกพร้อมตัวอย่าง สมมติว่าคุณผู้ใช้กำลังใช้เว็บแอปพลิเคชันไคลเอนต์บุคคลที่สามที่ต้องการโต้ตอบกับข้อมูลบัญชี YouTube ของคุณ เมื่อคุณอนุญาตให้แอปพลิเคชันไคลเอ็นต์ใช้ข้อมูล YouTube ของคุณแล้วคุณต้องการให้แอปไคลเอ็นต์แจ้งให้คุณอนุญาตอีกครั้งหรือไม่เมื่อโทเค็น YouTube หมดอายุ? จะเกิดอะไรขึ้นหากเวลาหมดอายุของโทเค็น YouTube เหลือน้อยมากเช่น 5 นาที มันจะน่ารำคาญเล็กน้อยเมื่อแอปพลิเคชันไคลเอนต์แจ้งให้คุณอนุญาตอย่างน้อยทุกๆ 5 นาที! วิธีแก้ปัญหาที่ OAuth2 เสนอสำหรับ 'ปัญหานี้' คือการรีเฟรชโทเค็น ด้วยการใช้โทเค็นการรีเฟรชโทเค็นการเข้าถึงอาจมีอายุการใช้งานสั้น (ซึ่งเป็นที่พึงปรารถนาในกรณีที่โทเค็นการเข้าถึงรั่วไหลหรือถูกขโมยอย่างใดอย่างหนึ่ง) และโทเค็นการรีเฟรชสามารถคงอยู่ได้นาน (er) ทำให้ไคลเอนต์สามารถเข้าถึงใหม่ได้ โทเค็นเมื่อหมดอายุโดยไม่ต้องได้รับอนุญาตจากผู้ใช้ (อีกครั้ง)
แต่ทำไมต้องเป็นโทเค็นการรีเฟรช? หากประเด็นคือการไม่ดักฟังผู้ใช้ด้วยคำขออนุญาตเหตุใดลูกค้าจึงไม่สามารถพูดว่า "เฮ้เซิร์ฟเวอร์การอนุญาตฉันต้องการโทเค็นการเข้าถึงอื่นตอนนี้!"? หรือ "เฮ้เซิร์ฟเวอร์การอนุญาตนี่คือโทเค็นที่หมดอายุแล้วขอใหม่!" โทเค็นการรีเฟรชทำหน้าที่เป็น "หลักฐาน" ชนิดหนึ่งว่าลูกค้าในช่วงเวลาเดิมบางช่วงได้รับอนุญาตให้เข้าถึงโดยผู้ใช้ "หลักฐาน" นี้อยู่ในรูปแบบของโทเค็นการรีเฟรชที่เซ็นชื่อแบบดิจิทัลโดยเซิร์ฟเวอร์การอนุญาต โดยไคลเอนต์นำเสนอโทเค็นการรีเฟรชเซิร์ฟเวอร์การอนุญาตสามารถตรวจสอบว่าไคลเอนต์ได้รับอนุญาตจากผู้ใช้ในอดีตและไคลเอนต์ไม่ต้องแจ้งผู้ใช้อีกครั้ง
รีเฟรชโทเค็นเพื่อเพิ่มความปลอดภัย
อย่างไรก็ตามสิ่งนี้ทำให้เกิดคำถามว่า "จะเกิดอะไรขึ้นหากโทเค็นการรีเฟรชรั่วไหลหรือถูกขโมยหรือเพียงแค่เก็บไว้โดยแอปพลิเคชันไคลเอนต์ที่เป็นอันตรายซึ่งไม่ได้กำจัดตามคำขอของผู้ใช้ผู้โจมตีจะดำเนินการต่อไป ใช้โทเค็นการรีเฟรชเพื่อรับโทเค็นการเข้าถึงที่ถูกต้องโดยไม่มีกำหนด (หรือจนกว่าจะหมดอายุ) คำถามนี้นำไปสู่การพูดคุยถึงจุดประสงค์ที่สองที่ฉันกล่าวถึงของโทเค็นการรีเฟรชที่มีส่วนช่วยในการไหลที่ปลอดภัยยิ่งขึ้น
ปัญหาที่เกิดขึ้นกับโทเค็นการเข้าถึงคือเมื่อได้มาแล้วจะมีการนำเสนอต่อเซิร์ฟเวอร์ทรัพยากรเท่านั้น (เช่น YouTube) ดังนั้นหากโทเค็นการเข้าถึงถูกขโมยหรือถูกบุกรุกคุณจะบอกเซิร์ฟเวอร์ทรัพยากรอย่างไรไม่ให้เชื่อถือโทเค็นนั้น ดีคุณไม่สามารถจริงๆ วิธีเดียวที่จะทำได้คือเปลี่ยนคีย์การลงนามส่วนตัวบนเซิร์ฟเวอร์การอนุญาต (คีย์ที่เซ็นโทเค็นตั้งแต่แรก) ฉันคิดว่าสิ่งนี้ไม่สะดวกที่จะทำและในบางกรณี (เช่น Auth0) ก็ไม่ได้รับการสนับสนุน
ในทางกลับกันต้องมีการนำเสนอโทเค็นการรีเฟรชไปยังเซิร์ฟเวอร์การอนุญาตบ่อยครั้งดังนั้นหากมีการบุกรุกการเพิกถอนหรือปฏิเสธโทเค็นการรีเฟรชโดยรวมจึงเป็นเรื่องเล็กน้อยและไม่ต้องเปลี่ยนคีย์การลงนามใด ๆ