Express.js là một framework web tối giản và linh hoạt cho Node.js, được thiết kế để xây dựng các ứng dụng web và API. Một trong những yếu tố quan trọng trong việc phát triển ứng dụng web là quản lý cookies. Cookies là các tệp nhỏ được lưu trữ trên trình duyệt của người dùng, giúp lưu trữ thông tin và theo dõi trạng thái phiên làm việc. Bài viết này sẽ hướng dẫn chi tiết về cách quản lý cookies trong Express.js, từ cơ bản đến nâng cao, bao gồm các thực hành tốt nhất để bảo mật và tối ưu hóa trải nghiệm người dùng.
Cookies là gì?
Cookies là những tệp văn bản nhỏ được lưu trữ trên máy tính của người dùng bởi trình duyệt khi họ truy cập một trang web. Chúng được sử dụng để lưu trữ thông tin như tùy chọn người dùng, thông tin đăng nhập, và theo dõi hành vi duyệt web. Có nhiều loại cookies, bao gồm:
- Session Cookies: Chỉ tồn tại trong phiên làm việc của trình duyệt và sẽ bị xóa khi đóng trình duyệt.
- Persistent Cookies: Tồn tại sau khi phiên làm việc kết thúc, có thể được cấu hình để hết hạn sau một khoảng thời gian nhất định.
- Secure Cookies: Chỉ được truyền qua các kết nối HTTPS an toàn.
- HttpOnly Cookies: Không thể truy cập thông qua JavaScript, giúp bảo vệ khỏi các cuộc tấn công XSS (Cross-Site Scripting).
Thiết lập môi trường làm việc với Express.js
- Cài đặt Express.js: Đầu tiên, bạn cần cài đặt Node.js và npm (Node Package Manager) nếu chưa có. Sau đó, tạo một thư mục dự án mới và khởi tạo dự án bằng cách chạy:
npm init -y npm install express
- Thiết lập dự án: Tạo một tệp
app.js
và cấu hình một ứng dụng Express.js cơ bản:
const express = require('express'); const app = express(); const port = 3000; app.get('/', (req, res) => { res.send('Hello World!'); }); app.listen(port, () => { console.log(`Example app listening at http://localhost:${port}`); });
- Cài đặt middleware cho cookies: Để quản lý cookies, bạn cần cài đặt middleware
cookie-parser
:
npm install cookie-parser
Sau đó, sử dụng middleware này trong ứng dụng của bạn:
const cookieParser = require('cookie-parser'); app.use(cookieParser());
Tạo và đọc cookies trong Express.js
Tạo cookies:
Mô tả: Bạn có thể tạo cookies bằng cách sử dụng phương thức res.cookie()
.
Ví dụ:
app.get('/set-cookie', (req, res) => { res.cookie('username', 'JohnDoe', { maxAge: 900000, httpOnly: true }); res.send('Cookie is set'); });
Đọc cookies:
Mô tả: Cookies có thể được truy cập thông qua đối tượng req.cookies
.
Ví dụ:
app.get('/get-cookie', (req, res) => { let username = req.cookies['username']; res.send(`Username is: ${username}`); });
Cập nhật và xóa cookies
Cập nhật cookies:
Mô tả: Cập nhật cookies cũng giống như tạo cookies, chỉ cần đặt lại giá trị mới.
Ví dụ:
app.get('/update-cookie', (req, res) => { res.cookie('username', 'JaneDoe', { maxAge: 900000, httpOnly: true }); res.send('Cookie is updated'); });
Xóa cookies:
Mô tả: Sử dụng phương thức res.clearCookie()
để xóa cookies.
Ví dụ:
app.get('/clear-cookie', (req, res) => { res.clearCookie('username'); res.send('Cookie is cleared'); });
Bảo mật cookies
HttpOnly và Secure Cookies:
Mô tả: Thiết lập HttpOnly
để cookies không thể truy cập thông qua JavaScript và Secure
để chỉ truyền qua HTTPS.
Ví dụ:
res.cookie('session', '1a2b3c4d', { httpOnly: true, secure: true });
SameSite Attribute:
Mô tả: Thuộc tính SameSite
giúp ngăn chặn các cuộc tấn công CSRF (Cross-Site Request Forgery) bằng cách hạn chế cách cookies được gửi.
Ví dụ:
res.cookie('session', '1a2b3c4d', { sameSite: 'strict' });
Ví dụ tốt nhất trong quản lý cookies
Bảo mật và quyền riêng tư:
- Mô tả: Luôn sử dụng
HttpOnly
,Secure
, vàSameSite
để bảo vệ cookies. Không lưu trữ thông tin nhạy cảm trực tiếp trong cookies. - Ví dụ: Sử dụng mã hóa hoặc token hóa cho các thông tin nhạy cảm.
Quản lý tuổi thọ của cookies:
- Mô tả: Đặt thời gian sống hợp lý cho cookies, tránh lưu trữ cookies quá lâu để giảm nguy cơ bị đánh cắp.
- Ví dụ:
javascript res.cookie('shortLivedCookie', 'value', { maxAge: 3600000 }); // 1 giờ
Ứng dụng thực tế:
Ví dụ 1: Quản lý phiên đăng nhập người dùng. Một ứng dụng web sử dụng cookies để lưu trữ mã phiên làm việc (session ID), giúp theo dõi trạng thái đăng nhập của người dùng.
app.post('/login', (req, res) => { // Sau khi xác thực người dùng res.cookie('sessionID', 'abc123', { httpOnly: true, secure: true }); res.send('User is logged in'); });
Ví dụ 2: Lưu trữ tùy chọn cá nhân hóa. Một ứng dụng lưu trữ thông tin về giao diện người dùng, như chủ đề màu sắc, trong cookies.
app.post('/set-theme', (req, res) => { const theme = req.body.theme; res.cookie('theme', theme, { maxAge: 2592000000 }); // 30 ngày res.send('Theme is set'); });
Kết luận
Quản lý cookies đúng cách trong Express.js không chỉ giúp cải thiện trải nghiệm người dùng mà còn đảm bảo an toàn và bảo mật cho ứng dụng. Bằng cách áp dụng các thực hành tốt nhất và hiểu rõ cách sử dụng cookies, bạn có thể phát triển các ứng dụng web mạnh mẽ và an toàn. Hãy luôn chú trọng đến bảo mật và tuân thủ các quy tắc về quyền riêng tư khi xử lý cookies.
Tham khảo