</>
⌕
Senior #jwt#session#security#cors#helmet#sql-injection

JWT vs session và bảo mật API Node.js (CORS, helmet, rate limit, SQL injection)

⚡ Trả lời nhanh

Session lưu state ở server (dễ thu hồi, cần store chung như Redis); JWT tự chứa claim, stateless nhưng khó thu hồi trước hạn. Bảo mật cơ bản: cookie httpOnly/secure/sameSite, CORS whitelist, helmet đặt header, rate limit chống brute force, parameterized query chống SQL injection.

SessionJWT
StateServer giữ (Redis/DB)Token tự chứa, server chỉ verify chữ ký
Thu hồiXóa session là xongKhó: cần blacklist hoặc token ngắn hạn + refresh token
ScaleCần store dùng chungKhông cần store
Kích thướcCookie chỉ chứa idToken lớn hơn, gửi mỗi request

Payload JWT chỉ được mã hóa base64 (ai cũng đọc được), không chứa dữ liệu nhạy cảm. Luôn kiểm tra thuật toán, exp, iss. Lưu token trong cookie httpOnly; Secure; SameSite để giảm rủi ro XSS đánh cắp.

app.use(helmet());                                   // header bảo mật (CSP, HSTS...)
app.use(cors({ origin: ["https://app.example.com"], credentials: true }));
app.use(rateLimit({ windowMs: 60_000, limit: 100 })); // express-rate-limit

// SQL injection: tham số hóa, không nối chuỗi
await db.query("SELECT * FROM users WHERE email = $1", [email]);
🃏 Ôn bằng flashcard