
Chào các bạn Gen Z mê code, tôi là Creyt đây! Hôm nay chúng ta sẽ cùng “mổ xẻ” một công cụ nhỏ nhưng có võ, đóng vai trò như một “thư ký chuyên nghiệp” trong thế giới Node.js của chúng ta: cookie-parser.
1. cookie-parser là gì và để làm gì? (Theo phong cách Gen Z)
À mà này, các bạn có nhớ những mẩu giấy nhớ nhỏ xíu mà crush hay gửi gắm không? Kiểu như “Hôm nay ăn gì?” hay “Nhớ ôn bài nhé!” chẳng hạn. Mỗi lần nhận được, bạn phải tự tay bóc ra, đọc từng chữ, rồi sắp xếp vào một chỗ để dễ nhớ đúng không?
Trong thế giới lập trình web, Cookie chính là những “mẩu giấy nhớ” mà trình duyệt (browser) để lại trên máy tính của người dùng và gửi ngược lại cho server mỗi khi họ ghé thăm một trang web nào đó. Những mẩu giấy này chứa thông tin quan trọng như: bạn là ai (ID session), bạn thích ngôn ngữ gì, bạn đã thêm gì vào giỏ hàng…
Vấn đề là, khi những “mẩu giấy nhớ” này (cookie) được trình duyệt gửi lên server qua HTTP request, chúng thường ở dạng một chuỗi văn bản “rối rắm” trong phần header, kiểu như Cookie: name=Creyt; course=Nodejs; level=master.
Đấy, nhìn là thấy “nhức cái đầu” rồi đúng không? Bạn phải tự ngồi cắt chuỗi, phân tích từng cặp key-value một cách thủ công. Mất thời gian, dễ lỗi, và không “chill” chút nào!
cookie-parser chính là “thư ký” siêu năng lực của chúng ta! Nhiệm vụ của nó là tự động lấy cái chuỗi cookie “rối rắm” kia, “giải mã” và biến nó thành một object JavaScript siêu dễ dùng ({ name: 'Creyt', course: 'Nodejs', level: 'master' }). Object này sẽ được gắn vào đối tượng req của Express, cụ thể là req.cookies hoặc req.signedCookies.
Nói cách khác, nó biến “rác” thành “vàng” (dữ liệu có cấu trúc) cho server của bạn, giúp bạn đọc và sử dụng cookie một cách “ngon lành cành đào” mà không cần phải động tay vào việc phân tích chuỗi lằng nhằng.
2. Code Ví Dụ Minh Họa Rõ Ràng
Để bắt đầu, bạn cần cài đặt express và cookie-parser:
npm install express cookie-parser
Sau đó, đây là cách bạn sử dụng nó trong ứng dụng Express của mình:
const express = require('express');
const cookieParser = require('cookie-parser'); // Import cookie-parser
const app = express();
const port = 3000;
// --- Cấu hình cookie-parser ---
// Nếu không cần signed cookies, chỉ cần dùng app.use(cookieParser());
// Nếu dùng signed cookies, cần cung cấp một secret key. Key này phải đủ mạnh và giữ bí mật!
const SECRET_KEY = 'day_la_mot_secret_key_sieu_bi_mat_cua_creyt_day_nha';
app.use(cookieParser(SECRET_KEY));
// Route để set (tạo) cookie
app.get('/set-cookie', (req, res) => {
// Set một cookie thông thường
res.cookie('username', 'CreytGenz', { maxAge: 900000, httpOnly: true });
// Set một signed cookie (đã ký)
// Signed cookie giúp kiểm tra xem cookie có bị thay đổi bởi client hay không.
// Tuy nhiên, nó vẫn có thể bị đọc được.
res.cookie('userId', '12345', {
maxAge: 900000,
httpOnly: true,
signed: true // Đánh dấu đây là signed cookie
});
res.send('Cookie đã được set! Mở DevTools -> Application -> Cookies để kiểm tra.');
});
// Route để đọc cookie
app.get('/get-cookie', (req, res) => {
// req.cookies chứa các cookie KHÔNG được ký (unsigned cookies)
console.log('Unsigned Cookies:', req.cookies);
// req.signedCookies chứa các cookie ĐÃ được ký (signed cookies)
// Nếu signed cookie bị chỉnh sửa ở client, giá trị sẽ là false/undefined
console.log('Signed Cookies:', req.signedCookies);
let responseText = '<h2>Cookie bạn đã gửi lên:</h2>';
responseText += '<h3>Unsigned Cookies:</h3><pre>' + JSON.stringify(req.cookies, null, 2) + '</pre>';
responseText += '<h3>Signed Cookies:</h3><pre>' + JSON.stringify(req.signedCookies, null, 2) + '</pre>';
res.send(responseText);
});
// Route kiểm tra cookie bị thay đổi
app.get('/check-signed-cookie', (req, res) => {
const userId = req.signedCookies.userId;
if (userId) {
res.send(`Chào mừng User ID: ${userId} (Cookie hợp lệ)!`);
} else {
res.send('Cookie userId không hợp lệ hoặc đã bị chỉnh sửa!');
}
});
app.listen(port, () => {
console.log(`Server đang chạy tại http://localhost:${port}`);
console.log('Truy cập http://localhost:3000/set-cookie để tạo cookie.');
console.log('Sau đó truy cập http://localhost:3000/get-cookie để đọc cookie.');
console.log('Thử sửa cookie userId trong DevTools rồi truy cập /check-signed-cookie để xem điều gì xảy ra!');
});
Cách thử nghiệm:
- Chạy file Node.js trên.
- Mở trình duyệt, truy cập
http://localhost:3000/set-cookie. Bạn sẽ thấy thông báo cookie đã được set. - Mở DevTools (F12) -> tab
Application-> mụcCookies. Bạn sẽ thấyusernamevàuserId. - Truy cập
http://localhost:3000/get-cookie. Bạn sẽ thấy server đã đọc được cả unsigned và signed cookies. - Thử thách: Trong DevTools, click vào cookie
userId, sửa giá trị của nó (ví dụ từs%3A12345.xxxxthànhs%3A99999.xxxx). Sau đó truy cậphttp://localhost:3000/check-signed-cookie. Bạn sẽ thấy server báo “Cookie userId không hợp lệ hoặc đã bị chỉnh sửa!” vìcookie-parserđã phát hiện ra chữ ký không khớp!

3. Mẹo (Best Practices) để ghi nhớ hoặc dùng thực tế
- Luôn dùng
httpOnly: true: Đây là “kim bài” chống lại tấn công XSS (Cross-Site Scripting). Nó ngăn chặn JavaScript phía client đọc hoặc truy cập cookie của bạn. Giống như bạn cất nhật ký vào két sắt mà không ai ngoài bạn có chìa khóa vậy. - Luôn dùng
secure: true: Đảm bảo cookie chỉ được gửi qua kết nối HTTPS (kết nối bảo mật). Nếu trang web của bạn dùng HTTPS, hãy bật cái này lên. Nó giống như việc bạn chỉ gửi thư tình qua đường bưu điện bảo mật, không qua đường công cộng dễ bị đọc trộm. - Dùng
signed: truecho dữ liệu quan trọng: Như ví dụ trên, signed cookie giúp server phát hiện liệu cookie có bị chỉnh sửa bởi người dùng hay không. Nhưng nhớ, signed cookie chỉ kiểm tra tính toàn vẹn (integrity), không phải tính bảo mật (confidentiality). Kẻ gian vẫn có thể đọc được giá trị cookie đã ký. Đừng lưu mật khẩu hay thông tin cực kỳ nhạy cảm vào đây! SECRET_KEYphải là bí mật của riêng bạn! Không chia sẻ, không hardcode trong code production, mà nên lấy từ biến môi trường (environment variables). Key này càng phức tạp càng tốt, giống như mật khẩu ngân hàng vậy.- Không lưu thông tin nhạy cảm trực tiếp vào Cookie: Thay vào đó, hãy lưu một ID session duy nhất vào cookie, rồi dùng ID đó để truy xuất thông tin nhạy cảm từ một session store an toàn trên server (ví dụ: Redis, MongoDB). Cookie dễ bị tấn công CSRF, XSS nếu không cẩn thận.
- Cẩn thận với
maxAgevàexpires: Đây là thời gian sống của cookie. Đặt quá dài có thể gây rủi ro bảo mật, đặt quá ngắn thì người dùng lại phải đăng nhập lại liên tục. Cân nhắc kỹ cho từng trường hợp.
4. Ứng dụng thực tế các website/ứng dụng đã dùng
Hầu hết mọi ứng dụng web hiện đại đều dùng cookie và dĩ nhiên là phải có một cơ chế để đọc chúng:
- Ghi nhớ đăng nhập (Remember Me): Khi bạn tick “Ghi nhớ đăng nhập” trên Facebook, Google, hay bất kỳ trang nào, server sẽ gửi một cookie chứa session ID hoặc refresh token xuống trình duyệt. Lần sau, khi bạn quay lại, trình duyệt gửi cookie này lên, và
cookie-parsersẽ giúp server đọc nó để biết bạn là ai mà không cần đăng nhập lại. - Giỏ hàng điện tử: Các trang thương mại điện tử như Tiki, Shopee thường dùng cookie để lưu trữ ID giỏ hàng của bạn. Khi bạn thêm sản phẩm vào giỏ, server sẽ lưu thông tin giỏ hàng vào database và gửi một cookie chứa ID giỏ hàng đó xuống. Lần sau, bạn quay lại, server đọc ID cookie để hiển thị giỏ hàng của bạn.
- Cá nhân hóa trải nghiệm: Lưu trữ tùy chọn ngôn ngữ, theme (sáng/tối), hoặc các thiết lập giao diện người dùng khác của bạn để mỗi khi bạn truy cập lại, trang web đã sẵn sàng với những gì bạn thích.
- Theo dõi hành vi người dùng: Các nền tảng quảng cáo hoặc phân tích (như Google Analytics) dùng cookie để theo dõi lượt truy cập, trang bạn đã xem, thời gian bạn ở lại… (nhưng nhớ là phải tuân thủ các quy định về quyền riêng tư như GDPR/CCPA nhé).
5. Thử nghiệm đã từng và hướng dẫn nên dùng cho case nào
Với kinh nghiệm của Creyt, cookie-parser là một trong những middleware thiết yếu mà bạn sẽ dùng trong hầu hết mọi ứng dụng Node.js/Express có tương tác với cookie. Nó giải quyết một vấn đề cơ bản: làm sao để đọc dữ liệu từ cookie một cách dễ dàng và an toàn?
Nên dùng cho các trường hợp:
- Quản lý Session: Khi bạn xây dựng hệ thống đăng nhập/đăng ký, bạn sẽ cần cookie để lưu trữ Session ID.
cookie-parserlà bước đầu tiên để server có thể đọc được Session ID đó và xác định người dùng. - Lưu trữ tùy chọn người dùng: Ngôn ngữ, theme, cài đặt hiển thị… những thứ mà người dùng muốn được giữ lại giữa các lần truy cập.
- Tích hợp với các dịch vụ bên thứ ba: Một số API hoặc dịch vụ có thể gửi cookie xuống trình duyệt và bạn cần server đọc lại chúng để xử lý.
Không nên dùng khi:
- Bạn cần lưu trữ lượng lớn dữ liệu (cookie có giới hạn kích thước, thường là 4KB mỗi domain). Lúc này, nên dùng Session Store hoặc Local Storage/IndexedDB ở phía client.
- Bạn cần bảo mật tuyệt đối cho dữ liệu. Cookie, dù có signed hay httpOnly, vẫn không phải là nơi an toàn nhất để lưu trữ thông tin cực kỳ nhạy cảm. Luôn dùng session store trên server cho những dữ liệu đó.
Hy vọng với bài giảng này, các bạn đã hiểu rõ hơn về cookie-parser và biết cách biến những “mẩu giấy nhớ” của trình duyệt thành dữ liệu có ích cho ứng dụng của mình. Nhớ nhé, code hay là phải thực tế và an toàn!
Thuộc Series: Nodejs
Bài giảng này được tự động xuất bản ngẫu nhiên từ thư viện kiến thức. Đừng quên đón xem các Từ khoá Hướng Dẫn tiếp theo nhé!