ทำไมโทเค็นการเข้าถึงหมดอายุ?


209

ฉันเพิ่งเริ่มทำงานกับ Google API และ OAuth2 เมื่อลูกค้าอนุญาตแอพของฉันฉันจะได้รับ "โทเค็นการรีเฟรช" และโทเค็นการเข้าถึง "สั้น" ตอนนี้ทุกครั้งที่โทเค็นการเข้าถึงหมดอายุฉันสามารถโพสต์โทเค็นการรีเฟรชของฉันกับ Google และพวกเขาจะให้โทเค็นการเข้าถึงใหม่

คำถามของฉันคือจุดประสงค์ของโทเค็นการเข้าถึงที่หมดอายุหรือไม่ เหตุใดจึงไม่มีโทเค็นการเข้าถึงที่ยาวนานแทนโทเค็นการรีเฟรช

โทเค็นการรีเฟรชจะหมดอายุหรือไม่

ดูการใช้ OAuth 2.0 เพื่อเข้าถึง Google APIสำหรับข้อมูลเพิ่มเติมเกี่ยวกับขั้นตอนการทำงานของ Google OAuth2

คำตอบ:


226

นี่เป็นการใช้งานที่เฉพาะเจาะจงมาก แต่แนวคิดทั่วไปคืออนุญาตให้ผู้ให้บริการออกโทเค็นการเข้าถึงระยะสั้นด้วยโทเค็นการรีเฟรชระยะยาว ทำไม?

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

4
สองคำถาม: 1) ในกรณีของแอพมือถือข้อกำหนดสำหรับการรับรองความถูกต้องของไคลเอนต์ทำให้แข็งแกร่งขึ้นหรือไม่? เนื่องจาก client_secret เป็นส่วนหนึ่งของซอร์สโค้ดของแอปพลิเคชันดังนั้นจึงไม่เป็นความลับเลย สมมติว่าโทเค็นการเข้าถึงแชร์ผ่าน TLS เท่านั้น (และไม่มีการใช้สัญลักษณ์แสดงหัวข้อแรกของคุณ) มีการรักษาความปลอดภัยเพิ่มเติมหรือไม่ 2) สมมติว่าสิ่งนี้ถืออยู่ในสถานการณ์ของเรา (เฉพาะ TLS ไม่มีโทเค็นที่ไม่สามารถเข้ารหัสเองได้) มันไม่เป็นปัญหาหรือไม่ที่จะออกโทเค็นการเข้าถึงที่ไม่หมดอายุ
Thilo

4
โทเค็นผู้ถือคืออะไรและเกี่ยวข้องกับการรีเฟรชและโทเค็นการเข้าถึงอย่างไร
allyourcode

7
@Thilo ฉันคิดว่าความคิดคือโทเค็นการเข้าถึงไม่จำเป็นต้องเพิกถอน เมื่อ Eran ชี้ให้เห็นสิ่งนี้ทำให้บริการที่ร้องขอสามารถตัดสินใจว่าจะให้บริการคำขอ <em> โดยไม่ต้องค้นหาโทเค็นการเข้าถึงในฐานข้อมูลบางตัว </em> AFAICT นั่นคือประโยชน์ที่แท้จริงของการแยกโทเค็นการรีเฟรชและการเข้าถึงโทเค็น
allyourcode

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

3
@Suamere ที่อธิบายไว้แล้ว โทเค็นผู้ถือได้รับการตรวจสอบความถูกต้องโดยกระบวนการ crypto ที่ไม่ได้สัมผัสฐานข้อมูลการตรวจสอบสิทธิ์ทำให้พวกเขามีประสิทธิภาพมากขึ้นสำหรับการเข้าถึงทรัพยากรบ่อยครั้ง โทเค็นการรีเฟรชได้รับการตรวจสอบความถูกต้องในกระบวนการที่เกี่ยวข้องกับการตรวจสอบฐานข้อมูลเพื่อให้แน่ใจว่ายังคงใช้ได้ ตอนนี้คิดว่า gmail ทำงานอย่างไร หากมีคนลงชื่อเข้าใช้บัญชีของคุณจากที่ตั้งทางภูมิศาสตร์ที่ไม่คาดคิดคุณสามารถได้รับการแจ้งเตือน คุณสามารถดูตำแหน่งทั้งหมดที่อาจมีโทเค็นการรีเฟรชที่ถูกต้องในปัจจุบัน คุณสามารถออกจากระบบที่ตั้งทั้งหมดทำให้โทเค็นการรีเฟรชอื่น ๆ ทั้งหมดใช้ไม่ได้
Bon

33

บางสถานการณ์อาจช่วยแสดงให้เห็นถึงจุดประสงค์ของการเข้าถึงและรีเฟรชโทเค็นและการแลกเปลี่ยนเชิงวิศวกรรมในการออกแบบระบบ oauth2 (หรือระบบตรวจสอบอื่น ๆ ):

สถานการณ์สมมติของเว็บแอป

ในสถานการณ์ของเว็บแอปคุณมีตัวเลือกสองทาง:

  1. หากคุณมีการจัดการเซสชันของคุณเองให้เก็บทั้ง access_token และ refresh_token เทียบกับรหัสเซสชันของคุณในสถานะเซสชันในบริการสถานะเซสชันของคุณ เมื่อหน้าถูกร้องขอโดยผู้ใช้ที่ต้องการให้คุณเข้าถึงทรัพยากรให้ใช้ access_token และหาก access_token หมดอายุแล้วให้ใช้ refresh_token เพื่อรับหน้าใหม่

ลองนึกภาพว่ามีคนจัดการลักลอบเซสชันของคุณ สิ่งเดียวที่เป็นไปได้คือขอหน้าเว็บของคุณ

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

เปรียบเทียบ 1 และ 2:

ใน 1 access_token และ refresh_token เดินทางข้ามสายระหว่างเซิร์ฟเวอร์ authorzation (google ในกรณีของคุณ) และเซิร์ฟเวอร์แอปของคุณ นี้จะทำในช่องทางที่ปลอดภัย แฮ็กเกอร์สามารถจี้เซสชั่น แต่พวกเขาจะสามารถโต้ตอบกับแอปเว็บของคุณเท่านั้น ใน 2 แฮ็กเกอร์สามารถนำ access_token ออกไปและสร้างคำขอของพวกเขาเองไปยังทรัพยากรที่ผู้ใช้ได้ให้สิทธิ์การเข้าถึง แม้ว่าแฮ็กเกอร์จะเข้าถึง access_token พวกเขาจะมีเพียงหน้าต่างสั้น ๆ ที่พวกเขาสามารถเข้าถึงทรัพยากรได้

วิธีที่ refresh_token และ clientid / secret เป็นที่ทราบกันโดยเฉพาะกับเซิร์ฟเวอร์ทำให้เป็นไปไม่ได้จากเว็บเบราว์เซอร์ในการเข้าถึงระยะยาว

สมมติว่าคุณกำลังใช้ oauth2 และตั้งเวลาการเข้าถึงโทเค็นนาน:

ใน 1) ไม่มีความแตกต่างระหว่างโทเค็นการเข้าถึงระยะสั้นและระยะยาวเนื่องจากซ่อนอยู่ในเซิร์ฟเวอร์แอป ใน 2) บางคนสามารถรับ access_token ในเบราว์เซอร์แล้วใช้เพื่อเข้าถึงทรัพยากรของผู้ใช้โดยตรงเป็นเวลานาน

สถานการณ์มือถือ

บนมือถือมีบางสถานการณ์ที่ฉันรู้:

  1. เก็บ clientid / secret บนอุปกรณ์และให้อุปกรณ์ควบคุมการเข้าถึงทรัพยากรของผู้ใช้

  2. ใช้เซิร์ฟเวอร์แอพพลิเคชั่นแบ็กเอนด์เพื่อเก็บ clientid / secret และทำการ orchestration ใช้ access_token เป็นคีย์เซสชันและส่งผ่านระหว่างไคลเอ็นต์และเซิร์ฟเวอร์แอป

เปรียบเทียบ 1 และ 2

ใน 1) เมื่อคุณมีลูกค้า / ความลับบนอุปกรณ์พวกเขาจะไม่ลับอีกต่อไป ทุกคนสามารถถอดรหัสและเริ่มทำตัวเหมือนเป็นคุณโดยได้รับอนุญาตจากผู้ใช้แน่นอน access_token และ refresh_token นั้นอยู่ในหน่วยความจำเช่นกันและสามารถเข้าถึงได้บนอุปกรณ์ที่ถูกบุกรุกซึ่งหมายความว่าบางคนสามารถทำหน้าที่เป็นแอปของคุณโดยที่ผู้ใช้ไม่ให้ข้อมูลรับรอง ในสถานการณ์นี้ความยาวของ access_token นั้นไม่ต่างกับความสามารถในการแฮ็กเนื่องจาก refresh_token อยู่ในที่เดียวกับ access_token ใน 2) clientid / secret หรือโทเค็น refresh จะถูกทำลาย ที่นี่ความยาวของการหมดอายุ access_token กำหนดระยะเวลาที่แฮ็กเกอร์สามารถเข้าถึงทรัพยากรของผู้ใช้หากพวกเขาได้รับมัน

ความยาวหมดอายุ

ที่นี่ขึ้นอยู่กับสิ่งที่คุณรักษาความปลอดภัยด้วยระบบรับรองความถูกต้องของคุณว่าระยะเวลาการเข้าถึงของคุณจะหมดอายุเท่าไร หากเป็นสิ่งที่มีค่าอย่างยิ่งต่อผู้ใช้ควรสั้น สิ่งที่มีค่าน้อยกว่านั้นอาจนานกว่านี้

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

หวังว่าการโพสต์ความยาวค่อนข้างมีประโยชน์


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

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

11

นอกเหนือจากการตอบกลับอื่น ๆ :

เมื่อได้รับแล้วโทเค็นการเข้าถึงจะถูกส่งไปพร้อมกับทุกคำขอจากลูกค้าไปยังเซิร์ฟเวอร์ทรัพยากรที่ได้รับการป้องกัน สิ่งนี้ทำให้เกิดความเสี่ยงสำหรับการขโมยโทเค็นการเข้าถึงและเล่นซ้ำ (โดยแน่นอนว่าโทเค็นการเข้าถึงนั้นเป็นประเภท "Bearer" (ตามที่กำหนดไว้ใน RFC6750 เริ่มต้น)

ตัวอย่างของความเสี่ยงเหล่านั้นในชีวิตจริง:

  • โดยทั่วไปเซิร์ฟเวอร์ทรัพยากรเป็นเซิร์ฟเวอร์แอปพลิเคชันแบบกระจายและโดยทั่วไปจะมีระดับความปลอดภัยต่ำกว่าเซิร์ฟเวอร์การอนุญาต (การกำหนดค่า SSL / TLS ที่ต่ำกว่า, การทำให้แข็งน้อยลง ฯลฯ ) เซิร์ฟเวอร์ที่ได้รับอนุญาตในทางกลับกันมักจะถูกพิจารณาว่าเป็นโครงสร้างพื้นฐานด้านความปลอดภัยที่สำคัญและอาจมีความรุนแรงมากขึ้น

  • โทเค็นการเข้าถึงอาจปรากฏขึ้นในการติดตาม HTTP บันทึก ฯลฯ ที่ถูกเก็บรวบรวมอย่างถูกต้องสำหรับวัตถุประสงค์ในการวินิจฉัยบนเซิร์ฟเวอร์ทรัพยากรหรือลูกค้า ร่องรอยเหล่านั้นสามารถแลกเปลี่ยนได้ในสถานที่สาธารณะหรือกึ่งสาธารณะ (ผู้ติดตามบั๊กศูนย์บริการ ฯลฯ )

  • แอปพลิเคชันแบ็กเอนด์ RS สามารถเอาต์ซอร์ซไปยังบุคคลที่สามที่น่าเชื่อถือมากขึ้นหรือน้อยลง

รีเฟรช Token บนมืออื่น ๆ ที่ถูกส่งโดยทั่วไปจะมีเพียงสองครั้งผ่านสายและเสมอระหว่างลูกค้าและให้สิทธิ์เซิร์ฟเวอร์: ครั้งเดียวเมื่อได้รับโดยลูกค้าและเมื่อเมื่อนำมาใช้โดยลูกค้าในระหว่างการฟื้นฟู (อย่างมีประสิทธิภาพ "หมดอายุ" รีเฟรชก่อนหน้านี้ โทเค็น) นี่เป็นโอกาสที่ จำกัดอย่างมากสำหรับการสกัดกั้นและเล่นซ้ำ

ความคิดล่าสุด Refresh Tokens เสนอการป้องกันเพียงเล็กน้อยหากมีต่อลูกค้าที่ถูกบุกรุก


คุณค่อนข้างจะสัมผัสกับเรื่องนี้ แต่ฉันจะเน้นว่าพื้นผิวการโจมตีที่ใหญ่กว่าสำหรับการรับโทเค็น (หรือเปิดเผยโดยอ้อม) อยู่ในบันทึกของแอปพลิเคชันหรือบริการทรัพยากรเพิ่มที่เพิ่มขึ้นอย่างรวดเร็ว ทุกหนทุกแห่งในแบ็กเอนด์ API ทั่วไปมีการเข้าถึงโทเค็นการเข้าถึงที่ใช้ (หากมีการเข้าถึงวัตถุ HttpRequest ฯลฯ ) เฉพาะรหัสเส้นทางที่สองในระบบที่มีการเข้าถึงโทเค็นการรีเฟรช - อันที่สร้างขึ้นในสถานที่แรกและเส้นทางที่แลกเปลี่ยนมันสำหรับการเข้าถึงโทเค็นใหม่ นั่นคือความแตกต่างของการโจมตีที่สำคัญ
Tom Dibble

9

มันเป็นมาตรการรักษาความปลอดภัย หากแอปของคุณถูกโจมตีผู้โจมตีจะสามารถเข้าถึงโทเค็นการเข้าถึงระยะสั้นเท่านั้นและไม่มีวิธีการสร้างแอปใหม่

รีเฟรชโทเค็นยังหมดอายุ แต่พวกเขาควรจะมีชีวิตอยู่นานกว่าโทเค็นการเข้าถึง


45
แต่ผู้โจมตีจะไม่สามารถเข้าถึงโทเค็นการรีเฟรชได้หรือไม่ และสามารถใช้เพื่อสร้างโทเค็นการเข้าถึงใหม่ได้หรือไม่
levi

10
@levi แฮ็กเกอร์ไม่สามารถใช้โทเค็นการรีเฟรชเพื่อสร้างโทเค็นการเข้าถึงใหม่ได้เนื่องจากจำเป็นต้องใช้ ID ไคลเอ็นต์และความลับไคลเอ็นต์พร้อมกับโทเค็นการรีเฟรชเพื่อสร้างโทเค็นการเข้าถึงใหม่
ขัดขวาง

9
@Spike True แต่ไม่มีแอปที่มีรหัสลูกค้าและความลับฝังอยู่ด้วย
Andy

9
ดังนั้นจึงมีการป้องกันบางอย่างจากการดักจับแพ็คเก็ตตราบใดที่การสกัดกั้นจับการร้องขอข้อมูลทั่วไปเท่านั้น (Chuck เท่านั้นที่ได้รับโทเค็นการเข้าถึง)? ฟังดูอ่อนแอไปหน่อย หมวกสีดำจะต้องรอสักครู่จนกว่าผู้ใช้จะร้องขอโทเค็นการเข้าถึงใหม่จากนั้นเขาจะได้รับรหัสลูกค้าความลับและโทเค็นการรีเฟรช

3
นี่อาจเป็นเพียงแค่ฉันปัญญาอ่อนที่นี่ แต่ถ้าส่งผ่าน SSL ไม่ได้เพิ่มความปลอดภัยอีกชั้นหนึ่ง ฉันเดาว่าฉันเดาว่าทุกคนรู้ว่า SSL คืออะไร
Damon Drake
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.