FixVibe

// docs / baas security / clerk hardening

Clerk security checklist: 20 ข้อ

Clerk จัดการ auth, session และ organization สำหรับแอปของคุณ — ซึ่งหมายความว่าการ integrate Clerk ที่ตั้งค่าผิดคือการ bypass auth, vector session-fixation หรือเส้นทางการรั่วไหล org checklist นี้คือ audit 20 ข้อข้าม key, การตั้งค่า session, webhook, organization, JWT template และการ monitor ต่อเนื่อง เครื่องมือ AI Coding เชื่อมต่อ Clerk อย่างรวดเร็วด้วยค่าเริ่มต้นที่สมเหตุสมผล; รายการนี้จับรายการที่พวกมันทิ้งไว้

สำหรับเบื้องหลังว่าทำไมการตั้งค่าผิดชั้น auth จึงเป็นจุดอ่อนของ AI tool โปรดดู ทำไมเครื่องมือ AI Coding ทิ้งช่องโหว่ด้านความปลอดภัย สำหรับ checklist คู่ขนานบน Auth0 โปรดดู Auth0 security checklist

Environment key และ allowlist ของ origin

Clerk ออก key สองตัวที่แตกต่างกันต่อโปรเจกต์ การผสมหรือการรั่วไหลของพวกมันเป็นโหมดความล้มเหลวแรก

  1. ใช้ publishable key (pk_live_* ใน production, pk_test_* ใน dev) ในเบราว์เซอร์; ใช้ secret key (sk_live_* / sk_test_*) บนเซิร์ฟเวอร์เท่านั้น publishable key ปลอดภัยใน NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY; secret key ต้องไม่มี prefix env สาธารณะและต้องไม่ปรากฏใน client component
  2. ตรวจสอบว่าแอป production ใช้ pk_live_* ไม่ใช่ pk_test_* Instance ทดสอบอนุญาตอีเมลที่ไม่ได้ยืนยันและปิด MFA — การปล่อย test mode ไป production เป็นการ bypass auth
  3. ตั้งค่า origin ที่อนุญาตใน Clerk Dashboard Settings → Domains → Allowed origins ต้องระบุโดเมน production ของคุณอย่างแน่นอน รายการ origin ที่ว่างหรือใช้ wildcard ให้ผู้โจมตีสร้าง Clerk frontend ปลอมที่คุยกับ backend ของคุณได้
  4. หมุน secret key เมื่อมีการลาออกหรือสงสัยว่ารั่วไหล Dashboard → API Keys → Reset key เก่าถูก invalidate; redeploy โค้ดฝั่งเซิร์ฟเวอร์ด้วยค่าใหม่ก่อนหมุน

การตั้งค่า session

การหมดอายุของ session และ idle timeout คือความแตกต่างระหว่าง session ที่ถูกขโมยเป็นเหตุการณ์ 10 นาทีและเหตุการณ์ 30 วัน

  1. ตั้งค่า session inactivity timeout เป็น 30 นาทีหรือน้อยกว่าสำหรับแอป SaaS ที่จัดการข้อมูลละเอียดอ่อน Dashboard → Sessions → Inactivity timeout แอประดับธนาคารควรใช้ 5-10 นาที; SaaS มาตรฐาน 30-60 นาที; แอปผู้บริโภค 1-7 วัน ค่าเริ่มต้นคือ 7 วัน
  2. เปิดใช้การ revoke session เมื่อเปลี่ยน password, เปลี่ยนอีเมล และการลงทะเบียน MFA Dashboard → Sessions → Revoke on นี่คือเหตุการณ์ความปลอดภัยที่ผู้ใช้ริเริ่ม; session ที่มีอยู่บนอุปกรณ์อื่นควรถูกฆ่า
  3. ตรวจสอบ session ฝั่งเซิร์ฟเวอร์ในทุก protected route ไม่ใช่แค่ตอนเข้าสู่ระบบ ใน Next.js: const { userId } = await auth(); ใน server component / API route อ่าน JWT จาก cookie และ validate มัน ไม่เคยเชื่อใจการตรวจสอบเฉพาะ cookie
  4. ตั้งค่า SameSite=Lax (ค่าเริ่มต้น) หรือ Strict บน session cookie ตรวจสอบใน DevTools → Application → Cookies SameSite=None เป็น vector CSRF — ห้ามใช้เว้นแต่คุณได้กำหนดการตั้งค่า auth ข้ามโดเมนอย่างชัดเจน

การตรวจสอบ webhook

Clerk webhook ยิงในเหตุการณ์ lifecycle ของผู้ใช้ (created, updated, deleted, session.ended) เป็นกลไกการ sync สำหรับฐานข้อมูลของคุณ — และ webhook ปลอมเป็น primitive การเขียนฐานข้อมูล

  1. ตรวจสอบ signature Svix บนทุก webhook Clerk webhook ถูกเซ็นโดย Svix ใช้ new Webhook(secret).verify(body, headers) ปฏิเสธด้วย 401 หากการตรวจสอบล้มเหลว
  2. เก็บ webhook secret ใน environment variable ไม่ใช่ในโค้ด secret หมุนในการ regenerate Dashboard แต่ละครั้ง — deploy ของคุณต้องอ่านจาก env ไม่ใช่จากค่าคงที่
  3. Idempotency ในทุก handler การส่ง webhook สามารถซ้ำได้ ใช้ header svix-id เป็น primary key ในตาราง webhook_events เพื่อ dedupe ห่อ state change และการ insert idempotency ใน transaction เดียวกัน
  4. เมื่อ user.deleted ลบหรือทำให้ PII anonymous ภายใน 24 ชั่วโมง GDPR / CCPA ต้องการสิ่งนี้ Audit เส้นทางการลบ: ตารางใดถือข้อมูลของผู้ใช้นี้? ใช้ FK ON DELETE CASCADE ที่ที่ทำได้

Organization และสิทธิ์

หากคุณใช้ Clerk Organization ขอบเขต org คือการแยก tenant ทุก query ฝั่งเซิร์ฟเวอร์ต้องกรองด้วยมัน

  1. ในทุก API route อ่านทั้ง userId และ orgId จาก auth() และกรอง query ฐานข้อมูลด้วยทั้งสอง WHERE org_id = $orgId AND user_id = $userId ไม่เคยเชื่อใจ org_id จาก request body
  2. <strong>Use Clerk role checks for privileged operations, not boolean checks against the user object.</strong> <code>has({ role: 'org:admin' })</code> reads the role from the verified JWT. A user can spoof a boolean on a stale client object; they cannot spoof a JWT claim.
  3. ทดสอบการแยก org ข้ามกับบัญชี org จริงสอง สร้าง Org A, เพิ่มข้อมูล, เข้าสู่ระบบ Org B ในเบราว์เซอร์อื่น พยายามอ่านข้อมูลของ Org A ผ่าน API response ต้องเป็น 403 หรือ 404

JWT template และการ integrate ภายนอก

JWT template ผลัก identity ของ Clerk ไปยัง Supabase, Firebase และ service downstream อื่น ๆ template ที่ตั้งค่าผิดเปิดเผย claim มากเกินไปหรือเปิดเผยข้อมูลที่คุณไม่ได้ตั้งใจ

  1. สำหรับ JWT template แต่ละตัว list claim ทุกตัวและยืนยันว่าจำเป็น Dashboard → JWT Templates template ที่ส่ง email และ phone ไปยัง Supabase เปิดเผย PII ให้กับใครก็ตามที่อ่าน JWT ในเบราว์เซอร์
  2. ตั้งค่าหมดอายุสั้นบน JWT template ที่ใช้สำหรับการเรียก downstream ฝั่ง client 60 วินาทีสำหรับ API request downstream เป็นมาตรฐาน JWT ที่อายุยืนถูกขโมยและ replay
  3. ตรวจสอบ audience (aud) claim ฝั่งผู้รับ Supabase, Firebase ฯลฯ ควรตรวจสอบว่า aud ตรงกับ service identifier ที่คาดหวัง หากไม่มีสิ่งนี้ JWT ที่ออกสำหรับ service A สามารถ authenticate กับ service B

การ monitor operational

Auth คือแหล่ง log สัญญาณสูงสุดที่คุณมี ดูมัน

  1. แจ้งเตือนเมื่อมีการเข้าสู่ระบบล้มเหลวเพิ่มขึ้นต่อ IP / ต่อบัญชี อัตราความล้มเหลว 50 เท่าปกติเป็นการโจมตี credential stuffing Clerk ปล่อยเหตุการณ์เหล่านี้ไปยัง webhook; route ไปยัง SIEM ของคุณ
  2. รีวิวการเลื่อนไหลของการตั้งค่า session และ instance รายไตรมาส ค่าเริ่มต้นเปลี่ยนแปลงเมื่อ Clerk อัปเดต; "การตั้งค่าเก่า" กลายเป็นผิดอย่างเงียบ ๆ เมื่อเวลาผ่านไป Diff JSON export ของ Dashboard กับสำเนา last-known-good ล่าสุด

ขั้นตอนถัดไป

รัน FixVibe scan กับ URL production ของคุณ — check baas.clerk-auth0 แจ้ง publishable key ของ Clerk, test key ใน production และ secret key ที่ bundled สำหรับ checklist ที่เทียบเท่าบน Auth0 โปรดดู Auth0 security checklist สำหรับมุมมองภาพรวมข้าม BaaS provider อ่าน BaaS misconfiguration scanner

// สแกนพื้นผิว baas ของคุณ

ค้นหาตารางที่เปิดอยู่ก่อนที่คนอื่นจะพบ

ใส่ URL production ของคุณ FixVibe จะระบุผู้ให้บริการ BaaS ที่แอปของคุณติดต่อด้วย, ทำ fingerprint endpoint สาธารณะของพวกเขา และรายงานสิ่งที่ client ที่ไม่ได้ผ่านการ authenticate สามารถอ่านหรือเขียนได้ ฟรี ไม่ต้องติดตั้ง ไม่ต้องใช้บัตร

  • ระดับฟรี — 3 scans ต่อเดือน ไม่ต้องใช้บัตรในการสมัคร
  • การทำ fingerprint BaaS แบบ passive — ไม่ต้องยืนยันโดเมน
  • Supabase, Firebase, Clerk, Auth0, Appwrite และอื่นๆ
  • AI fix prompt ในทุก finding — วางกลับเข้าไปใน Cursor / Claude Code
เริ่มสแกน BaaS ฟรี

ไม่ต้องสมัครสมาชิก

Clerk security checklist: 20 ข้อ — Docs · FixVibe