Bỏ qua đến nội dung chính

Session và cookie là gì? Khác nhau thế nào, dùng trong Laravel

Giải thích session và cookie, bảng so sánh điểm khác nhau, vì sao session ID nằm trong cookie, các thuộc tính bảo mật và cách dùng đúng API trong Laravel.

Tan Hien
Founder
Cập nhật 5 phút đọc
Chia sẻ:
Session và cookie là gì? Khác nhau thế nào, dùng trong Laravel
Nội dung bài viết
  1. 1.Session là gì?
  2. 2.Cookie là gì?
  3. 2.1Các thuộc tính bảo mật của cookie
  4. 3.Session ID nằm trong cookie như thế nào?
  5. 4.Bảng so sánh session và cookie
  6. 5.Session trong Laravel
  7. 6.Cookie trong Laravel
  8. 6.1Kinh nghiệm từ Hozitech

Session là dữ liệu của một người dùng được lưu trên máy chủ trong suốt phiên làm việc; cookie là mẩu dữ liệu nhỏ (khoảng 4 KB) do máy chủ gửi xuống và trình duyệt lưu lại, tự gửi kèm mỗi request. Hai thứ thường đi cùng nhau: trình duyệt chỉ giữ mã session ID trong một cookie, còn nội dung session (đăng nhập, giỏ hàng) nằm trên máy chủ.

Bài viết so sánh session và cookie, giải thích cơ chế session ID, các thuộc tính bảo mật của cookie và cách làm việc với session, cookie trong Laravel bản hiện hành (Laravel 13).

Bảng so sánh session và cookie: nơi lưu, dung lượng, thời hạn, khả năng người dùng sửa và mục đích sử dụng
So sánh nhanh session và cookie trong ứng dụng web.

Session là gì?

HTTP là giao thức không lưu trạng thái: mỗi request độc lập, máy chủ không tự biết hai request đến từ cùng một người. Session giải quyết việc này bằng cách lưu thông tin người dùng (đã đăng nhập chưa, giỏ hàng có gì) ở phía máy chủ, gắn với một mã định danh ngẫu nhiên gọi là session ID.

Dữ liệu session có thể lưu trong file, database, Redis, Memcached… Session hết hạn khi người dùng không hoạt động quá thời gian cấu hình, hoặc khi ứng dụng hủy nó (ví dụ lúc đăng xuất).

Cookie là cặp tên – giá trị mà máy chủ yêu cầu trình duyệt lưu qua header Set-Cookie. Ở các request sau tới cùng tên miền, trình duyệt tự gửi lại cookie trong header Cookie. Cookie có thể có thời hạn cụ thể (cookie bền) hoặc không đặt thời hạn (cookie phiên, mất khi đóng trình duyệt). Cookie không tự mất khi người dùng "đăng xuất"; nó chỉ mất khi hết hạn, bị xóa thủ công hoặc khi ứng dụng gửi lệnh hết hạn.

Đặc tả RFC 6265 yêu cầu trình duyệt hỗ trợ ít nhất 4096 byte cho mỗi cookie, nên cookie chỉ hợp với dữ liệu nhỏ.

  • HttpOnly: JavaScript trên trang không đọc được cookie, giảm thiệt hại khi bị tấn công XSS. Cookie session nên luôn bật.
  • Secure: chỉ gửi cookie qua HTTPS.
  • SameSite (Lax, Strict, None): hạn chế gửi cookie trong request từ trang khác, góp phần chống CSRF.
  • Domain, Path, Expires/Max-Age: phạm vi và thời hạn của cookie.
  1. Lần đầu truy cập, máy chủ tạo session mới với một session ID ngẫu nhiên.
  2. Máy chủ gửi session ID xuống trình duyệt trong một cookie.
  3. Mỗi request sau, trình duyệt gửi lại cookie đó; máy chủ dùng session ID để đọc đúng dữ liệu session.
  4. Khi đăng nhập, ứng dụng nên tạo session ID mới để chống tấn công session fixation; khi đăng xuất, hủy session.

Vì vậy, ai lấy được cookie chứa session ID là có thể "mượn" phiên đăng nhập. Đây là lý do cookie session cần HttpOnly, Secure và website phải chạy HTTPS.

Tiêu chíSessionCookie
Nơi lưuMáy chủTrình duyệt
Dung lượngTùy nơi lưu (file, database, Redis)Khoảng 4 KB mỗi cookie
Thời hạnTheo thời gian không hoạt động cấu hình trên máy chủTheo Expires/Max-Age, hoặc đến khi đóng trình duyệt
Người dùng đọc, sửa đượcKhông, chỉ giữ session IDCó, trừ khi cookie được mã hóa và ký
Ảnh hưởng hiệu năngTốn tài nguyên lưu trữ phía máy chủGửi kèm mọi request, cookie lớn làm request nặng hơn
Phù hợpTrạng thái đăng nhập, giỏ hàng, thông báo flashGhi nhớ ngôn ngữ, giao diện, lựa chọn của người dùng

Session trong Laravel

Cấu hình nằm ở config/session.php và biến SESSION_DRIVER trong .env. Theo tài liệu Session của Laravel 13 (truy cập 01/10/2026), dự án mới dùng driver database; các driver khác gồm file, cookie (mã hóa), redis, memcached, dynamodb và array (dùng khi test). Session chỉ hoạt động trên route thuộc nhóm middleware web.

use Illuminate\Http\Request;

public function store(Request $request)
{
    // Lưu và đọc
    $request->session()->put('cart_id', 15);
    $cartId = $request->session()->get('cart_id', 0);

    // Helper toàn cục
    session(['locale' => 'vi']);
    $locale = session('locale', 'vi');

    // Dữ liệu chỉ tồn tại tới request kế tiếp
    $request->session()->flash('status', 'Đã lưu thành công!');

    // Xóa một khóa hoặc toàn bộ
    $request->session()->forget('cart_id');
    $request->session()->flush();
}

Sau khi đăng nhập, tạo lại session ID bằng $request->session()->regenerate(); khi đăng xuất, dùng $request->session()->invalidate() để vừa xóa dữ liệu vừa đổi ID. Starter kit và Laravel Fortify tự tạo lại session ID khi đăng nhập. Xem thêm luồng đăng nhập trong bài authentication và authorization trong Laravel.

Mọi cookie do Laravel tạo đều được mã hóa và ký bởi middleware EncryptCookies, nên người dùng không đọc hay sửa được giá trị; cookie bị sửa sẽ bị coi là không hợp lệ.

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cookie;

// Đọc cookie từ request
$theme = $request->cookie('theme');

// Gắn cookie vào response (thời hạn tính bằng phút)
return response('OK')->cookie('theme', 'dark', 60 * 24 * 30);

// Chưa có response: xếp hàng cookie, Laravel tự gắn khi gửi
Cookie::queue('theme', 'dark', 60 * 24 * 30);

// Xóa cookie
return response('OK')->withoutCookie('theme');
Cookie::expire('theme');

Lưu ý: đọc cookie dùng $request->cookie(), không phải cookie()->get(); helper cookie() chỉ tạo đối tượng cookie để gắn vào response. Nếu một cookie cần được JavaScript hoặc hệ thống khác đọc, có thể loại trừ khỏi mã hóa trong bootstrap/app.php, nhưng tài liệu Laravel khuyên không nên tắt mã hóa nói chung:

->withMiddleware(function (Middleware $middleware): void {
    $middleware->encryptCookies(except: [
        'cookie_name',
    ]);
})

Kinh nghiệm từ Hozitech

Website Hozitech chạy trên Laravel. Những lỗi session hay gặp khi đưa website Laravel lên máy chủ thật: đặt sai SESSION_DOMAIN khiến không giữ được đăng nhập, quên chạy migration bảng sessions khi dùng driver database, hoặc chạy nhiều máy chủ mà vẫn lưu session dạng file (mỗi máy một bản). Khi chạy nhiều máy chủ, nên dùng driver database hoặc Redis dùng chung. Lỗi 419 khi gửi form thường liên quan session hết hạn và token CSRF, xem bài CSRF trong Laravel. Nền tảng chung về framework có ở bài Laravel là gì.

Tan Hien

Về tác giả

Founder

Xin chào mình là Hiền hiện đang là Founder của Hozitech. Mình là kỹ sư phần mềm có hơn 9+ năm kinh nghiệm trong lĩnh vực thiết kế website, ứng dụng di động... Gần đây mình đang nghiên cứu thêm về lĩnh vực marketing. Mình rất vui khi được chia sẽ những kiến thức và kinh nghiệm của mình đến mọi người!

Câu hỏi thường gặp

Câu hỏi thường gặp

Sẵn sàng bắt đầu dự án của bạn?

Hãy để chúng tôi giúp bạn biến ý tưởng thành hiện thực. Đăng ký tư vấn miễn phí ngay hôm nay để nhận được giải pháp công nghệ tối ưu cho doanh nghiệp.