0
0
Lập trình
Admin Team
Admin Teamtechmely

Tìm Hiểu Về Cookies Trong Phát Triển Web: Khách Hàng & Máy Chủ

Đăng vào 6 ngày trước

• 5 phút đọc

🍪 Tìm Hiểu Về Cookies Trong Phát Triển Web: Khách Hàng & Máy Chủ

Cookies là những đoạn dữ liệu nhỏ được lưu trữ trong trình duyệt của bạn, giúp các trang web nhớ bạn là ai, duy trì phiên làm việc và cá nhân hóa trải nghiệm của bạn. Nếu bạn đã từng đăng nhập vào một trang web và vẫn được đăng nhập vào ngày hôm sau, có khả năng—cookies đã làm điều đó.

Trong bài viết này, chúng ta sẽ khám phá cookies từ cả hai góc độ khách hàng (trình duyệt/JavaScript) và máy chủ (Node.js/Express, Java Spring Boot).


📌 Mục Lục

  1. Cookies là gì?
  2. Các loại Cookies
    • Cookies phiên
    • Cookies bền
  3. Cách thức hoạt động của Cookies
  4. Quản lý Cookies phía Khách Hàng
    • Đọc cookies với JavaScript
    • Viết cookies với JavaScript
    • Hạn chế & HttpOnly
  5. Quản lý Cookies phía Máy Chủ
    • Thiết lập cookies trong Node.js/Express
    • Thiết lập cookies trong Java Spring Boot
    • Thuộc tính Secure, HttpOnly và SameSite
  6. Thực hành bảo mật Cookies tốt nhất
  7. Tại sao các trang web yêu cầu quyền truy cập Cookies
  8. Kết luận

1. Cookies là gì?

Cookie là một cặp khóa-giá trị nhỏ được lưu trữ trong trình duyệt của người dùng.
Ví dụ định dạng:

Copy
sessionId=abc123; Path=/; Expires=Wed, 30 Aug 2025 12:00:00 GMT; Secure; HttpOnly

Cookies di chuyển qua lại giữa khách hàngmáy chủ thông qua tiêu đề HTTP, khiến chúng trở nên thiết yếu cho việc duy trì phiên làm việc, cá nhân hóa và phân tích.


2. Các loại Cookies

🍪 Cookies Phiên

  • Chỉ được lưu trữ cho đến khi trình duyệt được đóng.
  • Thường được sử dụng cho các phiên tạm thời như giỏ hàng.

🍪 Cookies Bền

  • Được lưu trữ với một ngày hết hạn.
  • Ví dụ: Phiên đăng nhập “Nhớ tôi”.

3. Cách thức hoạt động của Cookies

  1. Máy chủ → Trình duyệt: Máy chủ thiết lập cookies thông qua tiêu đề Set-Cookie.
  2. Trình duyệt → Máy chủ: Trong mỗi yêu cầu tiếp theo, trình duyệt tự động đính kèm cookies vào tiêu đề Cookie.
  3. JavaScript: Cũng có thể tạo, đọc hoặc sửa đổi cookies (trừ khi bị hạn chế bằng HttpOnly).

4. Quản lý Cookies phía Khách Hàng

✅ Đọc Cookies trong JavaScript

Copy
console.log(document.cookie);
// Ví dụ đầu ra: "theme=dark; sessionId=abc123"

✅ Viết Cookies trong JavaScript

Copy
// Thiết lập một cookie hết hạn sau 7 ngày
document.cookie = "user=Zeeshan; max-age=" + 7 * 24 * 60 * 60;

⚠️ Hạn chế

  • JavaScript không thể đọc cookies HttpOnly, khiến chúng an toàn hơn.

5. Quản lý Cookies phía Máy Chủ

Trong khi JavaScript có thể quản lý cookies, máy chủ thường thiết lập cookies an toàn cho xác thực và phiên làm việc.

🍃 Ví dụ Node.js / Express

Copy
const express = require("express");
const app = express();

// Thiết lập cookie
app.get("/set-cookie", (req, res) => {
  res.cookie("sessionId", "abc123", {
    httpOnly: true,   // Không thể truy cập qua JavaScript
    secure: true,     // Chỉ gửi qua HTTPS
    maxAge: 24 * 60 * 60 * 1000 // 1 ngày
  });
  res.send("Cookie đã được thiết lập!");
});

// Đọc cookie
app.get("/get-cookie", (req, res) => {
  console.log(req.cookies);  // Cần middleware cookie-parser
  res.send(req.cookies);
});

app.listen(3000, () => console.log("Máy chủ đang chạy trên http://localhost:3000"));

☕ Ví dụ Java Spring Boot

Copy
import org.springframework.http.ResponseCookie;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import jakarta.servlet.http.HttpServletResponse;

@RestController
public class CookieController {

    @GetMapping("/set-cookie")
    public String setCookie(HttpServletResponse response) {
        ResponseCookie cookie = ResponseCookie.from("sessionId", "abc123")
                .httpOnly(true)
                .secure(true)
                .path("/")
                .maxAge(24 * 60 * 60) // 1 ngày
                .build();
        response.addHeader("Set-Cookie", cookie.toString());
        return "Cookie đã được thiết lập!";
    }

    @GetMapping("/get-cookie")
    public String getCookie(javax.servlet.http.HttpServletRequest request) {
        if (request.getCookies() != null) {
            return "Cookies: " + java.util.Arrays.toString(request.getCookies());
        }
        return "Không tìm thấy cookie nào.";
    }
}

🔐 Thuộc tính Secure, HttpOnly, và SameSite

  • Secure → Chỉ gửi qua HTTPS.
  • HttpOnly → Ẩn khỏi JavaScript (document.cookie).
  • SameSite → Ngăn chặn tấn công giả mạo yêu cầu giữa các trang (CSRF).

6. Thực hành bảo mật Cookies tốt nhất

  • Luôn thiết lập HttpOnlySecure cho cookies xác thực.
  • Sử dụng SameSite=Strict cho các ứng dụng nhạy cảm.
  • Tránh lưu trữ dữ liệu nhạy cảm (như mật khẩu) trong cookies.
  • Thay đổi và hết hạn cookies thường xuyên.

7. Tại sao các trang web yêu cầu quyền truy cập Cookies?

Do quy định về quyền riêng tư (GDPR, CCPA), các trang web phải yêu cầu sự đồng ý trước khi lưu trữ cookies theo dõi hành vi người dùng (đặc biệt là cookies quảng cáo).


8. Kết luận

Cookies là nền tảng của phiên làm việc, xác thực, và cá nhân hóa trên web.

  • Ở phía khách hàng, JavaScript có thể đọc/viết cookies cho mục đích chung.
  • Ở phía máy chủ, các framework như ExpressSpring Boot thiết lập cookies an toàn cho xác thực và quản lý trạng thái.

Bằng cách kết hợp cả hai góc độ, các nhà phát triển có thể tạo ra các ứng dụng web an toàn và thân thiện với người dùng.


Câu Hỏi Thường Gặp (FAQ)

  1. Cookie có thể lưu trữ bao nhiêu dữ liệu?
    • Mỗi cookie thường có giới hạn khoảng 4KB.
  2. Có cách nào để xóa cookie không?
    • Có thể xóa cookie bằng cách thiết lập ngày hết hạn trong quá khứ.
  3. Cookies có an toàn không?
    • Cookies có thể an toàn nếu được thiết lập với thuộc tính Secure và HttpOnly.

Thực Hành Tốt Nhất Khi Sử Dụng Cookies

  • Kiểm tra thường xuyên việc lưu trữ và quản lý cookies của bạn.
  • Đảm bảo rằng bạn đã thông báo cho người dùng về việc sử dụng cookies và lý do.

Tìm hiểu thêm:
Tham khảo tất cả các bài viết liên quan đến thiết kế hệ thống
Hastag: SystemDesignWithZeeshanAli

Git: SystemDesignWithZeeshanAli

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào