Same-origin, CORS, CSRF, XSS và CSP
Browser security là tập hợp các boundary khác nhau: origin quyết định script access, cookie policy quyết định credential gửi đi, CORS quyết định response đọc được và CSP giảm khả năng script độc chạy.
HttpOnly chặn đọc cookie nhưng không ngăn script gửi request authenticated.1. Origin model
Origin = scheme + host + port. Same-origin policy hạn chế script đọc/tương tác cross-origin, nhưng browser vẫn có thể gửi nhiều request hoặc embed resource. Site/eTLD+1 khác origin và quan trọng khi phân tích SameSite cookie; đừng dùng “cùng domain” như từ đồng nghĩa “same-origin”.
https://app.example.com:443
scheme host port
https app.example.com 443
2. CORS là browser read opt-in
Server opt-in cho browser script đọc response qua Access-Control-Allow-Origin. Non-simple request thường có preflight OPTIONS. Credentialed request cần origin cụ thể, Access-Control-Allow-Credentials: true và Vary: Origin; wildcard không được dùng cùng credentials.
- Preflight chain phải được route/auth đúng; không giả định browser sẽ gửi cookie như request chính.
- CORS không chặn server-to-server attacker, curl hay mobile app gọi endpoint.
- Allow-list origin theo environment; không phản chiếu arbitrary
Origin.
3. CSRF và cookie credentials
CSRF xảy ra khi attacker khiến browser của victim gửi state-changing request với cookie tự động. Dùng synchronizer token hoặc double-submit, SameSite phù hợp, Origin/Referer checks và cấm side effect qua GET. XSS có thể đọc DOM hoặc gửi request trong origin nên có thể vượt nhiều CSRF controls.
| Control | Giảm rủi ro | Giới hạn |
|---|---|---|
| SameSite | Giảm cross-site cookie send | Không thay thế authorization/encoding; có flow hợp lệ cần cross-site |
| CSRF token | Binding request với session | Phải giữ secret và tránh leak qua URL/log |
| Origin/Referer | Reject cross-site state change | Header có thể vắng mặt trong một số client/privacy mode |
4. XSS và output context
Stored, reflected và DOM XSS chạy script trong origin của ứng dụng. Dùng auto-escaping template, context-sensitive output encoding, safe DOM APIs, sanitizer cho rich HTML và tránh eval/innerHTML không tin cậy. HttpOnly giảm token theft nhưng script vẫn có thể gọi API trong session.
// unsafe: attacker-controlled string becomes HTML
element.innerHTML = userInput;
// safer: text context
element.textContent = userInput;
5. CSP và security headers
Content-Security-Policy giới hạn script/style/connect/frame sources. Nonce/hash kết hợp strict-dynamic thường mạnh hơn allow-list host. Bắt đầu bằng Report-Only, thu violation telemetry rồi enforce; CSP là defense-in-depth, không thay encoding và sanitizer.
frame-ancestors/X-Frame-Optionsgiảm clickjacking.nosniff, Referrer-Policy và Permissions-Policy giảm unintended exposure.- HSTS chỉ bật sau khi HTTPS đúng toàn domain/subdomain strategy; preload là cam kết vận hành dài hạn.
6. Cookies, storage và browser architecture
Secure yêu cầu HTTPS; HttpOnly chặn JS đọc; SameSite=Lax/Strict/None điều khiển cross-site send; prefix __Host- tăng constraints. localStorage dễ bị XSS lấy token và không có expiry tự động. BFF/session cookie thường giảm access-token exposure trong SPA nhưng đưa state/CSRF/scale vào backend.