Bỏ qua, đến nội dung

Câu hỏi thường gặp — Request Encryption ​

Cài đặt ​

Bật plugin có cần thay đổi code ứng dụng không? ​

Không. Plugin tự động đăng ký:

  • Client: Axios interceptor encode tất cả params thành __encoded__
  • Server: Koa middleware decode __encoded__ trước khi xử lý

Mọi plugin, workflow, và logic nghiệp vụ hiện có hoạt động bình thường mà không cần sửa code.

Plugin mã hóa bằng thuật toán gì? ​

Plugin sử dụng Base64 encoding (không phải mã hóa mật mã AES/RSA). Cụ thể:

BướcMô tả
1. JSON.stringify(params)Chuyển tham số thành chuỗi JSON
2. encodeURIComponent()Encode ký tự Unicode thành percent-encoding
3. btoa()Encode thành Base64

Đây là obfuscation — ngăn đọc nhanh, nhưng có thể giải mã dễ dàng. Để bảo mật thực sự, cần kết hợp với HTTPS.

Tại sao không dùng AES/RSA thay vì Base64? ​

Thiết kế cân nhắc giữa bảo mật và hiệu năng/độ phức tạp:

  • Base64 encode/decode rất nhanh (< 0.1ms)
  • Không cần quản lý key, key exchange, hay key rotation
  • Đủ cho mục đích chính: ẩn thông tin nhạy cảm khỏi URL và access log
  • HTTPS đã bảo vệ dữ liệu trên đường truyền

Sử dụng ​

API từ bên ngoài không hoạt động sau khi bật plugin? ​

API client bên ngoài có hai lựa chọn:

Cách 1: Gửi request bình thường (không encode)

Server chỉ decode khi phát hiện tham số __encoded__. Request không có __encoded__ vẫn được xử lý bình thường. Đây là cách đơn giản nhất nếu không cần ẩn query parameters.

Cách 2: Implement logic encode

Nếu muốn encode, implement hàm base64EncodeUnicode() trong ngôn ngữ tương ứng và gửi tham số qua __encoded__. Xem ví dụ code trong trang Hướng dẫn cài đặt.

Hiệu năng giảm bao nhiêu? ​

Overhead rất nhỏ — khoảng < 1ms mỗi request:

Thao tácThời gian ước tính
Encode (client)~0.1ms
Decode (server)~0.1ms
Parse JSON~0.05ms
Rebuild querystring~0.05ms

Với payload lớn (query string phức tạp, nhiều filter), thời gian có thể lên 1-2ms nhưng vẫn không đáng kể.

Plugin có mã hóa request body không? ​

Không. Plugin chỉ mã hóa query parameters (URL query string). Request body (POST, PUT, PATCH với JSON body) không bị ảnh hưởng. File upload (multipart/form-data) cũng không bị ảnh hưởng.

Plugin có mã hóa response không? ​

Không. Plugin chỉ xử lý chiều request (client → server). Response từ server về client trả về dữ liệu bình thường, không mã hóa.

Bảo mật ​

Đã có HTTPS, cần gì thêm Request Encryption? ​

HTTPS bảo vệ dữ liệu trên đường truyền (in transit). Tuy nhiên:

  • URL query string thường xuất hiện trong access log của server, proxy, CDN
  • Browser history lưu lại URL đầy đủ bao gồm query string
  • Referrer header có thể leak URL sang trang khác

Request Encryption giúp ẩn nội dung query string trong các trường hợp trên. Ví dụ: access log ghi ?__encoded__=eyJ... thay vì ?filter={"ssn":"123-45-6789"}.

Làm sao bảo vệ khi Base64 dễ giải mã? ​

Base64 encoding không phải giải pháp bảo mật mạnh — mục đích chính là obfuscation:

  • Ngăn người dùng đọc nhanh query string từ URL bar
  • Giảm rò rỉ thông tin nhạy cảm qua log, browser history, referrer
  • Ngăn proxy/CDN phân tích nội dung URL

Nếu cần bảo mật mạnh hơn, nên:

  • Luôn sử dụng HTTPS
  • Chuyển dữ liệu nhạy cảm sang request body (POST) thay vì query string
  • Cấu hình access log không ghi query string

Plugin có ảnh hưởng đến caching không? ​

Có thể. Vì query string thay đổi (từ readable sang encoded):

  • CDN cache: Key cache dựa trên URL sẽ khác → cache vẫn hoạt động bình thường
  • Browser cache: Tương tự, URL encoded là duy nhất
  • Server-side cache: Không ảnh hưởng vì middleware decode trước khi request đến handler

Lỗi thường gặp ​

Lỗi "Failed to decode base64 string" ​

Chuỗi __encoded__ không hợp lệ. Nguyên nhân:

  • Chuỗi bị cắt (URL quá dài, bị truncate bởi proxy)
  • Ký tự đặc biệt trong Base64 (+, /, =) bị encode sai bởi middleware trung gian
  • Client gửi __encoded__ rỗng hoặc sai format

Plugin sẽ log lỗi và tiếp tục xử lý request bình thường với query gốc.

Lỗi "Decoded query is not a valid object" ​

Chuỗi decoded là JSON hợp lệ nhưng không phải object (ví dụ: array, string, number). Plugin chỉ chấp nhận object ({}) làm query parameters. Log cảnh báo và dùng query gốc.

URL quá dài sau khi encode? ​

Base64 tăng kích thước khoảng 33% so với dữ liệu gốc. Nếu query string gốc đã dài (> 4000 ký tự), URL encoded có thể vượt giới hạn URL của trình duyệt hoặc server. Giải pháp:

  • Giảm số filter/parameter trong request
  • Chuyển sang POST request body cho query phức tạp
  • Tăng --max-http-header-size trên server Node.js