🛑 1. The Problem First: "ประตูบานเดียวที่ไม่มีใครเฝ้า"
ลองดูการจัดระบบ Security แบบจูเนียร์ที่คิดว่า "มี JWT = ปลอดภัย":
// ❌ Naive Approach: เชื่อใจ JWT โดยไม่ตรวจสอบคอขวดอื่น
app.get("/api/user-data", verifyToken, async (req, res) => {
const data = await db.query(`SELECT * FROM users WHERE id = ${req.query.id}`); // 🌋 SQL Injection!
res.json(data);
});
ปัญหา: การมีระบบ Login (Authentication) เป็นเพียงแค่ "ประตูหน้า" แต่ถ้าข้างในบ้านคุณไม่ได้ล็อคตู้เซฟ หรือมีช่องโหว่ให้คนปีนเข้าทางหน้าต่าง (SQL Injection, XSS, CSRF) ปราสาทของคุณก็ล่มสลายได้อยู่ดี Senior มอง Security เป็น "ความรับผิดชอบแบบองค์รวม" (Holistic Responsibility) ไม่ใช่แค่การเขียนโค้ดตรวจสอบ Token ครับ
💡 2. Real-Life Analogy: ระบบธนาคาร vs กล่องกุญแจหน้าบ้าน
ลองนึกภาพว่า Security ของระบบคุณคือ "การป้องกันธนาคาร".
- Authentication (AuthN): เหมือนการเช็ค "บัตรประชาชน" (คุณคือใคร?)
- Authorization (AuthZ): เหมือนการเช็ค "สิทธิ์ในการเข้าห้องนิรภัย" (คุณเป็นลูกค้าทั่วไปหรือผู้จัดการ?)
- SQL Injection: เหมือนการที่เราเขียนข้อความสั่ง "โอนเงินเข้าบัญชีฉัน" ลงบน ใบนำฝาก แล้วพนักงานดันทำตามที่เขียน แทนที่จะดูแค่ตัวเลข (AI/Code ทำงานตามคำสั่งที่แอบใส่มาในข้อมูล)
- Zero Trust Architecture: เหมือนนโยบายที่ว่า "ไม่ว่าใครจะอยู่ในธนาคาร ต่อให้เป็นพนักงาน ก็ต้องตรวจบัตรทุกครั้งที่ข้ามไปแต่ละห้อง" (ห้ามเชื่อใจใครเด็ดขาด แม้แต่ Service ภายในกันเอง)
🚀 3. Execution Journey: 5 ด่านป้องกันระดับ Senior
Senior จะใช้หลักการ "Defense in Depth" (การป้องกันหลายชั้น)
🛠 Step-by-step:
- Safety Layers: ใช้ Helmet.js เพื่อตั้งค่า HTTP Headers ที่เป็นมาตรฐาน (HSTS, Content Security Policy)
- Input Sanitization: ห้ามต่อ String ใน SQL เด็ดขาด! ให้ใช้ Parameterize Query หรือ ORM เสมอ
- Rate Limiting: ติดตั้งเครื่องตรวจจับการยิงรัวๆ เพื่อป้องกัน Brute Force และ DoS Attack
- Secret Management: ห้ามใส่ Password ในไฟล์
.envที่ขึ้น GitHub ให้ใช้ Secret Vault (เช่น AWS Secrets Manager หรือ HashiCorp Vault) - Least Privilege: กำหนดสิทธิ์ให้ Database User ทำได้แค่เฉพาะที่ต้องทำ (เช่น ห้าม Drop Table ได้)
// ✅ Best Practice: ป้องกัน SQL Injection และการใช้ Prepared Statements
const userId = req.query.id;
// 🛠 ใช้ Parameter แทนการต่อ String ตรงๆ
const user = await db.execute("SELECT * FROM users WHERE id = ?", [userId]);
🪤 4. The Junior Trap: ความประมาทใน "Internal Trust"
จูเนียร์มักจะปล่อยเซิร์ฟเวอร์ภายใน (Internal Service) ให้คุยกันได้โดยไม่ต้องมี Token:
# ❌ Junior Trap: Service A คุยกับ Service B ได้เลยเพราะ "อยู่ใน Network เดียวกัน"
# 🌋 ภัยพิบัติ! ถ้า Hacker เจาะเข้า Service A ได้เพียงที่เดียว
# เขาจะสามารถเข้าถึงฐานข้อมูลลูกค้าทั้งหมดใน Service B ได้ทันทีโดยไม่ต้องผ่านด่านตรวจ
ระวัง: 80% ของการโจมตีสำเร็จเกิดขึ้นจากภายใน (Lateral Movement) ✅ การแก้ไข: ใช้ mTLS (Mutual TLS) หรือตรวจสอบ Token ทุกครั้งระหว่าง Microservices แม้จะคุยกันหลังบ้านก็ตาม
⚖️ 5. The Why Matrix: เลือกท่าป้องกันที่คุ้มค่า
| ประเภทความเสี่ยง | วิธีป้องกัน (The Senior Way) | ความสำคัญ |
|---|---|---|
| SQL Injection | Parameterized Queries | 🚨 ฉุกเฉิน |
| XSS (Script) | Content Security Policy (CSP) | สูง |
| Brute Force | Rate Limiting + MFA | สูง |
| Data Leak | Encryption at Rest & in Transit | สูง |
| Stolen Token | Refresh Tokens + Short-lived Access | ปานกลาง |
🎓 6. Senior Mindset Summary
การเป็น Senior คือการยอมรับว่า "ไม่มีระบบไหนที่ปลอดภัย 100% แต่เราสามารถทำให้มัน 'ยากเกินกว่าที่ Hacker จะคุ้มค่าที่จะแฮก' ได้". ความปลอดภัยไม่ใช่ฟีเจอร์ที่เราจะมาทำตอนท้ายโปรเจกต์ แต่มันคือวัฒนธรรม (Culture) ที่ต้องแทรกอยู่ในทุุกบรรทัดของโค้ดที่เขียนครับ!
Mission Accomplished
You've reached the end of this module. Time to apply these senior mindsets to your real-world projects!