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ậthiệ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