ความลับและ API key: กับดักคีย์ที่ถูกเปิดเผย
ความลับ () คือสิ่งใดก็ตามที่ให้สิทธิ์เข้าถึง เช่น (Application Programming Interface) key รหัสผ่านฐานข้อมูล โทเคนของผู้ให้บริการชำระเงิน คีย์สำหรับเซ็นชื่อดิจิทัล ความผิดพลาดที่พบบ่อยที่สุด — และแพงที่สุด — ของการทำ vibe coding คือการทำความลับรั่วไหล
มีกับดักสองแบบที่ดักคนไว้อยู่เสมอ:
- ความลับในโค้ดฝั่งไคลเอนต์ อะไรก็ตามที่อยู่ใน ของคุณ (JavaScript ที่ทำงานในเบราว์เซอร์) ถือว่า เปิดเผยต่อสาธารณะ ผู้ใช้สามารถเปิด dev tools แล้วอ่านมันได้ AI เมื่อถูกขอให้เรียก API จากคอมโพเนนต์ React มันจะยินดีวาง secret key ของคุณตรงนั้นเลย — และตอนนี้ใครก็ตามที่เข้าเว็บไซต์ของคุณก็สามารถคัดลอกมันไปใช้จนบิลคุณพุ่งได้ Secret key ควรอยู่ที่ฝั่งเซิร์ฟเวอร์เท่านั้น ไม่ใช่ในโค้ดที่ถูกส่งไปยังเบราว์เซอร์
- ความลับในรีโพ คีย์ที่ถูกฝังตายตัวในไฟล์จะถูก เข้า แม้ว่าคุณจะลบมันในภายหลัง มันก็ยังคงอยู่ในประวัติของ git ตลอดไป และบอตต่าง ๆ ก็สแกนหารีโพสาธารณะเพื่อหาสิ่งนี้ภายในไม่กี่นาทีหลังจาก push
บ้านที่ปลอดภัยสำหรับความลับคือ — ค่าที่ถูกส่งให้แอปตอนรันไทม์ โดยไม่อยู่ในโค้ดเลย:
// VULNERABLE: key is in the source, will be committed to git
const stripe = new Stripe("sk_live_51H8xQ2eZvK...");
// SAFE: key is read from the environment, never written in code
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);
ความลับมีบ้านที่ปลอดภัยเพียงที่เดียวเท่านั้น — ฝั่งเซิร์ฟเวอร์ ที่อ่านมาจาก environment เบราว์เซอร์คือพื้นที่สาธารณะ อะไรก็ตามที่ถูกส่งไปที่นั่นสามารถถูกอ่านได้โดยใครก็ตามที่เปิด dev tools
┌──────────────────────────────────────────┐
│ .env (gitignored, never committed) │
│ STRIPE_SECRET_KEY=sk_live_... │
└───────────────────┬──────────────────────┘
│ injected at runtime
▼
┌──────────────────────┐ ┌──────────────────────┐
│ SERVER │ │ BROWSER (client) │
│ process.env.KEY ✓ │ ✗──────│ anyone can read │
│ calls Stripe here │ NEVER │ dev tools · "view │
│ │ send │ source" · network │
└──────────────────────┘ here └──────────────────────┘
safe: stays private public: = leaked
เพิ่ม .env (และ .env.local ฯลฯ) เข้าไปใน .gitignore ของคุณ ก่อน ที่จะเขียนความลับสักตัวเดียว ถ้าคีย์ตัวใดตกไปอยู่ในโค้ดหรือประวัติของคุณ ให้ถือว่ามันถูกเผาแล้ว: หมุนมันใหม่ (rotate — สร้างตัวใหม่และเพิกถอนตัวเก่า) เพราะแค่ลบบรรทัดนั้นไม่พอ เนื่องจากคีย์เก่ายังคงใช้งานได้และยังอยู่ข้างนอกนั่น