<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Cà Phê &amp; Code — Web</title>
    <link>https://coffeecode.vn/categories/web</link>
    <description>Cà Phê &amp; Code là blog dành cho những người yêu công nghệ và lập trình. Nơi chia sẻ kiến thức coding, công cụ hữu ích, xu hướng công nghệ, kinh nghiệm phát triển phần mềm và những câu chuyện phía sau màn hình — tất cả được kể theo cách gần gũi, dễ hiểu, như một cuộc trò chuyện bên tách cà phê.</description>
    <language>vi</language>
    <atom:link href="https://coffeecode.vn/categories/web/rss.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>Một request HTTP đi qua dây cáp: thực ra chỉ là text gõ đúng khuôn trên TCP</title>
      <link>https://coffeecode.vn/posts/http-01-request-tren-day-cap</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/http-01-request-tren-day-cap</guid>
      <description>Nhiều người dùng HTTP mỗi ngày qua thư viện mà chưa từng thấy một request thô trông thế nào. Sự thật đơn giản đến bất ngờ: HTTP là vài dòng text kết thúc bằng CRLF, gửi qua một socket TCP. Bài này xem thô bằng curl --trace-ascii, rồi tự gõ tay một request bằng socket Python không dùng thư viện HTTP nào — và server vẫn trả lời.</description>
      <pubDate>Tue, 22 Sep 2026 00:00:00 +0700</pubDate>
      <category>Web</category>
    </item>
    <item>
      <title>Ba header HTTP quyết định: Host, Content-Type, và Content-Length vs chunked</title>
      <link>https://coffeecode.vn/posts/http-02-header-quan-trong</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/http-02-header-quan-trong</guid>
      <description>Vì sao hàng nghìn website chung một địa chỉ IP vẫn phân biệt được nhau? Vì sao có response biết trước độ dài, có response gửi theo từng khúc? Bài này đo thật ba header cốt lõi: Host cho virtual hosting, Content-Type quyết client hiểu body thế nào, và cặp loại trừ Content-Length vs Transfer-Encoding chunked — xem tận byte khung chunk.</description>
      <pubDate>Tue, 22 Sep 2026 00:00:00 +0700</pubDate>
      <category>Web</category>
    </item>
    <item>
      <title>Mã trạng thái và redirect HTTP: 301 vs 302 vs 307/308, và bẫy đổi POST thành GET</title>
      <link>https://coffeecode.vn/posts/http-03-status-code-redirect</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/http-03-status-code-redirect</guid>
      <description>Ai cũng biết 404 và 500, nhưng khác biệt thật giữa 301 và 302, giữa 307 và 308 thì nhiều người mơ hồ. Điểm mấu chốt không chỉ là vĩnh viễn hay tạm thời — mà là có giữ nguyên phương thức POST hay không. Bài này đo thật: 301/302 âm thầm đổi POST thành GET, 307/308 giữ nguyên, và một vòng lặp redirect dừng ở đâu.</description>
      <pubDate>Tue, 22 Sep 2026 00:00:00 +0700</pubDate>
      <category>Web</category>
    </item>
    <item>
      <title>HTTP keep-alive: vì sao mở lại kết nối cho mỗi request là lãng phí — đo thật</title>
      <link>https://coffeecode.vn/posts/http-04-keep-alive</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/http-04-keep-alive</guid>
      <description>Trước khi gửi được một byte dữ liệu, mỗi kết nối mới phải trả giá: tra DNS, bắt tay TCP ba bước, rồi bắt tay TLS. Keep-alive giữ kết nối mở để tái dùng. Bài này đo thật: một handshake tốn ~69ms tới byte đầu, 6 request keep-alive dùng 1 kết nối thay vì 6, và 300 request tái dùng nhanh gấp ~19 lần so với mở mới mỗi lần.</description>
      <pubDate>Tue, 22 Sep 2026 00:00:00 +0700</pubDate>
      <category>Web</category>
    </item>
    <item>
      <title>HTTP/1.1 vs HTTP/2: multiplexing nhiều luồng trên một kết nối — đo thật</title>
      <link>https://coffeecode.vn/posts/http-05-http2</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/http-05-http2</guid>
      <description>HTTP/1.1 gửi request tuần tự trên mỗi kết nối, nên response chậm chặn hết phần sau (head-of-line blocking) — trình duyệt phải mở tới 6 kết nối để lách. HTTP/2 chia message thành frame nhị phân, đan xen nhiều luồng trên một kết nối. Bài này đo thật bằng nginx và curl: thương lượng giao thức, log server xác nhận, và multiplexing nhanh hơn khi tải nhiều tài nguyên.</description>
      <pubDate>Tue, 22 Sep 2026 00:00:00 +0700</pubDate>
      <category>Web</category>
    </item>
    <item>
      <title>Cache HTTP: Cache-Control, ETag và cú 304 Not Modified — đo thật</title>
      <link>https://coffeecode.vn/posts/http-06-cache</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/http-06-cache</guid>
      <description>Cache HTTP có hai cơ chế tách bạch mà nhiều người trộn lẫn: hết hạn (Cache-Control/max-age — client không hỏi server chút nào) và xác thực lại (ETag/Last-Modified — client hỏi còn mới không, server đáp 304 nếu chưa đổi). Bài này đo thật bằng nginx và curl: một request có điều kiện trả 304 không body, và ETag đổi khi nội dung đổi.</description>
      <pubDate>Tue, 22 Sep 2026 00:00:00 +0700</pubDate>
      <category>Web</category>
    </item>
    <item>
      <title>Cookie và session: cách web nhớ bạn, và ba thuộc tính chặn tấn công</title>
      <link>https://coffeecode.vn/posts/http-07-cookie-session</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/http-07-cookie-session</guid>
      <description>HTTP không có trạng thái — mỗi request độc lập, server không tự biết ai gửi. Cookie là cách vá: server gửi Set-Cookie, client tự gửi lại ở mọi request sau. Bài này đo thật luồng session bằng curl, và mổ ba thuộc tính bảo mật sống còn: HttpOnly chống XSS trộm cookie, Secure buộc HTTPS, SameSite chống CSRF.</description>
      <pubDate>Tue, 22 Sep 2026 00:00:00 +0700</pubDate>
      <category>Web</category>
    </item>
    <item>
      <title>Nén nội dung HTTP: gzip vs brotli vs zstd — đo tỉ lệ nén thật</title>
      <link>https://coffeecode.vn/posts/http-08-nen-noi-dung</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/http-08-nen-noi-dung</guid>
      <description>Một trang HTML 224 KB có thể xuống còn 16 KB trên đường truyền mà người dùng không hề hay biết. Cơ chế: client mời (Accept-Encoding), server chọn (Content-Encoding), nén trong suốt hai đầu. Bài này đo thật tỉ lệ nén của gzip, brotli, zstd trên một trang HTML thật, và xem nginx thương lượng nén qua HTTP.</description>
      <pubDate>Tue, 22 Sep 2026 00:00:00 +0700</pubDate>
      <category>Web</category>
    </item>
    <item>
      <title>TLS handshake từng bước: xem tận mắt bằng openssl s_client</title>
      <link>https://coffeecode.vn/posts/http-09-tls-handshake</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/http-09-tls-handshake</guid>
      <description>Trước khi một byte HTTPS chạy, client và server làm một cuộc bắt tay TLS: thỏa thuận phiên bản, chọn cipher, trao khóa tạm, và server chứng minh danh tính bằng chứng chỉ. Bài này dùng openssl s_client -msg để xem từng handshake message thật của TLS 1.3 (ClientHello, ServerHello, Certificate, Finished), so TLS 1.3 với 1.2, và đọc chuỗi chứng chỉ.</description>
      <pubDate>Tue, 22 Sep 2026 00:00:00 +0700</pubDate>
      <category>Web</category>
    </item>
    <item>
      <title>Chứng chỉ X.509 và chuỗi tin cậy: vì sao trình duyệt tin server — tự dựng CA để hiểu</title>
      <link>https://coffeecode.vn/posts/http-10-chung-chi-x509</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/http-10-chung-chi-x509</guid>
      <description>Cái ổ khóa xanh trên trình duyệt dựa trên một chuỗi tin cậy: cert của site được một CA ký, CA đó lại được CA gốc ký, và trình duyệt chỉ tin sẵn vài CA gốc. Bài này tự dựng một CA rồi ký cert cho web.local bằng openssl, đọc cấu trúc cert (subject, issuer, SAN, hạn), và chứng minh xác thực chuỗi thành công với CA đúng, thất bại với CA sai.</description>
      <pubDate>Tue, 22 Sep 2026 00:00:00 +0700</pubDate>
      <category>Web</category>
    </item>
    <item>
      <title>Nginx reverse proxy: một cửa trước nhiều backend — đo round-robin và X-Forwarded</title>
      <link>https://coffeecode.vn/posts/http-11-nginx-reverse-proxy</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/http-11-nginx-reverse-proxy</guid>
      <description>Reverse proxy đứng trước các server, thay mặt chúng trả lời client: cân bằng tải, kết thúc TLS, gom nhiều service sau một tên miền. Bài này dựng nginx proxy tới 3 backend, đo round-robin chia đúng 10/10/10 trên 30 request, và giải thích vì sao thiếu header X-Forwarded-* làm backend thấy sai IP và giao thức của client.</description>
      <pubDate>Tue, 22 Sep 2026 00:00:00 +0700</pubDate>
      <category>Web</category>
    </item>
    <item>
      <title>Nginx phục vụ tĩnh và tối ưu hiệu năng: sendfile, cache, và đo bằng ab</title>
      <link>https://coffeecode.vn/posts/http-12-nginx-tinh-hieu-nang</link>
      <guid isPermaLink="true">https://coffeecode.vn/posts/http-12-nginx-tinh-hieu-nang</guid>
      <description>Nginx phục vụ file tĩnh nhanh đến mức nào? Bài cuối sê-ri đo thật: sendfile (zero-copy) cho thông lượng ~281 MB/s và 4301 request/giây trên file 68KB, Cache-Control để trình duyệt khỏi tải lại, gzip nén 156 KB xuống 1.2 KB. Kèm một cái bẫy đo lường: ab mặc định HTTP/1.0 nên không nhận gzip — phải đo tỉ lệ nén bằng curl.</description>
      <pubDate>Tue, 22 Sep 2026 00:00:00 +0700</pubDate>
      <category>Web</category>
    </item>
  </channel>
</rss>
