+1

Hiểu về xác thực: Client, API, Model, and Database Layers

1. Validate Client (Frontend Validation)

  • Mục đích: Kiểm tra và ngăn chặn dữ liệu không hợp lệ trước khi gửi đến server.
  • Công cụ thường dùng:
    • HTML5: Các thuộc tính như required, maxlength, pattern, min, max.
    • JavaScript: Viết mã để kiểm tra các logic phức tạp hơn.
    • Thư viện: React Hook Form, Formik, VeeValidate (Vue.js).
  • Ví dụ:
    <form>
      <input type="text" name="username" required pattern="[a-zA-Z0-9]+" maxlength="20">
      <input type="email" name="email" required>
      <button type="submit">Submit</button>
    </form>
    
  • Ưu điểm:
    • Trải nghiệm người dùng tốt hơn với phản hồi nhanh.
    • Giảm tải cho server vì yêu cầu sai không được gửi đi.
  • Nhược điểm:
    • Không đáng tin cậy: Người dùng có thể bỏ qua bằng cách tắt JavaScript hoặc chỉnh sửa request trực tiếp.

2. Validate API

  • Mục đích: Kiểm tra dữ liệu từ request trước khi backend xử lý.
  • Áp dụng: Khi ứng dụng của bạn có giao tiếp API (REST, GraphQL).
  • Công cụ thường dùng:
    • Rails: Strong Parameters (requirepermit).
    • OpenAPI hoặc JSON Schema để định nghĩa các rule kiểm tra.
  • Ví dụ trong Rails:
    def create
      user_params = params.require(:user).permit(:username, :email, :password)
      @user = User.new(user_params)
      if @user.save
        render json: @user, status: :created
      else
        render json: @user.errors, status: :unprocessable_entity
      end
    end
    
  • Ưu điểm:
    • Xác thực dữ liệu ngay khi request đến server.
    • Dễ mở rộng và áp dụng cho các API công khai.
  • Nhược điểm:
    • Yêu cầu đồng bộ với các tầng khác như model hoặc database.

3. Validate Model (Backend Validation)

  • Mục đích: Kiểm tra tính hợp lệ của dữ liệu trước khi lưu vào cơ sở dữ liệu.
  • Công cụ thường dùng:
    • Rails: Validation trong model (validates).
    • Django: validators trong model.
  • Ví dụ trong Rails:
    class User < ApplicationRecord
      validates :username, presence: true, uniqueness: true, length: { maximum: 20 }
      validates :email, presence: true, format: { with: URI::MailTo::EMAIL_REGEXP }
    end
    
  • Ưu điểm:
    • Đảm bảo dữ liệu hợp lệ trước khi lưu.
    • Cung cấp các thông báo lỗi cụ thể để gửi phản hồi cho client.
  • Nhược điểm:
    • Validation trong model có thể trùng lặp với tầng API.

4. Validate Database

  • Mục đích: Bảo vệ dữ liệu ở tầng thấp nhất, đảm bảo tính toàn vẹn dù có lỗi ở các tầng khác.
  • Công cụ thường dùng: Constraint trong database (PostgreSQL, MySQL,...).
  • Ví dụ:
    CREATE TABLE users (
      id SERIAL PRIMARY KEY,
      username VARCHAR(20) NOT NULL UNIQUE,
      email VARCHAR(255) NOT NULL UNIQUE,
      created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
    );
    
    • NOT NULL: Đảm bảo trường không được để trống.
    • UNIQUE: Đảm bảo giá trị không trùng lặp.
    • CHECK: Kiểm tra dữ liệu theo điều kiện (ví dụ, tuổi > 18).
    • FOREIGN KEY: Ràng buộc dữ liệu giữa các bảng.
  • Ưu điểm:
    • Đảm bảo dữ liệu luôn chính xác ngay cả khi truy cập trực tiếp vào database.
  • Nhược điểm:
    • Lỗi khó đọc hơn nếu không xử lý tốt (ví dụ, "Unique Constraint Violated").
    • Không phù hợp để kiểm tra các logic phức tạp.

So sánh các tầng Validation

Loại Validation Vị trí Mục đích Ưu điểm Nhược điểm
Client Frontend Ngăn dữ liệu sai trước khi gửi đến server. Phản hồi nhanh, giảm tải server. Không đáng tin cậy, dễ bị bỏ qua.
API Controller hoặc Schema Xác thực request từ client trước khi xử lý trong backend. Tách biệt rõ ràng logic với tầng khác. Phức tạp nếu phải đồng bộ với các tầng khác.
Model Backend (Model) Đảm bảo dữ liệu hợp lệ trước khi lưu vào database. Gắn chặt với logic của ứng dụng. Dễ bị trùng lặp với tầng API.
Database Tầng cơ sở dữ liệu Đảm bảo tính toàn vẹn dữ liệu ở cấp thấp nhất. Chắc chắn và bảo vệ dữ liệu mạnh mẽ. Khó phản hồi lỗi chi tiết cho người dùng.

Khi nào nên sử dụng?

  • Sử dụng kết hợp tất cả các tầng để đạt hiệu quả tối đa:
    1. Client: Để cải thiện UX (trải nghiệm người dùng).
    2. API: Bảo vệ logic ở tầng giao tiếp giữa client và server.
    3. Model: Đảm bảo dữ liệu luôn hợp lệ trong ứng dụng.
    4. Database: Bảo vệ dữ liệu, ngăn chặn thao tác không hợp lệ ở tầng thấp nhất.

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí