• cookie
  • nextjs
  • serverless

วิธีแก้ไขข้อผิดพลาดขนาดคุกกี้เกินโดยการแยกคุกกี้

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

Sijie
Sijie
Developer

ย่อสั้น ๆ: เมื่อขนาดคุกกี้ของคุณเกินขีดจำกัด 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 เป็นตัวอย่าง:

1. แยกข้อมูลเซสชัน

2. เก็บชิ้นส่วน

3. สร้างใหม่เมื่อมีคำขอ

แนวปฏิบัติที่ดีที่สุดสำหรับการใช้งาน

1. การจัดการขนาดชิ้นส่วน

2. จัดการเซสชันอย่างสะอาด

ตรวจสอบขนาดคุกกี้ทั้งหมด:

บทสรุป

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