Skip to main content
Bạn đang xem tài liệu Inertia.js v2. Inertia.js v3 đã được phát hành và hiện là phiên bản mặc định. Hãy xem hướng dẫn nâng cấp để bắt đầu.
Hãy hình dung người dùng đã đăng nhập, xem thông tin có quyền truy cập hạn chế trên website rồi đăng xuất. Nếu họ nhấn nút Back, họ vẫn có thể nhìn thấy thông tin đặc quyền đã được lưu trong history state của cửa sổ trình duyệt. Đây là rủi ro bảo mật. Để ngăn điều đó, Inertia.js cung cấp tính năng mã hóa lịch sử.

Cách hoạt động

Khi bạn yêu cầu Inertia mã hóa lịch sử ứng dụng, nó sử dụng crypto API tích hợp của trình duyệt để mã hóa dữ liệu trang hiện tại trước khi push vào history state. Key tương ứng được lưu trong session storage của trình duyệt. Khi người dùng quay lại một trang, dữ liệu được giải mã bằng key lưu trong session storage. Khi bạn yêu cầu Inertia xóa history state, Inertia chỉ cần xóa key hiện tại khỏi session storage và tạo key mới. Nếu cố giải mã history state cũ bằng key mới, việc giải mã sẽ thất bại và Inertia sẽ gửi request mới đến máy chủ để lấy lại dữ liệu trang. Mã hóa lịch sử dựa vào window.crypto.subtle, API chỉ khả dụng trong môi trường bảo mật (website đã bật SSL).

Chủ động bật tính năng

Mã hóa lịch sử là tính năng opt-in. Có một số cách để bật:

Mã hóa toàn cục

Nếu muốn bật mã hóa lịch sử trên toàn ứng dụng, hãy đặt giá trị config inertia.history.encrypt thành true. Bạn có thể tắt mã hóa cho từng trang cụ thể bằng cách gọi phương thức Inertia::encryptHistory() trước khi trả response.

Mã hóa theo request

Để mã hóa lịch sử của một request riêng lẻ, chỉ cần gọi phương thức Inertia::encryptHistory() trước khi trả response.

Middleware mã hóa

Để mã hóa một nhóm route, bạn có thể dùng middleware EncryptHistory đi kèm Inertia.

Xóa lịch sử

Để xóa history state, bạn có thể gọi phương thức Inertia::clearHistory() trước khi trả response.
Sau khi response được render ở phía client, encryption key sẽ được rotate, khiến history state trước đó không thể đọc được. Bạn cũng có thể xóa history ở phía client bằng cách gọi router.clearHistory().

Tài liệu chính thức

Bài dịch này được đối chiếu từ tài liệu Inertia.js v2 chính thức. Nếu có khác biệt do phiên bản hoặc cập nhật mới, hãy ưu tiên tài liệu chính thức làm nguồn tham chiếu.