Tại sao tiêu đề Set-Cookie đặt thành công nhưng trình duyệt không lưu Cookie của tôi?
Đây là vấn đề phổ biến nhất, trình duyệt sẽ không chủ động báo lỗi mà lặng lẽ loại bỏ Cookie không tuân thủ. Các lý do phổ biến bao gồm: SameSite=None thiếu Secure, Cookie Secure được đặt trên trang HTTP (ngoại trừ localhost), tiền tố __Host-/__Secure- không đáp ứng ràng buộc, Domain/Path không khớp, vượt quá giới hạn kích thước 4KB, Max-Age bằng 0 hoặc số âm. Khuyến nghị trước tiên dán Set-Cookie vào công cụ này, xem huy hiệu cảnh báo để xác định nguyên nhân cụ thể, sau đó mở Chrome DevTools → Application → Cookies, xem dưới tên miền tương ứng có tam giác cảnh báo màu vàng không, di chuột có thể thấy lý do từ chối cụ thể.
Sự khác biệt thực sự giữa Strict, Lax, None của SameSite là gì? Khi nào sử dụng cái nào?
Strict hoàn toàn không cho phép gửi chéo trang, an toàn nhất nhưng người dùng nhấp vào từ liên kết ngoài sẽ hiển thị chưa đăng nhập, phù hợp với Cookie cho các thao tác nhạy cảm như thanh toán/đổi mật khẩu. Lax là giá trị mặc định của Chrome 80+, cho phép mang theo khi điều hướng quay lại thông qua điều hướng GET cấp cao nhất (nhấp liên kết ngoài quay lại trang web của bạn), nhưng không mang theo trong các tài nguyên con như iframe/img/script/XHR/biểu mẫu POST, là giá trị khuyến nghị cho hầu hết các kịch bản. None cho phép gửi trong tất cả các kịch bản chéo trang (dùng cho đăng nhập một lần SSO, nhúng iframe bên thứ ba, gọi API chéo trang), nhưng phải đặt cùng lúc Secure, nếu không trình duyệt sẽ từ chối trực tiếp.
Tại sao SameSite=None phải kết hợp với Secure?
Đây là quy tắc được Chrome thực thi bắt buộc từ phiên bản 80 (tháng 2 năm 2020), Firefox, Edge, Safari cũng đã theo kịp. Bởi vì SameSite=None rõ ràng cho phép gửi Cookie chéo trang, kẻ tấn công dễ dàng hơn trong việc thực hiện tấn công CSRF hoặc nghe lén trong kịch bản chéo trang, phải kết hợp với Secure (truyền mã hóa HTTPS) để giảm rủi ro. Nếu Cookie SameSite=None của bạn được đặt dưới HTTP, trình duyệt sẽ loại bỏ trực tiếp mà không lưu trữ. Công cụ này sẽ phát hiện tổ hợp SameSite=None thiếu Secure và cảnh báo màu đỏ.
Sử dụng Max-Age hay Expires? Sự khác biệt là gì?
Ưu tiên sử dụng Max-Age. Max-Age là thời gian tương đối (hết hạn sau bao nhiêu giây), không phụ thuộc vào đồng hồ máy khách, trình duyệt bắt đầu đếm ngược sau khi nhận được; Expires là thời điểm tuyệt đối, phụ thuộc vào thời gian cục bộ của máy tính người dùng (người dùng đổi đồng hồ thành 1970 thì Cookie hết hạn ngay lập tức). Khi cả hai cùng tồn tại, Max-Age có ưu tiên cao hơn (RFC 6265 quy định rõ ràng). Nếu cả hai không được đặt, Cookie trở thành「Cookie phiên」, hết hiệu lực khi trình duyệt đóng. Công cụ này sẽ đưa ra gợi ý cho trường hợp đã đặt Expires nhưng không đặt Max-Age, khuyến nghị bổ sung Max-Age. Lưu ý đơn vị Max-Age là giây không phải mili giây.
Sự khác biệt giữa Path=/ và không đặt Path là gì?
Path quyết định trình duyệt sẽ mang theo Cookie này trong các yêu cầu của đường dẫn URL nào. Khi không đặt Path, trình duyệt mặc định sử dụng「đường dẫn sau khi loại bỏ đoạn cuối cùng của URL phản hồi」, ví dụ đặt Cookie từ /api/user/login, Path mặc định là /api/user/, thì yêu cầu dưới đường dẫn / và /order/ sẽ không mang theo Cookie này. Đặt rõ ràng Path=/ có thể làm cho Cookie có hiệu lực đối với toàn bộ trang web. Lưu ý khớp Path là khớp tiền tố, Path=/api cũng sẽ khớp với /api/, /api/user, /api/v2/abc, v.v. Cookie tiền tố __Host- bắt buộc yêu cầu Path=/.
Sự khác biệt giữa Domain bắt đầu bằng dấu chấm (ví dụ .example.com) và không có dấu chấm là gì?
Trong các trình duyệt hiện đại (phiên bản gần đây của Chrome, Firefox, Edge, Safari), cả hai đã tương đương, đều làm cho Cookie có hiệu lực đối với example.com và tất cả các miền con của nó (a.example.com, b.c.example.com). Dấu chấm ở đầu là cách viết cũ từ thời RFC 2109, RFC 6265 đã quy định rõ ràng bỏ qua dấu chấm ở đầu. Tuy nhiên, để dễ đọc, khuyến nghị viết dạng không có dấu chấm. Công cụ này sẽ đưa ra gợi ý cho trường hợp Domain có dấu chấm ở đầu (không phải lỗi, nhưng là cách viết lịch sử). Lưu ý: Khi không đặt Domain, Cookie chỉ có hiệu lực đối với máy chủ hiện tại (miền con không mang theo), sau khi đặt Domain sẽ có hiệu lực đối với miền con.
Tiền tố __Host- và __Secure- là gì? Có thể không viết tiền tố không?
Đây là tiền tố bảo mật tên Cookie được giới thiệu bởi RFC 6265bis, dùng để thêm ràng buộc cứng cho Cookie bảo mật cao: khi trình duyệt thấy tên Cookie bắt đầu bằng __Host-, sẽ bắt buộc yêu cầu phải đồng thời đặt Secure, Path=/, không được đặt Domain, một trong các điều kiện không đáp ứng sẽ từ chối lưu trữ trực tiếp; tiền tố __Secure- yêu cầu phải đặt Secure, các thuộc tính khác có thể cấu hình. Không viết tiền tố cũng có thể hoạt động (hầu hết Cookie không sử dụng tiền tố), nhưng đối với Cookie bảo mật cao như định danh phiên, Token ủy quyền, rất khuyến nghị sử dụng tiền tố __Host-, vì nó có thể ngăn chặn tấn công tiêm Cookie ở cấp miền con/đường dẫn. Công cụ này sẽ tự động kiểm tra tính tuân thủ của hai loại tiền tố.
HttpOnly Cookie có thực sự an toàn không? Ngăn chặn XSS và CSRF không?
HttpOnly có thể ngăn JavaScript đọc giá trị Cookie thông qua document.cookie, là tuyến phòng thủ quan trọng để <strong>giảm thiểu đánh cắp phiên XSS</strong>, nhưng không phải vạn năng: kẻ tấn công XSS vẫn có thể gửi yêu cầu (yêu cầu tự động mang theo Cookie) trong trình duyệt người dùng để thực hiện thao tác (đây là phạm vi CSRF); HttpOnly cũng không thể phòng thủ tấn công CSRF (cần kết hợp SameSite hoặc CSRF Token). Chỉ khi sử dụng đồng thời bộ ba HttpOnly+Secure+SameSite=Lax/Strict mới đạt được mức bảo mật cơ bản. Cookie nhạy cảm (session, JWT, access_token) phải là HttpOnly, không cần thiết không cho JS phía trước đọc. Công cụ này sẽ cảnh báo Cookie thiếu HttpOnly.
Partitioned (CHIPS) Cookie là gì? Khi nào cần sử dụng?
Partitioned là thuộc tính mới được Chrome giới thiệu để đối phó với việc loại bỏ Cookie bên thứ ba, tên đầy đủ là Cookies Having Independent Partitioned State (CHIPS). Cookie bên thứ ba truyền thống (ví dụ Cookie được đặt bởi dịch vụ quảng cáo/nhúng trên nhiều trang web) được chia sẻ toàn cục, sẽ được sử dụng để theo dõi người dùng chéo trang. Sau khi thêm Partitioned, trình duyệt sẽ lưu trữ riêng biệt Cookie bên thứ ba đó theo trang web cấp cao nhất: Cookie bên thứ ba người dùng thấy trên trang A và trang B hoàn toàn độc lập, không thể chia sẻ danh tính chéo trang. Kịch bản sử dụng: thành phần video/bản đồ/thanh toán nhúng, plugin dịch vụ khách hàng bên thứ ba, nhúng iframe SSO chéo trang. Sử dụng Partitioned phải đặt cùng lúc Secure, khuyến nghị kết hợp với tiền tố __Host-.
Một Cookie tối đa có thể lưu trữ bao nhiêu? Mỗi tên miền có thể đặt bao nhiêu?
Theo RFC 6265, trình duyệt ít nhất hỗ trợ 4096 byte cho mỗi Cookie (bao gồm tên, giá trị và thuộc tính), các trình duyệt chính (Chrome/Firefox/Safari/Edge) đều thực hiện theo giới hạn này, phần vượt quá sẽ bị cắt ngắn hoặc loại bỏ im lặng. Giới hạn số lượng khác nhau tùy trình duyệt: Chrome khoảng 180 mỗi tên miền, Firefox khoảng 150, Safari khoảng 600 (và bị ảnh hưởng bởi chính sách dọn dẹp bảy ngày ITP), sau khi vượt quá trình duyệt sẽ loại bỏ Cookie cũ nhất theo chiến lược LRU. Khuyến nghị Cookie chỉ lưu trữ định danh phiên, không đặt đoạn dữ liệu nghiệp vụ lớn vào Cookie (dữ liệu nghiệp vụ đặt vào localStorage hoặc Session máy chủ).
Có hỗ trợ sao chép Set-Cookie trực tiếp từ Chrome DevTools để phân tích không? Cần xóa tiền tố thủ công không?
Hoàn toàn hỗ trợ, không cần xử lý thủ công. Bạn có thể trong Chrome DevTools → bảng Network nhấp vào yêu cầu mục tiêu, sao chép trực tiếp giá trị Set-Cookie bằng cách nhấp chuột phải trong vùng Response Headers (khi nhiều dòng, Ctrl/⌘+nhấp để chọn nhiều hoặc sao chép toàn bộ đoạn), dán vào vùng nhập công cụ này là được. Công cụ sẽ tự động loại bỏ tiền tố Set-Cookie: ở đầu mỗi dòng (không phân biệt chữ hoa chữ thường), tự động xử lý khoảng trắng đầu dòng cuối dòng, xử lý chính xác các ký tự đặc biệt như dấu phẩy, dấu chấm phẩy chứa trong ngày Expires, cũng có thể xử lý chính xác giá trị Cookie có dấu ngoặc kép.
Tại sao ký tự không phải ASCII hoặc ký tự đặc biệt trong giá trị Cookie lại trở thành dạng %XX?
RFC 6265 yêu cầu giá trị Cookie chỉ có thể sử dụng một tập con an toàn trong bộ ký tự ASCII, không thể trực tiếp chứa ký tự không phải ASCII, khoảng trắng, dấu phẩy, dấu chấm phẩy, v.v. Nhiều framework phía máy chủ khi đặt Cookie sẽ tự động thực hiện mã hóa URL (encodeURIComponent/Percent-encoding) cho các ký tự không phải ASCII, ví dụ chuỗi tiếng Việt có dấu sẽ được mã hóa thành dạng %XX. Trình duyệt cũng giữ dạng mã hóa khi gửi lại. Khi công cụ này phát hiện giá trị chứa mã hóa %XX, sẽ tự động hiển thị văn bản gốc sau giải mã decodeURIComponent bằng mũi tên màu xanh lá bên cạnh giá trị gốc, thuận tiện cho bạn xem nội dung thực.
Sự khác biệt giữa Set-Cookie và tiêu đề yêu cầu Cookie là gì?
Hai tiêu đề này hoàn toàn khác hướng: Set-Cookie là tiêu đề phản hồi (máy chủ → trình duyệt), chỉ xuất hiện trong phản hồi, có thể xuất hiện nhiều lần, mỗi lần đặt một Cookie, chứa đầy đủ thuộc tính (Secure/HttpOnly/Path/Domain, v.v.); Cookie là tiêu đề yêu cầu (trình duyệt → máy chủ), mỗi yêu cầu chỉ xuất hiện một lần, bên trong là các cặp name=value phẳng của tất cả Cookie hiện tại khớp phạm vi (name1=v1; name2=v2), hoàn toàn không chứa thông tin thuộc tính. Nghĩa là máy chủ không thể biết từ yêu cầu xem một Cookie có đặt HttpOnly hay Secure không, thông tin thuộc tính chỉ được trình duyệt lưu giữ cục bộ. Để phân tích tiêu đề yêu cầu Cookie, vui lòng sử dụng <a href='/network/http-cookie-parser/'>Trình phân tích tiêu đề yêu cầu Cookie</a> đi kèm.
Tại sao Cookie của tôi trong Safari biến mất sau vài ngày?
Đây là cơ chế ngăn chặn theo dõi thông minh (ITP: Intelligent Tracking Prevention) của Safari hoạt động. Từ ITP 2.1, nếu người dùng không tương tác trực tiếp với tên miền đó trong 7 ngày (tức là không truy cập trực tiếp trang web của tên miền đó), Safari sẽ dọn dẹp tất cả Cookie và dữ liệu trang web dưới tên miền đó, bất kể Max-Age/Expires đặt bao lâu. Điều này ảnh hưởng lớn nhất đến các dịch vụ nhúng bên thứ ba, đối với Cookie trang chính không bị ảnh hưởng khi người dùng truy cập liên tục. Ngoài ra, Safari cũng hạn chế Cookie bên thứ ba nghiêm ngặt hơn Chrome. Các giải pháp bao gồm: sử dụng thuộc tính Partitioned, yêu cầu quyền thông qua Storage Access API, hoặc làm mới lại Cookie khi người dùng truy cập trang chính. Chương khắc phục sự cố của công cụ này có hướng dẫn gỡ lỗi Safari chi tiết hơn.
Công cụ có hỗ trợ phân tích hàng loạt nhiều Set-Cookie không? Có tải nội dung Cookie lên máy chủ không?
Hỗ trợ phân tích hàng loạt. Vùng nhập hỗ trợ dán bất kỳ nhiều dòng Set-Cookie nào (ví dụ dán một lần toàn bộ đoạn tiêu đề phản hồi), mỗi Set-Cookie sẽ được phân tích với số thứ tự độc lập, nhiều thẻ thuộc tính hiển thị riêng biệt thuộc tính và cảnh báo của từng cái. Tất cả quá trình phân tích hoàn toàn được hoàn thành cục bộ trong trình duyệt của bạn (xử lý JavaScript phía trước thuần túy), nội dung Cookie không được tải lên bất kỳ máy chủ nào, cũng không gửi yêu cầu mạng, thông tin nhạy cảm như Session/Token bạn dán sẽ không rời khỏi máy tính của bạn, có thể yên tâm sử dụng.