HTTP_HTTPS
Hãy đi sâu vào HTTP và HTTPS trong bối cảnh bảo mật ứng dụng và Spring Security. Tôi sẽ giải thích cách HTTPS sử dụng SSL/TLS để mã hóa dữ liệu, cùng với các HTTP Header liên quan đến bảo mật như X-Frame-Options
và Content-Security-Policy
.
1. Cách HTTPS sử dụng SSL/TLS để mã hóa dữ liệu
a. HTTP vs HTTPS
HTTP (HyperText Transfer Protocol):
Là giao thức truyền dữ liệu không mã hóa (plaintext), dễ bị nghe lén (man-in-the-middle attack) hoặc giả mạo.
HTTPS (HTTP Secure):
Là HTTP chạy trên tầng mã hóa SSL/TLS, đảm bảo dữ liệu được mã hóa, toàn vẹn, và xác thực nguồn gốc.
b. SSL/TLS là gì?
SSL (Secure Sockets Layer): Giao thức mã hóa cũ, hiện đã lỗi thời.
TLS (Transport Layer Security): Phiên bản cải tiến của SSL, tiêu chuẩn hiện nay (TLS 1.2, TLS 1.3).
Vai trò:
Mã hóa: Bảo vệ dữ liệu giữa client và server.
Xác thực: Đảm bảo server là đáng tin cậy (qua chứng chỉ SSL).
Toàn vẹn: Ngăn dữ liệu bị thay đổi trong quá trình truyền.
c. Cách HTTPS sử dụng SSL/TLS
Quy trình thiết lập kết nối HTTPS (TLS Handshake) diễn ra như sau:
Client Hello:
Client (trình duyệt) gửi thông tin: phiên bản TLS hỗ trợ, danh sách cipher suites (thuật toán mã hóa), và một số ngẫu nhiên (client random).
Server Hello:
Server trả lời: phiên bản TLS được chọn, cipher suite, số ngẫu nhiên (server random), và chứng chỉ SSL (chứa public key).
Xác minh chứng chỉ:
Client kiểm tra chứng chỉ SSL của server (do Certificate Authority - CA cấp) để đảm bảo server là thật.
Trao đổi khóa:
Client tạo một pre-master secret, mã hóa bằng public key của server (lấy từ chứng chỉ), và gửi cho server.
Server giải mã pre-master secret bằng private key.
Tạo khóa phiên (session key):
Cả client và server dùng pre-master secret, client random, server random để tạo ra một session key (khóa đối xứng).
Mã hóa dữ liệu:
Từ đây, mọi dữ liệu (request/response) được mã hóa bằng session key, thường dùng thuật toán như AES.
TLS cũng thêm kiểm tra toàn vẹn (HMAC) để phát hiện nếu dữ liệu bị thay đổi.
d. Thuật toán liên quan
Asymmetric Encryption: RSA hoặc ECC để trao đổi khóa ban đầu.
Symmetric Encryption: AES để mã hóa dữ liệu sau khi thiết lập session key.
Hashing: SHA-256/SHA-384 để kiểm tra toàn vẹn.
e. Trong Spring Security
Spring Security không trực tiếp triển khai SSL/TLS (đây là trách nhiệm của web server như Tomcat, Jetty), nhưng có thể ép buộc HTTPS:
Cấu hình server (ví dụ: Tomcat) để dùng HTTPS:
Thêm chứng chỉ SSL vào file
application.properties
:
2. HTTP Headers liên quan đến bảo mật
HTTP Headers là các trường trong request/response giúp tăng cường bảo mật. Dưới đây là hai header quan trọng và cách dùng trong Spring Security:
a. X-Frame-Options
Mô tả:
Ngăn trình duyệt nhúng trang web trong
<frame>
,<iframe>
, hoặc<object>
, nhằm chống tấn công Clickjacking (kẻ tấn công lừa người dùng nhấp vào nút ẩn).
Giá trị:
DENY
: Không cho phép nhúng dưới bất kỳ hình thức nào.SAMEORIGIN
: Chỉ cho phép nhúng từ cùng nguồn (same origin).ALLOW-FROM uri
: Cho phép từ nguồn cụ thể (ít dùng, không được hỗ trợ rộng rãi).
Ví dụ tấn công Clickjacking:
Kẻ tấn công nhúng trang ngân hàng trong iframe vô hình, đặt nút giả để lừa người dùng chuyển tiền.
Trong Spring Security:
Mặc định bật với giá trị
DENY
. Có thể tùy chỉnh:Hoặc tắt nếu không cần:
b. Content-Security-Policy (CSP)
Mô tả:
Kiểm soát nguồn tài nguyên (script, style, image, v.v.) mà trang web được phép tải, nhằm giảm nguy cơ tấn công XSS (Cross-Site Scripting).
Giá trị:
default-src
: Nguồn mặc định cho tất cả tài nguyên.script-src
: Nguồn cho script.style-src
: Nguồn cho CSS.Ví dụ:
Content-Security-Policy: default-src 'self'; script-src 'self' https://trusted.com
Chỉ cho phép tải tài nguyên từ cùng domain (
'self'
) và script từhttps://trusted.com
.
Ví dụ tấn công XSS:
Kẻ tấn công chèn
<script src="evil.com/malware.js">
. CSP chặn nếu nguồn không được phép.
Trong Spring Security:
Cấu hình CSP:
Kiểm tra header trong response:
Các header bảo mật khác
Strict-Transport-Security (HSTS)
:Ép trình duyệt luôn dùng HTTPS trong tương lai.
Ví dụ:
Strict-Transport-Security: max-age=31536000; includeSubDomains
Cấu hình:
X-Content-Type-Options
:Ngăn trình duyệt đoán loại MIME (
nosniff
).Cấu hình mặc định:
X-Content-Type-Options: nosniff
.
X-XSS-Protection
:Kích hoạt bộ lọc XSS trong trình duyệt (dù đã lỗi thời ở browser mới).
Mặc định:
X-XSS-Protection: 1; mode=block
.
Cấu hình tất cả header trong Spring Security
Tóm tắt
HTTPS với SSL/TLS:
Mã hóa dữ liệu qua TLS Handshake: trao đổi khóa bất đối xứng (RSA) → mã hóa đối xứng (AES).
Spring Security hỗ trợ ép buộc HTTPS qua
requiresChannel
.
HTTP Headers bảo mật:
X-Frame-Options
: Chống Clickjacking.Content-Security-Policy
: Chống XSS.Cấu hình dễ dàng qua
HttpSecurity.headers()
.
Last updated