Cookie, Local Storage và IndexedDB: một phiên thực sự là gì

Đăng nhập ghi vào ba nơi riêng biệt. Biết cái nào là cái nào giải thích vì sao phiên sống sót qua một số việc, hỏng vì những việc khác, và vì sao đồng bộ một hồ sơ phải chuyển cả ba.
"Đang đăng nhập" cảm giác như một thứ. Thực ra nó là ít nhất ba thứ, lưu ở ba nơi khác nhau với ba vòng đời khác nhau, và sự khác biệt đó giải thích phần lớn hành vi khó hiểu mà người ta gặp khi chuyển phiên giữa các máy.
Cookie
Các cặp khóa-giá trị nhỏ, được gửi tự động kèm mọi yêu cầu tới trang đã đặt chúng. Đây thường là nơi chứa token phiên.
- Có phạm vi theo tên miền và đường dẫn, với ngày hết hạn.
- Cookie `Secure` chỉ được gửi qua HTTPS; cookie `HttpOnly` vô hình với JavaScript của trang.
- Cookie phiên không có ngày hết hạn và được thiết kế để biến mất khi đóng trình duyệt.
Cookie là nhỏ nhất trong ba thứ và gánh nhiều nhất. Mất chúng là bạn bị đăng xuất.
Local Storage và Session Storage
Bộ nhớ khóa-giá trị dạng chuỗi, do JavaScript của trang đọc và ghi, có phạm vi theo origin. Nó không bao giờ được gửi kèm yêu cầu. Trang phải chủ động đọc nó.
Ứng dụng lưu tùy chọn, chi tiết hồ sơ đã cache, cờ tính năng và thường là refresh token ở đây. Local Storage tồn tại đến khi bị xóa; Session Storage chỉ tồn tại bằng thời gian của tab.
IndexedDB
Một cơ sở dữ liệu thực thụ trong trình duyệt: bản ghi có cấu trúc, chỉ mục, giao dịch. Đây là nơi một ứng dụng web hiện đại giữ mọi thứ đáng kể: lịch sử tin nhắn đã cache, hàng đợi ngoại tuyến, khóa mã hóa cho các tính năng mã hóa đầu cuối.
Vì sao điều này quan trọng với hồ sơ
Nó cho "cô lập" một nghĩa chính xác. Hai hồ sơ được cô lập khi cả ba thứ này tách biệt, cộng với cache và trạng thái tiện ích mở rộng. Một công cụ cô lập cookie mà dùng chung IndexedDB mới chỉ cô lập một phần ba dễ của vấn đề.
Nó cũng đặt ra chuẩn cho việc chuyển hồ sơ giữa các máy. Chỉ mang cookie sang thì tái tạo được hình dạng của một phiên mà không có thực chất của nó.
| Kho lưu trữ | Được ghi bởi | Thường chứa |
|---|---|---|
| Cookie | Máy chủ và script của trang | Token phiên, tùy chọn, định danh theo dõi |
| Local Storage | Script của trang | Refresh token, trạng thái giao diện, chi tiết hồ sơ đã cache |
| Session Storage | Script của trang | Trạng thái theo từng tab, bị bỏ khi tab đóng |
| IndexedDB | Script của trang | Dữ liệu đã cache, hàng đợi ngoại tuyến, khóa mã hóa |
Chuyển phiên giữa các máy của chính bạn
PowerOps chụp cookie, Local Storage và IndexedDB khi một hồ sơ đóng và khôi phục chúng khi hồ sơ mở ở nơi khác. Mỗi loại là một công tắc, cho toàn workspace hoặc cho một hồ sơ riêng lẻ, nên bạn chuyển đúng lượng mình định chuyển.
Có hai đặc điểm đáng biết về cách nó hoạt động:
- Bản chụp được mã hóa trên máy mà nó xuất phát, bằng một khóa thuộc về workspace, và được giải mã trên máy mở hồ sơ. Đây không phải mã hóa đầu cuối: dịch vụ giữ một bản sao của khóa đó để các máy tính khác của bạn nhận được nó.
- Một hồ sơ chỉ mở trên một máy tại một thời điểm. Khi đang mở, nó giữ một lease, và thiết bị khác được báo thiết bị nào đang giữ nó thay vì được phép tách phiên thành hai bản sao phân kỳ.
Điểm thứ hai là một giới hạn có chủ ý. Hai máy chỉnh sửa độc lập một phiên tạo ra hai phiên hợp lệ một nửa và, khá thường xuyên, một tài khoản bị đăng xuất trên cả hai. Một kho cookie không có cách nào giải quyết xung đột hợp nhất.
Điều rút ra trong thực tế
Hãy đóng hồ sơ thay vì tắt cưỡng bức. Việc ghi ra khi đóng là thứ làm cho phiên có thể di chuyển, và đó là thói quen rẻ nhất trong danh sách này.

