วิธีแก้ไขข้อผิดพลาดขนาดคุกกี้เกินโดยการแยกคุกกี้
วิธีแก้ข้อผิดพลาดขนาดคุกกี้เกิน: แยกคุกกี้ออกเป็นคุกกี้ย่อย ๆ หลาย ๆ ชิ้นและสร้างใหม่ที่ฝั่งเซิร์ฟเวอร์ วิธีนี้ทำงานได้ดีเป็นพิเศษสำหรับแพลตฟอร์มเซิร์ฟเวอร์เลส โดยไม่ต้องมีโครงสร้างพื้นฐานเพิ่มเติม
ย่อสั้น ๆ: เมื่อขนาดคุกกี้ของคุณเกินขีดจำกัด 4KB ของเบราว์เซอร์ ให้แยกมันออกเป็นคุกกี้ย่อย ๆ หลาย ๆ ชิ้นและสร้างมันใหม่ที่ฝั่งเซิร์ฟเวอร์ วิธีนี้ทำงานได้ดีเป็นพิเศษสำหรับแพลตฟอร์มเซิร์ฟเวอร์เลส โดยไม่ต้องมีโครงสร้างพื้นฐานเพิ่มเติม
การใช้คุกกี้ใน Logto SDKs
ใน Logto SDKs ส่วนใหญ่สำหรับแอปเว็บดั้งเดิม เราเก็บข้อมูลเซสชันในคุกกี้ HTTP-only เพื่อความปลอดภัย นี่คือแนวทางของเรา:
เมื่อ SDK ดำเนินการที่ต้องใช้ข้อมูลเซสชัน มันจะ:
- เข้ารหัสโดยใช้การเข้ารหัสแบบสมมาตร
- เก็บสตริงที่เข้ารหัสไว้ในคุกกี้ HTTP-only
- ตั้งค่าแฟล็กการรักษาความปลอดภัยเพื่อให้แน่ใจว่ามีการส่งผ่าน HTTPS-only
แนวทางนี้ไม่ต้องการเก็บ ข้อมูลภายนอกและสามารถปรับใช้ได้โดยตรงกับแพลตฟอร์มเซิร์ฟเวอร์เลสยอดนิยม เช่น Vercel โดยไม่มีการเปลี่ยนแปลงโครงสร้างพื้นฐานเพิ่มเติม
ปัญหา: ข้อผิดพลาดขนาดคุกกี้เกิน
อย่างไรก็ตาม เมื่อมีการใช้งานการสนับสนุนหลายองค์กร เราพบข้อจำกัด ขนาดคุกกี้ของเราเพิ่มขึ้นเกินขีดจำกัด 4KB ของเบราว์เซอร์ เนื่องจากเราต้องจัดเก็บ:
- การเข้าสู่ระบบและข้อมูลเซสชันอื่น ๆ
- ID tokens สำหรับการยืนยันตัวผู้ใช้
- รีเฟรช tokens
- Access tokens ที่มีตัวระบุแหล่งข้อมูลต่าง ๆ
- องค์กร tokens ที่อยู่ใน JWT พร้อม payload หนึ่งต่อองค์กร ซึ่งอาจมีขนาดใหญ่สำหรับกรณีที่มีหลายองค์กรใช้งานพร้อมกัน
สิ่งนี้ส่งผลให้เกิดข้อผิดพลาด:
เบราว์เซอร์บังคับใช้ขีดจำกัดขนาดคุกกี้อย่างเข้มงวด โดยส่วนใหญ่จำกัดคุกกี้แต่ละตัวไว้ที่ 4KB และขนาดคุกกี้ทั้งหมดสูงสุดที่ 8KB ต่อโดเมน
จะใช้การจัดเก็บข้อมูลภายนอกดีหรือไม่?
การใช้การจัดเก็บข้อมูลภายนอก เช่น Redis หรือฐานข้อมูล จะต้องมีการตั้งค่าโครงสร้างพื้นฐานเพิ่มเติม เพิ่มทั้งค่าใช้จ่ายและความซับซ้อนสำหรับผู้ใช้ SDK ซึ่งขัดกับเป้าหมายของเราที่จะให้โซลูชันเป็นมิตรกับนักพัฒนา
แม้ว่าการเก็บในหน่วยความจำอาจเป็นทางเลือกได้ แต่ก็ไม่ทำงานได้ดีสำหรับสภาพแวดล้อมเซิร์ฟเวอร์เลส ซึ่ง instances มักเจอและหน่วยความจำไม่ได้แชร์ระหว่างคำขอ
ทางออก: การแยกคุกกี้
ทางออกง่าย ๆ คือการแ ยกคุกกี้ที่มีขนาดใหญ่เป็นชิ้นเล็ก ๆ บทความนี้แสดงวิธีการโดยใช้ Next.js เป็นตัวอย่าง: