Spring MVC + Ajax example (jetty server) - 1 số hiểu lầm cơ bản về HTTP khi đi phỏng vấn

Khi tìm hiểu về giao thức HTTP mình có đọc 1 số bài hướng dẫn trả lời phỏng vấn về giao thức HTTP như:

Phương thức POST bảo mật hơn GET vì dữ liệu được gửi ngầm bằng mắt thường không thể nhìn thấy được – WTF
Phương thức GET luôn luôn nhanh hơn POST vì dữ liệu gửi đi được Browser giữ lại trong cache
Phương thức GET dữ liệu được gửi tường minh, chúng ta có thể thấy trên URL nên nó không bảo mật.
Các câu trả lời ở bên trên chưa chính xác là do bạn chưa hiểu đúng về giao thức HTTP

Trong bài hướng dẫn này mình sẽ nói đến các vấn đề sau

  1. Các khái niệm cơ bản về giao thức HTTP (GET, POST)
  2. Tạo 1 web application sử dụng Spring MVC với AJAX

Giao thức HTTP( Hyper Text Transfer Protocol) là gì ?
HTTP là giao thức quy ước chung để cho 2 đối tượng A và B có thể giao thông ( giao tiếp ) với nhau. Cụ thể là giao tiếp với nhau bằng 1 định dạng sử dụng chữ (text)

Ta đã biết phép căn bản của phần mềm là 2 phép đọc (read) và ghi (write) dữ liệu (Phần mềm viết ra là để xử lý dữ liệu) - phép ghi còn tách ra làm 3 phép thêm, sửa, xóa. Khi người ta thiết kế ra giao thức HTTP cũng xoay quanh các phép căn bản này của phần mềm. Từ 4 phép căn bản này sẽ tạo ra 7 HTTP method:

4 phép đại diện cho đọc (read):

  1. GET
  2. Trace: đọc lỗi
  3. Option
  4. Head: đọc phần header

3 phép đại diện cho ghi (write):

  1. PUT
  2. POST
  3. DELETE

Nhưng trong quá trình làm việc chúng ta gần như chỉ sử dụng 1 phép đại diện cho đọc là GET, 1 phép đại diện cho ghi là POST. Từ đây dẫn đến sự khác nhau giữa GET và POST:

  1. Ví dụ A muốn gửi 1 thông điệp (message) rằng A muốn đọc dữ liệu (GET) của B, như vậy A không cần mang dữ liệu lên B. Nhưng khi A muốn gửi (POST) 1 bức ảnh đến B, A phải mang dữ liệu lên B. Như vậy GET đại diện cho phép đọc sẽ không có phần body mà chỉ có header, còn POST đại diện cho phép ghi sẽ có phần body (đưa dữ liệu vào body)
  2. Sự khác nhau giữa cấu trúc của GET và POST sẽ ảnh hưởng đến điểm mạnh điểm yếu của POST và GET.

GET sẽ nhanh hơn POST: GET sẽ đi nhanh hơn POST trong môi trường mạng vì nó k có body. Phần server khi xử lý message này sẽ nhanh hơn vì GET chỉ có header (khi nói đến nhanh ta phải nhắc đến 2 khía cạnh: traffic và performance)
Điểm mạnh của POST là đưa được data lên. Nếu muốn đưa 1 đoạn video, 1 bức ảnh GET sẽ k thể nào làm được
=> Nhưng vì GET đi nhanh hơn nên người ta có xu hướng dùng GET nhiều hơn, thế nên những dữ liệu mà mang lên server đủ nhỏ thì người ta có thể chuyển dữ liệu theo đường GET
GET và POST đều có tính bảo mật như nhau, vì đối với GET ta có thể sử dụng kỹ thuật ajax để parametter k hiển thị lên trên url

Chi tiết bài viết bạn có thể xem tại https://viblo.asia/TungDo114/posts/OEqGj5jJM9bL

10 Likes

Cảm ơn anh ạ. Đọc thấy thấm quá, thế mà trước thầy em bảo dùng POST mới bảo mật được vì nó đóng gói dữ liệu :sweat:

1 Like

Bên khái niệm RESTful nó có nói kỹ hơn về các method cơ bản GET, POST, PUT, PATCH, DELETE. Nhưng không biết khái niệm đó ngoài áp dụng khi viết Web APIs, hổng biết có áp dụng được cho mô hình MVC hông.

2 Likes

Mình nghĩ là cũng như nhau vì đều sử dụng HTTP protocol :slight_smile:

1 Like

Thật ra HTTP protocol là 1 Stateless design nhưng khi ứng dụng vào web application người ta muốn nó giống như một Statefull design nên đã thêm vào các kỹ thuật

  • url-rewritting ( đưa parameter vào url )
  • cookies
  • session
  • local storage

Việc đưa parameter lên url không liên quan j đến tính bảo mật của GET :slight_smile:

Đây là cách SSL hoạt động
Post over SSL

q5XQP%RWCd2u#o/T9oiOyR2_YO?yo/3#tR_G7 2_RO8w?FoaObi)
oXpB_y?oO4q?[email protected]?/P/oOEQC5v?vai /%0Odo QVw#6eoGXBF_o?/u0_F!_1a0A?Q b%[email protected]/O/o/[email protected]&_o 9q1/?q$7yOAXOD5sc$HBECo1w/4?)f!%geOOF/!/#Of_f&AEI# yvv/wu_b5?/o d9O?VOVOFHwRO/pO/OSv_/8/9o6b0FGOH61O?ti /i7b?!_o8u%RS/Doai%/Be/d4$0sv_%YD2_/EOAO/C?vv/%X!T?R _o_2yoBP)orw7H_yQsXOhoVUo49itare#cA?/c)I7R?YCsg ??c' (_!(0u)o4eIis/S8Oo8_BDueC?1uUO%ooOI_o8WaoO/ [email protected]& Pw?os9Od!c?/$3bWWeIrd_?(P_C?7_g5O(ob(go?&/ooRxR’u/
T/yO3dS&??hIOB/?/OI?$oH2_?c_?OsD//0/_s%r

GET over SSL

rV/O8ow1pc?058/8OS_Qy/$7oSsU'qoo#vCbOOvt?yFo_?EYif)
43I/WOP_8oH0%3OqP_h/cBO&24?'?o_4scooPSOVWYSV?H?pV!i
?78cU!b5h’/b2coWD?/43Tu?153pI/9?R8!Od"(//O_a#t8x?
bb3D?05Dh/PrS6_/&[email protected] f $)/xvxfgO’[email protected]&e&S0rB3D/Y_/fO?
'woRbOV?!yxSOdwo1G1?8d_p?4fo81VS3sAOvO/Db/br)f4fOxt
Qs3EO/?2O/TOo_8p82FOt/hO?X_P3o"OVQO?Ww_dr"'DxHwo//P
oEfGtt/o)5RgoGqui&AXEq/oXv&//?%/6?/x_OTgOEE%v (u(?/
t7DX1O8oD?fVObiooi’8)so?o??`o"FyVOByY_ Supo? /'i?Oi"4
tr’9/o_7too7q?c2Pv

Tất cả đều được mã hóa !

POST chỉ bảo mật hơn GET khi bảo vệ bạn khỏi người vào máy tính của bạn và lục tìm history :)) của brower

3 Likes

Login dùng GET dc ko =))=))

1 Like

Việc login dùng POST hay GET còn liên quan đến nhiều vấn đề chứ không chỉ bởi tính bảo mật
Theo mình thì vẫn nên dùng POST :))

1 Like

Mình nghĩ khẳng định này không đúng bởi vì vẫn xem được request của GET, VD dùng tool như netcapture, hay nhấn F12 qua tab network thì tham số của ajax dùng GET vẫn hiện ra.

4 Likes

Đây là chút góp ý của tớ thôi, tớ không có ý chê bai tác giả bài viết này. Cậu ấy đã làm tương đối tốt rồi.

Tớ đồng ý với cậu :smile: Cậu ấy nhầm lẫn chút, khi nghĩ nếu không làm parameter của GET method hiện lên browser address bar là tính bảo mật của GET tăng lên.

Thực tế, lý do mọi người nói POST “bảo mật” hơn GET một chút, vì thông tin của GET method ở trên request url, còn của POST thì ở request body (nếu được implement chính xác). Điều này sẽ khiến cho thông tin của method GET lộ trên khắp các server log (server log chỉ log request URL, và không log request body/request header).
Đó là lý do khiến GET hơi yếu về mặt bảo mật.

Ngoài ra, tớ không nghĩ có lý khi so sánh tốc độ của method GET và method POST. Empty request body và request url lớn so với request url nhỏ và request body lớn không ảnh hưởng gì rõ rệt tới kích thước gói tin và tốc độ đường truyền. 2 request method đó nên có tốc độ ngang nhau.

See also:
Đây là bài viết gốc của cậu ấy: https://viblo.asia/p/spring-mvc-ajax-hello-world-example-kien-thuc-co-ban-http-va-ajax-OEqGj5jJM9bL

5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?