Các HTTP method phổ biến và nhóm status code cần nhớ?
GET đọc, POST tạo/xử lý, PUT thay thế toàn bộ, PATCH sửa một phần, DELETE xóa. GET/PUT/DELETE là idempotent, GET còn là safe. Status: 2xx thành công, 3xx chuyển hướng, 4xx lỗi phía client, 5xx lỗi phía server.
Cookie, localStorage và sessionStorage khác nhau thế nào?
Cookie tự gửi kèm mỗi request cùng origin/domain, có hạn dùng và cờ bảo mật (HttpOnly, Secure, SameSite), dung lượng khoảng 4KB. localStorage lưu vĩnh viễn, sessionStorage lưu theo tab; cả hai chỉ truy cập qua JS, khoảng 5MB, không tự gửi lên server.
Điều gì xảy ra khi gõ một URL vào trình duyệt và nhấn Enter?
Trình duyệt phân tích URL, tra cache rồi phân giải DNS ra IP, mở kết nối TCP (và TLS nếu HTTPS), gửi HTTP request, nhận response, parse HTML thành DOM, tải CSS/JS/ảnh phụ thuộc, tạo render tree rồi layout, paint và composite lên màn hình.
DNS phân giải tên miền như thế nào? Các loại record và TTL?
DNS chuyển tên miền thành IP: trình duyệt/OS cache, rồi recursive resolver hỏi lần lượt root, TLD (.com), authoritative nameserver và cache kết quả theo TTL. Record thường gặp: A/AAAA (IP), CNAME (alias), MX (mail), TXT, NS.
HTTPS và TLS handshake hoạt động cơ bản như thế nào?
HTTPS là HTTP chạy trên TLS, cung cấp mã hóa, toàn vẹn và xác thực server. Trong handshake, client và server thỏa thuận phiên bản/cipher, server gửi certificate để client kiểm tra chuỗi tin cậy, rồi hai bên trao đổi khóa (ECDHE) để sinh session key đối xứng mã hóa dữ liệu.
CORS là gì? Preflight request hoạt động ra sao?
Same-origin policy chặn JS đọc response cross-origin; CORS là cơ chế server dùng header Access-Control-* để cho phép. Với request không đơn giản (method khác GET/POST/HEAD, header tùy chỉnh, JSON content-type), trình duyệt gửi OPTIONS preflight trước để hỏi server có cho phép không.
HTTP caching: `Cache-Control`, `ETag` và validation hoạt động ra sao?
Cache-Control điều khiển việc cache: max-age (thời gian fresh), no-cache (phải revalidate), no-store (không lưu), public/private. Khi hết hạn, trình duyệt gửi If-None-Match với ETag; nếu không đổi server trả 304 Not Modified không kèm body.
JWT nên lưu ở đâu: localStorage hay cookie HttpOnly?
localStorage dễ bị XSS đánh cắp token. Cookie HttpOnly + Secure + SameSite thì JS không đọc được nên an toàn hơn trước XSS nhưng cần chống CSRF. Cách phổ biến: access token ngắn hạn trong bộ nhớ, refresh token trong cookie HttpOnly và có rotation.
So sánh REST, GraphQL và gRPC: khi nào chọn cái nào?
REST: dựa trên resource và HTTP, dễ cache, phổ biến. GraphQL: client chọn field cần lấy qua một endpoint, tránh over/under-fetching nhưng cache và rate limit phức tạp hơn. gRPC: Protobuf nhị phân trên HTTP/2, nhanh, có streaming, hợp giao tiếp service-to-service.
WebSocket, Server-Sent Events và long polling: khác nhau và chọn thế nào?
WebSocket là kênh song công (hai chiều) trên một kết nối TCP sau bước upgrade, hợp chat/game. SSE là luồng một chiều server tới client trên HTTP, tự reconnect, đủ cho notification/feed. Long polling là fallback đơn giản nhưng tốn tài nguyên hơn.
XSS và CSRF khác nhau thế nào? Cách phòng chống?
XSS: kẻ tấn công chèn script chạy trong trang của bạn (đánh cắp dữ liệu, thao tác thay người dùng); chống bằng escape/encode output, tránh innerHTML, CSP. CSRF: lợi dụng cookie tự gửi để khiến người dùng đã đăng nhập gửi request ngoài ý muốn; chống bằng SameSite cookie và CSRF token.
Bundler (Webpack/Vite), tree-shaking và code splitting hoạt động thế nào?
Bundler gộp module và tối ưu (minify, chia chunk). Tree-shaking loại code export không dùng, dựa vào ES Modules tĩnh và cờ sideEffects. Code splitting chia bundle thành chunk tải khi cần bằng dynamic import(). Vite dev dùng native ESM + esbuild nên khởi động nhanh, build production dùng Rollup.
Content Security Policy (CSP) là gì? Các security header quan trọng khác?
CSP là header cho trình duyệt biết nguồn nào được phép tải script, style, ảnh..., nhờ đó giảm thiệt hại của XSS (script chèn vào bị chặn nếu không khớp policy). Nên dùng nonce hoặc hash thay vì 'unsafe-inline', và thử bằng Report-Only trước khi enforce.
Critical rendering path và Core Web Vitals (LCP, INP, CLS): cách cải thiện?
Critical rendering path: DOM + CSSOM thành render tree, rồi layout, paint, composite. Core Web Vitals: LCP (tải nội dung chính, tốt dưới 2.5s), INP (phản hồi tương tác, dưới 200ms), CLS (ổn định layout, dưới 0.1). Cải thiện: giảm render-blocking, tối ưu ảnh/font, chia nhỏ JS, dành chỗ cho nội dung.
HTTP/1.1, HTTP/2 và HTTP/3 khác nhau thế nào?
HTTP/1.1 text, mỗi kết nối xử lý tuần tự (head-of-line blocking ở tầng HTTP). HTTP/2 dùng binary framing, multiplexing nhiều stream trên một kết nối TCP và nén header HPACK. HTTP/3 chạy trên QUIC (UDP) nên loại bỏ head-of-line blocking ở tầng TCP, kết nối nhanh hơn và chịu đổi mạng tốt.
Service Worker và PWA hoạt động thế nào? Các chiến lược cache?
Service Worker là script chạy nền tách khỏi trang, đứng giữa trang và mạng để chặn fetch, cache bằng Cache API, hỗ trợ offline, push và background sync. Chỉ chạy trên HTTPS (ngoại trừ localhost). PWA kết hợp Service Worker, web manifest và HTTPS để cài được như app.