ควรใช้คุกกี้ใน RESTful API หรือไม่


77

ฉันสนใจเป็นพิเศษในการที่ผู้ใช้ทำการดำเนินงานที่ได้รับอนุญาต / รับรองความถูกต้องบนเว็บ API

คุกกี้การรับรองความถูกต้องเข้ากันได้กับปรัชญา REST และทำไม


สำเนาซ้ำทั้งหมดของrestful-authentication


1
@JarrodRoberson ความเข้าใจของผมคือว่าคำตอบในเว็บไซต์อื่นจะได้มีสิทธิ์คำถามเป็นซ้ำที่นี่
ทอมสไควร์

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

1
ฉันเห็นด้วยกับ @BrandonLinton ที่นี่คำถามกว้างเกินไปสำหรับ Stackoverflow มันเกี่ยวกับสถาปัตยกรรมและวิธีการออกแบบ OP ต้องการแนวปฏิบัติและรูปแบบที่ดีที่สุดคำแนะนำและ gotchas ไม่ใช่คำตอบที่เฉพาะเจาะจงดังนั้นจึงไม่มีการระบุภาษา ดังนั้นมันอยู่ที่นี่
dooburt

คำตอบ:


81

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

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

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

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

แก้ไข:ใน RE ถึงความคิดเห็นของ @ Konrad ด้านล่าง:

การเปรียบเทียบโทเค็นนั้นทำได้ยากกว่าโดยเฉพาะอย่างยิ่งเพราะคุณไม่สามารถทำให้โทเค็นเป็นโมฆะได้ง่าย ๆ

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

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


4
+1, ฉันชอบการใช้ส่วนหัวการอนุญาตอย่างแน่นอน แต่ "ถอยกลับ" ไปยังคุกกี้โดยขึ้นอยู่กับสิ่งที่ดีที่สุดสำหรับลูกค้า
Brandon Linton

ฉันไม่เห็นด้วยกับ "สำหรับลูกค้านอกเหนือจากเบราว์เซอร์การจัดการคุกกี้เป็นความไม่สะดวกที่ใหญ่มาก ... " ไลบรารีไคลเอนต์ HTTP ส่วนใหญ่สนับสนุนคุกกี้ตัวอย่างเช่นด้วยHttpClientใน. NET คุณสามารถใช้คุกกี้ได้โดยไม่มีปัญหาใด ๆ และคุณไม่จำเป็นต้องคิดถึงมันจริงๆ การเปรียบเทียบโทเค็นนั้นทำได้ยากกว่าโดยเฉพาะอย่างยิ่งเพราะคุณไม่สามารถทำให้โทเค็นเป็นโมฆะได้ง่าย ๆ
Konrad

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

ระวังว่าการยอมรับคุกกี้เพียงเปิดช่องโหว่ CSRF ดูที่security.stackexchange.com/a/166798
Michael Osl

14

ใช่และไม่ใช่ - ขึ้นอยู่กับว่าคุณใช้มันอย่างไร

คุกกี้หากใช้เพื่อรักษาสถานะไคลเอนต์ที่ลูกค้าสำหรับลูกค้าของลูกค้าและโดยลูกค้าแล้วพวกเขาจะสงบ

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

ดังนั้นมีตัวอย่างอะไรบ้าง

สงบ:

  • รายละเอียดการรับรองความถูกต้องหรือ 'เข้าสู่ระบบใน' kinda stuff
  • หน้าหรือสถานที่ที่ดูล่าสุดในแอปพลิเคชัน ฯลฯ

ไม่พักผ่อน

  • กำลังจัดเก็บข้อมูลเซสชัน

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


10
หากคุณเก็บการตั้งค่าสถานะ "isLoggedIn" บนไคลเอนต์คุณอาจใช้การรับรองความถูกต้องเลย
tdammers

สิ่งนี้สมเหตุสมผลแล้ว - การจัดเก็บสถานะฝั่งไคลเอ็นต์ของแอปพลิเคชันจะไม่สอดคล้องกับ REST แต่ข้อมูลลูกค้าที่ใช้เพื่อแสดงถึงตัวเองนั้นดูดี
Brandon Linton

1
ฉันต้องการเพิ่มว่าการใส่ข้อมูลการตรวจสอบความถูกต้องในคุกกี้จะเป็นการเปิดโอกาสให้เกิดการโจมตีปลอมแปลงได้ มีวิธีที่ดีกว่าฉันขอแนะนำให้คัดลอก Amazon: docs.aws.amazon.com/AmazonS3/latest/API/ …
Dobes Vandermeer

@ ผู้ส่งอีเมลจะทำอย่างไรหากการตั้งค่าสถานะ "isLoggedIn" อยู่ใน JWT จากนั้นควรจะปลอดภัยโดยให้ JWT ออกและตรวจสอบอย่างถูกต้อง
Aaron J Spetner

@AaronJSpetner: อย่าใช้ JWT สำหรับการประชุม
tdammers

12

หนึ่งสามารถใช้คุกกี้ ส่วนที่เหลือช่วยให้พวกเขา

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

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.