Các yêu cầu và phản hồi HTTP được gửi ở dạng văn bản gốc, nghĩa là bất kỳ ai cũng có thể đọc được chúng. HTTPS khắc phục sự cố này bằng cách sử dụng mã hóa TLS/SSL.
HTTP và HTTPS: Sự khác biệt là gì?
HTTPS là HTTP với sự mã hóa và sự xác thực. Điểm khác biệt duy nhất giữa hai giao thức là HTTPS sử dụng TLS (SSL) để mã hóa các yêu cầu và phản hồi HTTP thông thường, và để ký điển tử các yêu cầu và phản hồi đó. Và kết quả là, HTTPS bảo mật hơn HTTP. Một trang web sử dụng HTTP có http:// trong URL của nó, trong khi trang web sử dụng HTTPS có https://.
HTTP là gì?
HTTP đại diện cho Giao thức truyền siêu văn bản, và nó là một giao thức, hoặc một thứ tự và cú pháp quy định (prescribe) để trình bày thông tin - được sử dụng để truyền dữ liệu thông qua mạng. Hầu hết thông tin được gửi thông qua mạng, bao gồm nội dung trang web và lệnh gọi API, sử dụng giao thức HTTP. Có hai loại tin nhắn HTTP chính: yêu cầu và phản hồi.
Trong mô hình OSI, HTTP là một giao thức 7 lớp.
Một yêu cầu HTTP là gì? Một phản hồi HTTP là gì?
Các yêu cầu HTTP được tạo bởi trình duyệt của người dùng như một người dùng tương tác với các thuộc tính web. Ví dụ, nếu một người dùng click vào một siêu liên kết, trình duyệt sẽ gửi một loạt các yêu cầu "HTTP GET" cho nội dung sẽ xuất hiện trên trang đó. Nếu ai đó tìm kiếm trên Google "HTTP là gì?" và bài viết này hiển thị trong kết quả tìm kiếm, khi họ nhấp vào liên kết, trình duyệt của họ sẽ tạo và gửi một loạt các yêu cầu HTTP để có được các thông tin cần thiết để hiển thị trang.
Tất cả những yêu cầu HTTP này sẽ cùng đi đến máy chủ gốc hoặc máy chủ bộ nhớ đệm proxy, và máy chủ đó sẽ tạo các phản hồi HTTP. Các phản hồi HTTP là các câu trả lời cho các yêu cầu HTTP.
Một yêu cầu HTTP thông thường trông như thế nào?
Yêu cầu HTTP chỉ là một chuỗi các dòng văn bản tuân theo giao thức HTTP. Một yêu cầu GET có thể trông như thế này:
GET /hello.txt HTTP/1.1
User-Agent: curl/7.63.0 libcurl/7.63.0 OpenSSL/1.1.l zlib/1.2.11
Host: www.example.com
Accept-Language: en
Phần văn bản này do trình duyệt của người dùng tạo ra và được gửi qua Internet. Vấn đề là, nó được gửi như thế này, ở dạng văn bản rõ ràng mà bất kỳ ai theo dõi kết nối đều có thể đọc được. (Những người không quen với giao thức HTTP có thể thấy văn bản này khó hiểu nhưng bất kỳ ai có kiến thức cơ bản về các lệnh và cú pháp của giao thức đều có thể đọc nó dễ dàng.)
Đây đặc biệt là vấn đề khi người dùng gửi dữ liệu nhạy cảm qua trang web hoặc ứng dụng web. Đây có thể là mật khẩu, số thẻ tín dụng hoặc bất kỳ dữ liệu nào khác được nhập vào biểu mẫu và trong HTTP, tất cả dữ liệu này được gửi ở dạng văn bản gốc để bất kỳ ai cũng có thể đọc. (Khi người dùng gửi biểu mẫu, trình duyệt sẽ chuyển biểu mẫu này thành yêu cầu HTTP POST thay vì yêu cầu HTTP GET.)
Khi máy chủ gốc nhận được yêu cầu HTTP, nó sẽ gửi phản hồi HTTP, tương tự:
HTTP/1.1 200 OK
Date: Wed, 30 Jan 2019 12:14:39 GMT
Server: Apache
Last-Modified: Mon, 28 Jan 2019 11:17:01 GMT
Accept-Ranges: bytes
Content-Length: 12
Vary: Accept-Encoding
Content-Type: text/plain
Hello World!
Nếu một trang web sử dụng HTTP thay vì HTTPS thì bất kỳ ai đang theo dõi phiên đều có thể đọc được tất cả các yêu cầu và phản hồi. Về cơ bản, kẻ tấn công có thể chỉ cần đọc văn bản trong yêu cầu hoặc phản hồi và biết chính xác thông tin mà ai đó đang yêu cầu, gửi hoặc nhận.
HTTPS là gì?
Từ S trong HTTPS đại diện cho "secure" (bảo mật). HTTPS sử dụng TLS để mã hóa các yêu cầu và phản hồi HTTP, vì vậy trong ví dụ phía trên, thay vì thấy văn bản, kẻ tấn công sẽ thấy một chũỗi các kí tự trông có vẻ ngẫu nhiên.
Thay vì:
GET /hello.txt HTTP/1.1
User-Agent: curl/7.63.0 libcurl/7.63.0 OpenSSL/1.1.l zlib/1.2.11
Host: www.example.com
Accept-Language: en
Kẻ tấn công sẽ nhìn thấy:
t8Fw6T8UV81pQfyhDkhebbz7+oiwldr1j2gHBB3L3RFTRsQCpaSnSBZ78Vme+DpDVJPvZdZUZHpzbbcqmSW1+3xXGsERHg9YDmpYk0VVDiRvw1H5miNieJeJ/FNUjgH0BmVRWII6+T4MnDwmCMZUI/orxP3HGwYCSIvyzS3MpmmSe4iaWKCOHQ==
Trong HTTPS, TLS/SSL mã hóa các yêu cầu và phải hồi HTTP như thế nào?
TLS sử dụng một kĩ thuật được gọi là mã hóa khóa công khai: có 2 khóa, khóa công khai và khóa riêng tư, và khóa công khai được chia sẻ với các thiết vị khách hàng thông qua chứng chỉ SSL của máy chủ. Khi một khách hàng mở một kết nối tới máy chủ, hai thiết bị sử dụng khóa công khai và khóa riêng tư để đồng ý về các khóa mới, được gọi là khóa phiên, để mã hóa các thông tin liên lạc tiếp theo giữa chúng.
Tất cả các yêu cầu và phản hồi HTTP sau đó đều được mã hóa với những khóa phiên này, vì vậy bất cứ ai nghe lén thông tin liên lạc này chỉ có thấy chuỗi các kí tự ngẫu nhiên, không phải văn bản thuần túy.
HTTPS giúp xác thực máy chủ web như thế nào?
Xác thực có nghĩa là xác minh rằng một người hoặc máy có đúng là người mà họ tuyên bố hay không. Trong HTTP, không có xác minh danh tính – nó dựa trên nguyên tắc tin cậy. Các kiến trúc sư của HTTP không nhất thiết (necessarily - nhất thiết) phải đưa ra quyết định ngầm tin tưởng hoàn toàn vào tất cả các máy chủ web (implicitly - ngầm, ám chỉ); đơn giản là họ có những ưu tiên khác ngoài vấn đề an ninh vào thời điểm đó. Nhưng trên Internet hiện đại, xác thực là điều cần thiết. (essential - thiết yếu, quan trọng, thuộc về bản chât)
Giống như thẻ ID xác nhận danh tính của một người, khóa riêng xác nhận danh tính máy chủ. Khi khách hàng mở kênh bằng máy chủ gốc (ví dụ: khi người dùng điều hướng đến một trang web), (possession - chiếm hữu, quyền sở hữu, thuộc địa) việc sở hữu khóa riêng khớp với khóa chung trong chứng chỉ SSL của trang web sẽ chứng minh rằng máy chủ thực sự là máy chủ hợp pháp của trang web (legitimate - hợp pháp, chánh thống, công nhận). Điều này ngăn chặn hoặc giúp chặn một số cuộc tấn công có thể xảy ra khi không có xác thực, chẳng hạn như:
- On-path attacks: Các cuộc tấn công trên đường đi
- DNS hijacking: Chiếm quyền điều khiển DNS
- BGP hijacking: chiếm quyền điều khiển BGP
- Domain spoofing: Giả mạo tên miền
Ngoài ra, chứng chỉ SSL được ký điện tử bởi cơ quan cấp chứng chỉ đó. Điều này cung cấp xác nhận rằng máy chủ chính là người mà nó tuyên bố.