เหตุใด OAuth v2 จึงมีทั้งโทเค็นการเข้าถึงและรีเฟรช


654

ส่วน 4.2 ของร่างโปรโตคอล OAuth 2.0 ระบุว่าเซิร์ฟเวอร์การอนุญาตสามารถส่งคืนทั้งสองได้ access_token (ซึ่งใช้ในการตรวจสอบสิทธิ์ของตัวเองด้วยทรัพยากร) เช่นเดียวกับ a refresh_tokenซึ่งใช้เพื่อสร้างใหม่อย่างแท้จริงaccess_token:

https://tools.ietf.org/html/rfc6749#section-4.2

ทำไมถึงมีทั้งคู่? ทำไมไม่เพียงแค่ทำให้access_tokenครั้งสุดท้ายตราบเท่าที่refresh_tokenและไม่มีrefresh_token?

คำตอบ:


463

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

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

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

หลักสูตรนี้แตกต่างจากการใช้งานที่คุณไม่ได้ควบคุมทั้งเซิร์ฟเวอร์การอนุญาตและเซิร์ฟเวอร์ทรัพยากร

นี่คือหัวข้อที่ดีพูดคุยเกี่ยวกับการใช้งานของสัญญาณรีเฟรช: OAuth หอจดหมายเหตุ

ข้อความจากด้านบนพูดถึงวัตถุประสงค์ด้านความปลอดภัยของโทเค็นการรีเฟรช:

รีเฟรชโทเค็น ... ลดความเสี่ยงของการรั่วไหลของ access_token ที่ยาวนาน (Param แบบสอบถามในล็อกไฟล์บนเซิร์ฟเวอร์ทรัพยากรที่ไม่ปลอดภัยเบต้าหรือแอปเซิร์ฟเวอร์เซิร์ฟเวอร์ที่มีการเข้ารหัสต่ำไคลเอ็นต์ JS SDK บนไซต์ https ที่ไม่ใช่ https ที่ทำให้ access_token คุกกี้ ฯลฯ )


14
Catchdave ถูกต้อง แต่คิดว่าฉันจะเพิ่มสิ่งที่มีวิวัฒนาการมาตั้งแต่การตอบครั้งแรกของเขา การใช้ SSL เป็นทางเลือกในขณะนี้ (อาจจะยังคงถูกอภิปรายเมื่อคำตอบ catchdave) ตัวอย่างเช่นโทเค็น MAC (ปัจจุบันอยู่ระหว่างการพัฒนา) ให้ความสามารถในการเซ็นชื่อคำขอด้วยไพรเวตคีย์เพื่อไม่จำเป็นต้องใช้ SSL โทเค็นรีเฟรชจึงกลายเป็นสิ่งสำคัญมากเนื่องจากคุณต้องการมีโทเค็น Mac ที่มีอายุสั้น
AlexGad

54
"รีเฟรชโทเค็นหากถูกโจมตีจะไม่มีประโยชน์เพราะผู้โจมตีต้องการรหัสลูกค้าและข้อมูลลับเพิ่มเติมจากโทเค็นการรีเฟรชเพื่อรับโทเค็นการเข้าถึง" แต่รหัสลูกค้าและความลับจะถูกเก็บไว้ในอุปกรณ์ด้วยใช่ไหม ดังนั้นผู้โจมตีที่สามารถเข้าถึงอุปกรณ์สามารถรับได้ ถ้าเช่นนั้นทำไม ที่นี่github.com/auth0/lock/wiki/Using-a-Refresh-Tokenเป็นลายลักษณ์อักษรที่สูญเสียโทเค็นรีเฟรชหมายความว่าเขาสามารถร้องขอโทเค็น auth ได้มากเท่าที่เขาต้องการอาจไม่ได้อยู่ในสถานการณ์ของ Google แต่ จะเป็นอย่างไรถ้าฉันใช้เซิร์ฟเวอร์ oauth2 ของตัวเอง
Jamsheed Kamarudeen

42
"ผู้โจมตีต้องการรหัสลูกค้าและความลับเพิ่มเติมจากโทเค็นการรีเฟรชเพื่อรับโทเค็นการเข้าถึง" : แล้วความแตกต่างระหว่างการใช้โทเค็นการรีเฟรชและการลาออกคืออะไร
sp00m

34
โทเค็นการรีเฟรชสามารถใช้โดยบุคคลที่สามที่สามารถต่ออายุโทเค็นการเข้าถึงได้โดยไม่ต้องรู้ข้อมูลประจำตัวของผู้ใช้
Marek Dec

27
@KevinWheeler ไม่ ID ไคลเอ็นต์และข้อมูลลับเป็นข้อมูลประจำตัวสำหรับไคลเอ็นต์ OAuth ไม่ใช่ผู้ใช้ เมื่อพูดถึง OAuth "ไคลเอนต์" มักจะเป็นเซิร์ฟเวอร์ (ตัวอย่างเช่นเว็บเซิร์ฟเวอร์สแต็คโอเวอร์โฟลว์) ซึ่งอินเทอร์เฟซที่มีการอนุญาตหรือเซิร์ฟเวอร์ API ทรัพยากร (ตัวอย่างเช่นผู้ให้บริการรับรองความถูกต้องของ Facebook) ข้อมูลรับรองของผู้ใช้จะถูกส่งผ่านระหว่างผู้ใช้และเซิร์ฟเวอร์ OAuth API เท่านั้นและไม่รู้จักลูกค้า ข้อมูลลับของลูกค้าจะถูกส่งจากลูกค้าไปยังเซิร์ฟเวอร์ OAuth API เท่านั้นและผู้ใช้จะไม่รู้จัก
เครื่องจักรโหยหา

551

ลิงก์สำหรับการสนทนาซึ่งจัดทำโดย Catchdave มีจุดที่ถูกต้อง (ต้นฉบับลิงค์ตาย) ที่ ทำโดย Dick Hardt ซึ่งฉันเชื่อว่าควรกล่าวถึงที่นี่นอกเหนือจากสิ่งที่เขียนไว้ด้านบน:

การระลึกถึงโทเค็นการรีเฟรชของฉันเพื่อความปลอดภัยและการเพิกถอน < ... >

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

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

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

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

ระบบที่ใช้โทเค็นการเข้าถึงระยะยาวควรทำงานอย่างไร

เซิร์ฟเวอร์อนุญาตให้ลูกค้าเข้าถึงข้อมูลของผู้ใช้ภายในขอบเขตที่กำหนดไว้ล่วงหน้าโดยการออกโทเค็น ตามที่เราต้องการเก็บโทเค็นที่เพิกถอนได้เราต้องเก็บโทเค็นพร้อมกับแฟล็ก "เพิกถอน" ที่ตั้งค่าไว้หรือไม่ได้ตั้งค่า (มิเช่นนั้นคุณจะทำสิ่งนั้นด้วยโทเค็นที่มีอยู่ในตัวเองได้อย่างไร)len(users) x len(registered clients) x len(scopes combination)บันทึก . คำขอ API ทุกครั้งจะต้องเข้าถึงฐานข้อมูล แม้ว่าจะเป็นเรื่องไม่สำคัญนักที่จะทำการสืบค้นฐานข้อมูลดังกล่าวที่มีประสิทธิภาพ O (1) จุดล้มเหลวเพียงจุดเดียวอาจส่งผลเสียต่อความสามารถในการขยายขนาดและประสิทธิภาพของระบบ

ระบบที่ใช้โทเค็นการรีเฟรชที่มีอายุการใช้งานนานและโทเค็นการเข้าถึงระยะสั้นควรทำงานอย่างไร

ที่นี่เราออกสองคีย์: โทเค็นการรีเฟรชแบบสุ่มพร้อมระเบียนที่สอดคล้องกันในฐานข้อมูลและโทเค็นการเข้าถึงที่มีอยู่ในตัวเองซึ่งประกอบด้วยฟิลด์เขตเวลาการหมดอายุ

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

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

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

ความสมดุล

รีเฟรชโทเค็นบางส่วนกำจัด SPoF (จุดเดียวของความล้มเหลว) ของฐานข้อมูล Access Token แต่ก็มีข้อเสียที่เห็นได้ชัด

  1. หน้าต่าง". กรอบเวลาระหว่างเหตุการณ์ "ผู้ใช้ยกเลิกการเข้าถึง" และ "การเข้าถึงถูกรับประกันว่าจะถูกเพิกถอน"

  2. ความซับซ้อนของลอจิกไคลเอ็นต์

    ไม่มีการรีเฟรชโทเค็น

    • ส่งคำขอ API ด้วยโทเค็นการเข้าถึง
    • ถ้าโทเค็นการเข้าถึงไม่ถูกต้องล้มเหลวและขอให้ผู้ใช้รับรองความถูกต้องอีกครั้ง

    ด้วยโทเค็นการรีเฟรช

    • ส่งคำขอ API ด้วยโทเค็นการเข้าถึง
    • หากโทเค็นการเข้าถึงไม่ถูกต้องลองอัปเดตโดยใช้โทเค็นการรีเฟรช
    • หากรีเฟรชคำขอผ่านให้อัปเดตโทเค็นการเข้าถึงและส่งคำขอ API เริ่มต้นอีกครั้ง
    • หากรีเฟรชคำขอล้มเหลวขอให้ผู้ใช้รับรองความถูกต้องอีกครั้ง

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


4
@RomannImankulov ถ้าฉันเข้าใจว่ารีเฟรชโทเค็นอย่างถูกต้องเราสามารถบันทึกลงในฐานข้อมูลและลบออกได้ทุกเมื่อที่เราต้องการยกเลิกการเข้าถึงดังนั้นทำไมไม่บันทึกโทเค็นด้วยตนเอง
kosnkov

30
@kosnkov เวอร์ชันย่อของโพสต์ของฉันคือถ้าคุณบันทึกโทเค็นการเข้าถึงในฐานข้อมูลคุณกดฐานข้อมูลในทุกคำขอไปยัง API ของคุณ (ซึ่งอาจมีหรือไม่มีปัญหาในกรณีของคุณ) หากคุณบันทึกโทเค็นการรีเฟรชและคงการเข้าถึงโทเค็น "อยู่ในตัวเอง" คุณจะเข้าใช้ฐานข้อมูลเมื่อไคลเอ็นต์ตัดสินใจรีเฟรชโทเค็นการเข้าถึง
Roman Imankulov

5
โดยส่วนตัวแล้วฉันไม่ชอบวิธีการนี้ในการไม่กดฐานข้อมูลเพื่อให้ได้ประสิทธิภาพหากมีการประนีประนอมความปลอดภัย (แม้ว่าจะเป็นเพียงช่วงเวลาของหน้าต่าง) เราควรจะเพิกถอน access_token ทันทีหากจำเป็นเพราะเกือบทุกครั้งที่เราจัดการกับข้อมูลผู้ใช้ที่ละเอียดอ่อน (มิฉะนั้นเราอาจจะไม่ใช้ OAuth ในตอนแรก) ฉันสงสัยว่า บริษัท ที่ใหญ่กว่าเช่น Facebook และ Google ใช้วิธีใด
Tiago

1
ฉันไม่เข้าใจว่าทำไมเราต้องมี "หน้าต่างเปิด" บางครั้ง เหตุใดเราไม่สามารถส่งคำขอไปยังเซิร์ฟเวอร์ทรัพยากรเพื่อไม่ยอมรับโทเค็นการเข้าถึงสำหรับผู้ใช้รายนี้ ฉันต้องแก้ไขด้วยหรือไม่ว่าคุณไม่สามารถมีพฤติกรรมโทเค็นรีเฟรชเมื่อคุณไม่มีความลับของลูกค้าในการเซ็นสัญญาด้วย? ดังนั้นโดยทั่วไปคุณไม่สามารถใช้ราชสกุลรีเฟรชจากซอฟต์แวร์บนอุปกรณ์ cliemts js สก์ท็อปมือถือปพลิเคชันอื่น ๆ
อิกอร์ Cordas

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

199

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

คิดถึงสถานการณ์แบบนี้ คุณออกผู้ใช้โทเค็นการเข้าถึง 3600 วินาทีและรีเฟรชโทเค็นนานกว่าหนึ่งวัน

  1. ผู้ใช้เป็นผู้ใช้ที่ดีเขาอยู่ที่บ้านและเปิด / ปิดการช็อปปิ้งเว็บไซต์ของคุณและค้นหาบน iPhone ของเขา ที่อยู่ IP ของเขาจะไม่เปลี่ยนแปลงและมีการโหลดต่ำมากบนเซิร์ฟเวอร์ของคุณ ชอบหน้า 3-5 หน้าทุกนาที เมื่อ 3600 วินาทีบนโทเค็นการเข้าถึงของเขาสิ้นสุดลงเขาต้องใช้โทเค็นใหม่ที่มีโทเค็นการรีเฟรช เราในด้านเซิร์ฟเวอร์ตรวจสอบประวัติกิจกรรมและที่อยู่ IP ของเขาคิดว่าเขาเป็นมนุษย์และประพฤติตน เราอนุญาตให้โทเค็นการเข้าถึงใหม่ของเขาเพื่อใช้บริการของเราต่อไป ผู้ใช้ไม่จำเป็นต้องป้อนชื่อผู้ใช้ / รหัสผ่านอีกครั้งจนกว่าจะครบหนึ่งวันของการรีเฟรชโทเค็นเอง

  2. ผู้ใช้เป็นความประมาทของผู้ใช้ เขาอาศัยอยู่ในนิวยอร์กสหรัฐอเมริกาและได้ปิดโปรแกรมไวรัสของเขาและถูกแฮ็กโดยแฮกเกอร์ในโปแลนด์ เมื่อแฮ็กเกอร์ได้รับโทเค็นการเข้าถึงและรีเฟรชโทเค็นเขาพยายามที่จะปลอมตัวเป็นผู้ใช้และใช้บริการของเรา แต่หลังจากโทเค็นการเข้าถึงระยะสั้นหมดอายุเมื่อแฮกเกอร์พยายามรีเฟรชโทเค็นการเข้าถึงเราบนเซิร์ฟเวอร์ได้สังเกตเห็นการเปลี่ยนแปลง IP อย่างมากในประวัติศาสตร์พฤติกรรมผู้ใช้ (เฮ้เข้าสู่ระบบคนนี้ในสหรัฐอเมริกาและตอนนี้รีเฟรชการเข้าถึงในโปแลนด์ หลังจากเพียง 3600s ???) เรายุติกระบวนการรีเฟรชทำให้โทเค็นการรีเฟรชเป็นโมฆะและแจ้งให้ป้อนชื่อผู้ใช้ / รหัสผ่านอีกครั้ง

  3. ผู้ใช้เป็นที่เป็นอันตรายของผู้ใช้ เขาตั้งใจจะใช้บริการของเราในทางที่ผิดโดยโทร 1,000 ครั้ง API ของเราทุกนาทีโดยใช้หุ่นยนต์ เขาสามารถทำได้จนถึง 3600 วินาทีต่อมาเมื่อเขาพยายามรีเฟรชโทเค็นการเข้าถึงเราสังเกตเห็นพฤติกรรมของเขาและคิดว่าเขาอาจไม่ใช่มนุษย์ เราปฏิเสธและยุติกระบวนการรีเฟรชและขอให้เขาป้อนชื่อผู้ใช้ / รหัสผ่านอีกครั้ง สิ่งนี้อาจทำลายการไหลอัตโนมัติของหุ่นยนต์ของเขา อย่างน้อยก็ทำให้เขาอึดอัด

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

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


@laalaguer คุณมีนโยบายที่ละเอียดยิ่งขึ้นเช่น: อย่าเพิกถอนโทเค็นเมื่อมีการเปลี่ยนแปลงที่อยู่ IP ของผู้ใช้ (เมื่อโทรศัพท์มือถือถูกตัดการเชื่อมต่อจาก WiFi และเชื่อมต่อกับเครือข่าย 3G / 4G)?
svlada

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

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

7
@Avi Cherry - ใช่โทเค็นการเข้าถึงอาจมีอายุสั้นและสามารถรีเฟรชได้หากผู้ใช้นั้นยังถือว่าใช้ได้ ไม่ต้องการโทเค็นการรีเฟรชเพื่อทำสิ่งนั้น
Rick Jolly

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

72

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

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


16
สิ่งนี้น่าสนใจในกรณีของ Google เมื่อคุณขอโทเค็นการรีเฟรชคุณยังส่งรหัสลูกค้าและข้อมูลลับของลูกค้า ดังนั้นคุณจะประนีประนอมทุกชั่วโมง
Rots

1
Alexander จริง ๆ แล้ว ttl ที่สั้นกว่านั้นบ่อยครั้งที่ไคลเอ็นต์จะต้องได้รับโทเค็นการเข้าถึงใหม่ (ซึ่งจำเป็นต้องใช้ข้อมูลประจำตัวลูกค้า) อันที่จริงแล้วฉันหมายถึง 'สั้นกว่า' ตรงนั้น ฉันจะเพิ่มบันทึกย่อเพื่อชี้แจง
BT

2
"จุดประสงค์เดียว" - ไม่ล้าง การทำให้ TTL ของโทเค็นการเข้าถึงตราบใดที่โทเค็นรีเฟรชตามจินตนาการจะได้รับเหมือนกัน
รูบาร์บ

8
เนื่องจากมาตรฐานกำหนดให้ส่งข้อมูลประจำตัวลูกค้าพร้อมกับโทเค็นการรีเฟรชหลักฐานของคำตอบนี้จึงเป็นเท็จ "เนื่องจากรีเฟรชโทเค็นโดยทั่วไปจะใช้ข้อมูลรับรองที่ยาวนานเพื่อขอโทเค็นการเข้าถึงเพิ่มเติม ... ไคลเอ็นต์ต้องตรวจสอบสิทธิ์กับเซิร์ฟเวอร์การให้สิทธิ์" ดูความคิดเห็นโดย @Rots
Kevin Christopher Henry

8
A) ฉันคิดว่าคุณกำลังผสมความลับของลูกค้าและความลับของผู้ใช้ ความลับของไคลเอ็นต์จะไม่ถูกส่งจากอุปกรณ์ผู้ใช้เฉพาะจากแอปพลิเคชันการเข้าถึงส่วนหลังไปยังข้อมูลที่ให้แอปพลิเคชันด้านหลัง B) เซิร์ฟเวอร์ oAuth ที่อนุญาตให้ใช้รหัสผ่านสำหรับไคลเอนต์สาธารณะ (ไคลเอนต์ที่ไม่สามารถเก็บความลับของลูกค้าเช่นแอปเนทีฟหรือจาวาสคริปต์) จะให้การอนุญาตโทเค็นรีเฟรชสำหรับไคลเอ็นต์สาธารณะนั้นด้วยดังนั้นคุณไม่จำเป็นต้อง ส่งความลับของลูกค้าเมื่อรีเฟรชโทเค็นของคุณ C) refresh-token ให้แบ็กเอนด์ด้วย "hart-beat" เมื่อตรวจสอบความถูกต้องของผู้ใช้!
Andreas Lundgren

55

เพื่อกำจัดความสับสนคุณต้องเข้าใจบทบาทของความลับของลูกค้าและรหัสผ่านผู้ใช้ซึ่งแตกต่างกันมาก

ลูกค้าเป็น app / เว็บไซต์ / โปรแกรม / ... ได้รับการสนับสนุนโดยเซิร์ฟเวอร์ที่ต้องการที่จะรับรองความถูกต้องผู้ใช้โดยใช้บริการการตรวจสอบบุคคลที่สาม ข้อมูลลับของไคลเอ็นต์เป็นสตริง (แบบสุ่ม) ที่ทั้งลูกค้ารายนี้และเซิร์ฟเวอร์การตรวจสอบความถูกต้องรู้ การใช้ความลับนี้ลูกค้าสามารถระบุตัวเองด้วยเซิร์ฟเวอร์การตรวจสอบที่ได้รับอนุญาตให้ขอโทเค็นการเข้าถึง

ในการรับโทเค็นการเข้าถึงเริ่มต้นและโทเค็นการรีเฟรชสิ่งที่จำเป็นคือ:

  • ID ผู้ใช้
  • รหัสผ่านผู้ใช้
  • รหัสลูกค้า
  • ความลับของลูกค้า

ในการรับโทเค็นการเข้าถึงที่รีเฟรชอย่างไรก็ตามไคลเอนต์ใช้ข้อมูลต่อไปนี้:

  • รหัสลูกค้า
  • ความลับของลูกค้า
  • โทเค็นการรีเฟรช

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

นอกจากนี้ยังแสดงให้เห็นว่าการสูญเสียโทเค็นการรีเฟรชจะไม่มีปัญหาเพราะไม่ทราบรหัสลูกค้าและความลับ นอกจากนี้ยังแสดงให้เห็นว่าการรักษาลูกค้าและรหัสลับของลูกค้าเป็นความลับที่สำคัญ


1
"สิ่งนี้ยังแสดงให้เห็นว่าการสูญเสียโทเค็นการรีเฟรชไม่มีปัญหาเพราะไม่รู้จักรหัสลูกค้าและความลับ" แต่ฉันไม่ต้องการพวกเขา หากฉันได้รับโทเค็นการรีเฟรชฉันสามารถส่งต่อไปยังเซิร์ฟเวอร์แอปพลิเคชันของคุณได้ เพิ่ม client_id และเป็นความลับจากนั้นส่งต่อทั้งสามไปยังบริการ OAuth ประเด็นคืออะไร?
3DFace

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

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

@KevinChristopherHenry ประเภทนี้แนะนำว่าสำหรับผู้ใช้เพียงแค่ลงชื่อเข้าใช้เว็บไซต์ บริษัท XYZ.com โทเค็นการรีเฟรชไม่มีความหมายในการรับโทเค็นการเข้าถึงใหม่สำหรับ XYZ.com หรือไม่ แต่โทเค็นการรีเฟรชสามารถเป็นสตริงที่คาดเดาไม่ได้เช่น guid ที่เก็บไว้ในตารางที่สามารถค้นหาได้อย่างรวดเร็ว ในขณะที่โทเค็นการเข้าถึงสามารถทำดัชนีได้นานขึ้นและหนักขึ้นในฐานข้อมูล ดังนั้นรีเฟรชโทเค็นสามารถจัดเก็บและมีประโยชน์ในด้านผู้ใช้ [แม้ว่าตั้งแต่คำถามนี้พูดคุยเกี่ยวกับ OAuth2 บางทีคำตอบใด ๆ โดยบริการของบุคคลที่สามที่ทำหน้าที่ในนามของคนที่ไม่ได้อยู่แล้วที่เกี่ยวข้อง]
Simon_Weaver

ทำไมคุณไม่สามารถส่ง 'รหัสลูกค้า' + 'ความลับของลูกค้า' + 'โทเค็นการเข้าถึงหมดอายุ' เพื่อรับโทเค็นการเข้าถึงใหม่
น้ำผึ้ง

37

คำตอบนี้มาจาก Justin Richer ผ่านรายการอีเมลมาตรฐานของ OAuth 2 นี่คือการโพสต์ด้วยการอนุญาตของเขา


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

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

OpenID Connect ไม่เพียงให้ข้อมูลผู้ใช้แก่คุณจากโทเค็นการเข้าถึง แต่ยังให้โทเค็น ID ด้วย นี่เป็นข้อมูลแยกต่างหากที่ส่งตรงถึงลูกค้าไม่ใช่ AS หรือ RS ใน OIDC คุณควรพิจารณาว่าใครบางคน“ เข้าสู่ระบบ” จริง ๆ โดยโปรโตคอลถ้าคุณสามารถรับโทเค็น ID สด การรีเฟรชมันไม่น่าจะเพียงพอ

สำหรับข้อมูลเพิ่มเติมโปรดอ่านhttp://oauth.net/articles/authentication/


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

18

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

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

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


2
"รีเฟรชโทเค็นอนุญาตให้ไคลเอนต์เท่านั้นรับรองความถูกต้องอีกครั้ง ... " เป็นสิ่งสำคัญที่นี่
James

13

ทำไมไม่เพียงทำให้ access_token มีอายุการใช้งานนานกว่า refresh_token และไม่มี refresh_token อยู่ล่ะ

นอกจากคำตอบที่ยอดเยี่ยมที่คนอื่น ๆ ให้ไว้มีอีกเหตุผลว่าทำไมจะใช้โทเค็นรีเฟรชและเกี่ยวข้องกับการเรียกร้อง

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

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


4
มันจะเป็นวิธีปฏิบัติที่ไม่ดีที่ผิดปกติในการใส่ "การเรียกร้อง" ในโทเค็นการเข้าถึง ตามที่อธิบายไว้ในข้อมูลจำเพาะโทเค็นการเข้าถึง "มักจะทึบแสงให้กับลูกค้า" คุณมีตัวอย่างของผู้ให้บริการ OAuth ที่ทำสิ่งนี้หรือไม่
Kevin Christopher Henry

3
@heymega เมื่อบทบาทผู้ใช้ถูกลดระดับจาก ADMIN เป็น REGULAR_USER ความคาดหวังคือบทบาทผู้ใช้จะต้องถูกเพิกถอนทันทีและไม่ใช่เมื่อ access_token หมดอายุ ดังนั้นดูเหมือนว่าการกดปุ่มฐานข้อมูลในแต่ละคำขอจะหลีกเลี่ยงไม่ได้
svlada

@svlada ฉันคิดว่าจะเป็นกรณีที่แอปพลิเคชันปรับลดรุ่นเอนทิตีจาก ADMIN เป็น REGULAR_USER (ในกระบวนการเดียวกัน) จะต้องยกเลิกโทเค็นที่เหมาะสมด้วย เช่นถ้าเรารู้ว่าการเรียกร้องกำลังจะเปลี่ยนแปลงเราไม่รอให้หมดอายุเราเพิกถอนทันที
e_i_pi

13

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

คุณไม่สามารถยกเลิกโทเค็นการเข้าถึงได้เพียงโทเค็นการรีเฟรช


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

10
ฉันไม่เห็นด้วย. โทเค็นการเข้าถึงออกโดยเซิร์ฟเวอร์รับรองความถูกต้องเซ็นชื่อด้วยวันหมดอายุและส่งไปยังลูกค้า เมื่อไคลเอ็นต์ส่งโทเค็นนั้นไปยังเซิร์ฟเวอร์ทรัพยากรเซิร์ฟเวอร์ทรัพยากรจะไม่ติดต่อเซิร์ฟเวอร์รับรองความถูกต้องเพื่อตรวจสอบโทเค็น เพียงแค่ดูวันหมดอายุในโทเค็น (ลงชื่อและไม่ได้รับการแก้ไข) ดังนั้นไม่ว่าคุณจะทำอะไรที่เซิร์ฟเวอร์ auth เพื่อลอง 'เพิกถอน' เซิร์ฟเวอร์ทรัพยากรก็ไม่สนใจ บางคนอ้างถึงการออกจากระบบของลูกค้าเป็นการเพิกถอน (เช่นลูกค้าลบโทเค็นของมัน) แต่ imho นี่เป็นคำศัพท์ที่ทำให้เข้าใจผิด - เราต้องการ 'เพิกถอน' โทเค็นที่เซิร์ฟเวอร์ไม่ใช่ลูกค้า
bitcoder

1
ไม่บอกว่าคุณไม่สามารถเขียนรหัสที่กำหนดเองเพื่อละเว้นโทเค็นบางอย่าง (เช่นที่นี่stackoverflow.com/questions/22708046/ ...... ) แต่การทำเช่นนั้นอาจเกี่ยวข้องกับการเดินทางผ่านเครือข่ายจากเซิร์ฟเวอร์ทรัพยากรไปยังเซิร์ฟเวอร์ oauth / db แต่ละครั้งที่ไคลเอ็นต์สร้าง โทร. คุณหลีกเลี่ยงการโทรเหล่านั้นโดยใช้โทเค็นการรีเฟรชแทนและฉันคิดว่าสอดคล้องกับสิ่งที่ผู้แต่ง oauth ตั้งใจไว้มากขึ้น
bitcoder

13

คำตอบนี้ได้รับการรวบรวมโดยความช่วยเหลือของผู้พัฒนาอาวุโสสองคน (John Brayton และ David Jennes)

เหตุผลหลักในการใช้โทเค็นการรีเฟรชคือการลดพื้นผิวการโจมตี

สมมุติว่าไม่มีรหัสรีเฟรชและลองดูตัวอย่างนี้:

อาคารมี 80 ประตู ประตูทุกบานถูกเปิดด้วยกุญแจเดียวกัน กุญแจจะเปลี่ยนทุกๆ 30 นาที ในตอนท้ายของ 30 นาทีฉันต้องมอบกุญแจเก่าแก่ผู้สร้างกุญแจและรับกุญแจใหม่

หากฉันเป็นแฮ็กเกอร์และรับกุญแจของคุณจากนั้นภายใน 30 นาทีฉันจะส่งมอบให้กับผู้สร้างกุญแจและรับรหัสใหม่ ฉันจะสามารถต่อเนื่องเปิดประตูทุกบานโดยไม่คำนึงถึงการเปลี่ยนแปลงที่สำคัญ

คำถาม: ในช่วง 30 นาทีที่ผ่านมาฉันมีโอกาสแฮ็คกุญแจจำนวนเท่าใด? ฉันมีโอกาสแฮ็ค 80 ครั้งทุกครั้งที่คุณใช้คีย์ (คิดว่านี่เป็นการร้องขอเครือข่ายและส่งโทเค็นการเข้าถึงเพื่อระบุตัวตนของคุณ) นั่นคือพื้นผิวการโจมตี 80X

ตอนนี้ลองทำตัวอย่างเดียวกัน แต่คราวนี้สมมติว่ามีคีย์รีเฟรช

อาคารมี 80 ประตู ประตูทุกบานถูกเปิดด้วยกุญแจเดียวกัน กุญแจจะเปลี่ยนทุกๆ 30 นาที ในการรับรหัสใหม่ฉันไม่สามารถส่งโทเค็นการเข้าถึงเก่าได้ ฉันจะต้องส่งคีย์รีเฟรชเท่านั้น

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

คำถาม: ในช่วง 30 นาทีฉันมีโอกาสแฮ็คกับคีย์รีเฟรชกี่ครั้ง 80? ไม่ฉันมีโอกาสแฮ็คเพียง 1 ครั้งเท่านั้น ในช่วงเวลาที่ผู้ให้บริการจัดส่งสื่อสารกับผู้ผลิตกุญแจ นั่นคือพื้นผิวการโจมตี 1X ฉันมีโอกาสแฮ็คกับกุญแจ 80 ครั้ง แต่พวกเขาไม่ดีหลังจาก 30 นาที


เซิร์ฟเวอร์จะตรวจสอบโทเค็นการเข้าถึงตามข้อมูลประจำตัวและการลงชื่อ (โดยทั่วไป) JWT

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

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

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

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

การแบ่งส่วนเป็นสิ่งที่ดีสำหรับความปลอดภัย

สุดท้าย แต่ไม่ท้ายสุดก็เห็นคำตอบที่ยอดเยี่ยมนี้


โทเค็นการรีเฟรชใดที่ไม่เกี่ยวกับ

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


2
เป็นการยากที่จะติดตามการเปรียบเทียบนี้เนื่องจากคำถามแตกต่างกัน 1 "ในช่วง 30 นาทีฉันมีโอกาสแฮ็คกับคีย์จำนวนเท่าใด" (ฉันไม่มีคีย์เป็นแฮ็กเกอร์ก่อนหรือไม่) 2. "ในช่วง 30 นาทีฉันมีโอกาสแฮ็คจำนวนเท่าใดต่อผู้ให้บริการจัดส่ง" "โอกาสการแฮ็ค" จะเป็นอย่างไร? ในฐานะที่เป็นแฮกเกอร์ฉันไม่มีกุญแจเลยใช่ไหม
Cesc

1
คุณถูก. ฉันได้เปลี่ยนแปลง
น้ำผึ้ง

4

สมมติว่าคุณaccess_tokenใช้เวลานานมากและไม่มีrefresh_tokenดังนั้นในหนึ่งวันแฮ็กเกอร์จะได้รับสิ่งนี้access_tokenและเขาสามารถเข้าถึงทรัพยากรที่ได้รับการปกป้องได้ทั้งหมด!

แต่ถ้าคุณมีrefresh_tokenที่access_tokenเวลาอยู่เป็นระยะสั้นเพื่อให้แฮ็กเกอร์เป็นเรื่องยากที่จะตัดของคุณaccess_tokenเพราะมันจะไม่ถูกต้องหลังจากช่วงเวลาสั้น ๆ Access_tokenสามารถดึงกลับมาได้โดยใช้ไม่เพียงrefresh_tokenแต่โดยclient_idและโดยclient_secretที่แฮ็กเกอร์คนนั้นไม่มี


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

2

ในขณะที่รีเฟรชโทเค็นจะถูกเก็บรักษาไว้โดยเซิร์ฟเวอร์การอนุญาต โทเค็นการเข้าถึงมีอยู่ในตัวเองเพื่อให้เซิร์ฟเวอร์ทรัพยากรสามารถตรวจสอบได้โดยไม่ต้องจัดเก็บซึ่งจะช่วยประหยัดการดึงข้อมูลในกรณีที่มีการตรวจสอบความถูกต้อง อีกจุดที่ขาดหายไปในการสนทนามาจาก rfc6749 # page-55

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

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


ผมคิดว่านี่เป็นจุดสำคัญมากนอกจากนี้ยัง :-) - ในระดับหนึ่ง - ชนิดของเลิกทะเลาะกันที่นี่auth0.com/docs/tokens/refresh-token/current#restrictionsว่าA Single-Page Application (normally implementing Single-Page Login Flow) should not under any circumstances get a Refresh Token. The reason for that is the sensitivity of this piece of information. You can think of it as user credentials, since a Refresh Token allows a user to remain authenticated essentially forever. Therefore you cannot have this information in a browser, it must be stored securely.
Simon_Weaver

1

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

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

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


0

ขั้นแรกให้ลูกค้าตรวจสอบสิทธิ์กับเซิร์ฟเวอร์การอนุญาตโดยให้สิทธิ์การให้สิทธิ์

จากนั้นไคลเอ็นต์ร้องขอเซิร์ฟเวอร์ทรัพยากรสำหรับทรัพยากรที่มีการป้องกันโดยให้โทเค็นการเข้าถึง

เซิร์ฟเวอร์ทรัพยากรตรวจสอบโทเค็นการเข้าถึงและจัดเตรียมทรัพยากรที่มีการป้องกัน

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

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

ไคลเอนต์รับรองความถูกต้องกับเซิร์ฟเวอร์การให้สิทธิ์โดยให้โทเค็นการรีเฟรช

เซิร์ฟเวอร์การให้สิทธิ์จะตรวจสอบโทเค็นการรีเฟรชโดยตรวจสอบสิทธิ์ไคลเอนต์และออกโทเค็นการเข้าถึงใหม่หากถูกต้อง


นี่ไม่ได้พูดถึงว่าโทเค็นการรีเฟรชมาจากที่ใด ฉันสมมติวรรคสองควรจะพูดว่าaccess token + refresh token?
Simon_Weaver
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.