Những ưu và nhược điểm kỹ thuật của localStorage, sessionStorage, session và cookie và khi nào tôi sẽ sử dụng cái này hơn cái kia?
Những ưu và nhược điểm kỹ thuật của localStorage, sessionStorage, session và cookie và khi nào tôi sẽ sử dụng cái này hơn cái kia?
Câu trả lời:
Đây là một câu hỏi phạm vi cực kỳ rộng, và rất nhiều ưu / nhược điểm sẽ tùy theo tình huống.
Trong mọi trường hợp, các cơ chế lưu trữ này sẽ dành riêng cho một trình duyệt riêng lẻ trên một máy tính / thiết bị riêng lẻ. Mọi yêu cầu lưu trữ dữ liệu trên cơ sở liên tục qua các phiên sẽ cần liên quan đến phía máy chủ ứng dụng của bạn - rất có thể là sử dụng cơ sở dữ liệu, nhưng có thể là XML hoặc tệp văn bản / CSV.
localStorage, sessionStorage và cookie là tất cả các giải pháp lưu trữ của khách hàng. Dữ liệu phiên được lưu trữ trên máy chủ nơi nó vẫn nằm dưới sự kiểm soát trực tiếp của bạn.
localStorage và sessionStorage là các API tương đối mới (có nghĩa là không phải tất cả các trình duyệt cũ sẽ hỗ trợ chúng) và gần giống nhau (cả về API và khả năng) ngoại trừ duy trì. sessionStorage (như tên cho thấy) chỉ khả dụng trong suốt thời gian của phiên trình duyệt (và bị xóa khi tab hoặc cửa sổ bị đóng) - tuy nhiên, nó vẫn tồn tại tải lại trang ( hướng dẫn lưu trữ DOM nguồn - Mạng của nhà phát triển Mozilla ).
Rõ ràng, nếu dữ liệu bạn đang lưu trữ cần phải có sẵn trên cơ sở liên tục thì localStorage thích hợp hơn với sessionStorage - mặc dù bạn cần lưu ý cả hai có thể bị xóa bởi người dùng vì vậy bạn không nên dựa vào sự tồn tại liên tục của dữ liệu trong cả hai trường hợp.
localStorage và sessionStorage là hoàn hảo để duy trì dữ liệu không nhạy cảm cần thiết trong các tập lệnh máy khách giữa các trang (ví dụ: tùy chọn, điểm số trong trò chơi). Dữ liệu được lưu trữ trong localStorage và sessionStorage có thể dễ dàng được đọc hoặc thay đổi từ bên trong máy khách / trình duyệt, do đó không nên dựa vào việc lưu trữ dữ liệu nhạy cảm hoặc liên quan đến bảo mật trong các ứng dụng.
Điều này cũng đúng với cookie, chúng có thể bị người dùng can thiệp một cách tầm thường và dữ liệu cũng có thể được đọc từ chúng bằng văn bản thuần túy - vì vậy nếu bạn muốn lưu trữ dữ liệu nhạy cảm thì phiên thực sự là lựa chọn duy nhất của bạn. Nếu bạn không sử dụng SSL, thông tin cookie cũng có thể bị chặn trong quá trình vận chuyển, đặc biệt là trên một wifi mở.
Về mặt tích cực, cookie có thể được áp dụng mức độ bảo vệ khỏi các rủi ro bảo mật như Cross-Site Scripting (XSS) / Script bằng cách đặt cờ chỉ HTTP có nghĩa là các trình duyệt (hỗ trợ) hiện đại sẽ ngăn truy cập vào cookie và giá trị từ JavaScript ( điều này cũng sẽ ngăn JavaScript của bạn, hợp pháp, truy cập chúng). Điều này đặc biệt quan trọng với cookie xác thực, được sử dụng để lưu trữ mã thông báo chứa thông tin chi tiết về người dùng đã đăng nhập - nếu bạn có một bản sao của cookie đó cho tất cả ý định và mục đích bạn trở thành người dùng đó cho đến khi ứng dụng web được sử dụng liên quan và có cùng quyền truy cập vào dữ liệu và chức năng mà người dùng có.
Vì cookie được sử dụng cho mục đích xác thực và lưu giữ dữ liệu người dùng, tất cả các cookie hợp lệ cho một trang được gửi từ trình duyệt đến máy chủ cho mọi yêu cầu đến cùng một tên miền - điều này bao gồm yêu cầu trang gốc, mọi yêu cầu Ajax tiếp theo, tất cả hình ảnh, bảng định kiểu, tập lệnh và phông chữ. Vì lý do này, cookie không nên được sử dụng để lưu trữ một lượng lớn thông tin. Trình duyệt cũng có thể áp đặt các giới hạn về kích thước thông tin có thể được lưu trữ trong cookie. Thông thường, cookie được sử dụng để lưu trữ mã thông báo nhận dạng để xác thực, phiên và theo dõi quảng cáo. Các mã thông báo thường không phải là thông tin có thể đọc được của con người, nhưng các mã định danh được mã hóa được liên kết với ứng dụng hoặc cơ sở dữ liệu của bạn.
Về khả năng, cookie, sessionStorage và localStorage chỉ cho phép bạn lưu trữ chuỗi - có thể chuyển đổi hoàn toàn các giá trị nguyên thủy khi cài đặt (chúng sẽ cần được chuyển đổi trở lại để sử dụng chúng làm kiểu của chúng sau khi đọc) nhưng không phải là Đối tượng hoặc Mảng (có thể JSON tuần tự hóa chúng để lưu trữ chúng bằng API). Lưu trữ phiên thường sẽ cho phép bạn lưu trữ bất kỳ nguyên thủy hoặc đối tượng nào được hỗ trợ bởi ngôn ngữ / khung phía Máy chủ của bạn.
Vì HTTP là giao thức không trạng thái - các ứng dụng web không có cách nào xác định người dùng từ các lần truy cập trước khi quay lại trang web - dữ liệu phiên thường dựa vào mã thông báo cookie để xác định người dùng truy cập lặp lại (mặc dù hiếm khi sử dụng tham số URL cùng mục đích). Dữ liệu thường sẽ có thời gian hết hạn trượt (được gia hạn mỗi lần người dùng truy cập) và tùy thuộc vào dữ liệu máy chủ / khung của bạn sẽ được lưu trữ trong quá trình (có nghĩa là dữ liệu sẽ bị mất nếu máy chủ web gặp sự cố hoặc được khởi động lại) một máy chủ nhà nước hoặc cơ sở dữ liệu. Điều này cũng cần thiết khi sử dụng trang trại (nhiều hơn một máy chủ cho một trang web nhất định).
Vì dữ liệu phiên hoàn toàn được kiểm soát bởi ứng dụng của bạn (phía máy chủ), đây là nơi tốt nhất cho mọi thứ nhạy cảm hoặc an toàn trong tự nhiên.
Nhược điểm rõ ràng của dữ liệu phía máy chủ là khả năng mở rộng - tài nguyên máy chủ được yêu cầu cho mỗi người dùng trong suốt thời gian của phiên và rằng mọi dữ liệu khách hàng cần phải được gửi với mỗi yêu cầu. Vì máy chủ không có cách nào để biết liệu người dùng có điều hướng đến một trang web khác hoặc đóng trình duyệt của họ hay không, dữ liệu phiên phải hết hạn sau một thời gian nhất định để tránh tất cả tài nguyên máy chủ bị chiếm bởi các phiên bị bỏ rơi. Do đó, khi sử dụng dữ liệu phiên, bạn nên lưu ý đến khả năng dữ liệu sẽ hết hạn và bị mất, đặc biệt là trên các trang có dạng dài. Nó cũng sẽ bị mất nếu người dùng xóa cookie hoặc chuyển đổi trình duyệt / thiết bị.
Một số khung / nhà phát triển web sử dụng các đầu vào HTML ẩn để duy trì dữ liệu từ trang này sang trang khác để tránh hết hạn phiên.
localStorage, sessionStorage và cookie đều tuân theo quy tắc "cùng nguồn gốc", có nghĩa là các trình duyệt sẽ ngăn truy cập vào dữ liệu ngoại trừ tên miền đặt thông tin bắt đầu.
Để đọc thêm về các công nghệ lưu trữ của khách hàng, hãy xem Lặn vào Html 5 .
sessionStorage
bị xóa khi cửa sổ đóng, hoặc tab?
Ưu điểm :
Nhược điểm :
Ưu điểm:
Nhược điểm:
Dữ liệu được gửi trở lại máy chủ cho mọi yêu cầu HTTP (HTML, hình ảnh, JavaScript, CSS, v.v.) - tăng lượng lưu lượng giữa máy khách và máy chủ.
Thông thường, những điều sau đây được cho phép:
Ưu điểm:
localStorage
.Nhược điểm:
localStorage
, nó hoạt động trên chính sách cùng nguồn gốc . Vì vậy, dữ liệu được lưu trữ sẽ chỉ có sẵn trên cùng một nguồn gốc.Thanh toán trên các tab - cách tạo điều kiện giao tiếp dễ dàng giữa các tab trình duyệt có nguồn gốc chéo.
OK, LocalStorage vì nó được gọi là bộ nhớ cục bộ cho trình duyệt của bạn, nó có thể tiết kiệm tới 10MB , SessionStorage cũng như vậy, nhưng như tên của nó, nó dựa trên phiên và sẽ bị xóa sau khi đóng trình duyệt của bạn, cũng có thể tiết kiệm ít hơn LocalStorage, giống như lên tới 5MB , nhưng Cookies là bộ lưu trữ dữ liệu rất nhỏ trong trình duyệt của bạn, có thể tiết kiệm tối đa 4KB và có thể được truy cập thông qua máy chủ hoặc trình duyệt cả ...
Tôi cũng đã tạo ra hình ảnh dưới đây để thể hiện sự khác biệt trong nháy mắt:
Đây là các thuộc tính của đối tượng 'window' trong JavaScript, giống như tài liệu là một trong các thuộc tính của đối tượng window chứa các đối tượng DOM.
Thuộc tính lưu trữ phiên duy trì một vùng lưu trữ riêng cho từng nguồn gốc nhất định có sẵn trong suốt thời gian của phiên trang, miễn là trình duyệt được mở, bao gồm tải lại và khôi phục trang.
Local Storage cũng làm điều tương tự, nhưng vẫn tồn tại ngay cả khi trình duyệt được đóng và mở lại.
Bạn có thể thiết lập và truy xuất dữ liệu được lưu trữ như sau:
sessionStorage.setItem('key', 'value');
var data = sessionStorage.getItem('key');
Tương tự cho localStorage.
sessionStorage
ngay cả một tab mới là một cửa sổ mới. Vì vậy, mọi thứ được lưu trữ cho một tên miền cụ thể trong một tab sẽ không có sẵn cho cùng một tên miền trong tab tiếp theo.
Lưu trữ cục bộ: Nó lưu trữ dữ liệu thông tin người dùng mà không hết hạn, dữ liệu này sẽ không bị xóa khi người dùng đóng các cửa sổ trình duyệt, nó sẽ có sẵn cho ngày, tuần, tháng và năm.
Trong lưu trữ cục bộ có thể lưu trữ dữ liệu ngoại tuyến 5-10mb.
//Set the value in a local storage object
localStorage.setItem('name', myName);
//Get the value from storage object
localStorage.getItem('name');
//Delete the value from local storage object
localStorage.removeItem(name);//Delete specifice obeject from local storege
localStorage.clear();//Delete all from local storege
Lưu trữ phiên: Giống như ngày lưu trữ cục bộ ngoại trừ việc nó sẽ xóa tất cả các cửa sổ khi cửa sổ trình duyệt đóng bởi người dùng web.
Trong phiên lưu trữ có thể lưu trữ tối đa 5 mb dữ liệu
//set the value to a object in session storege
sessionStorage.myNameInSession = "Krishna";
Phiên : Phiên là biến toàn cục được lưu trữ trên máy chủ. Mỗi phiên được gán một id duy nhất được sử dụng để truy xuất các giá trị được lưu trữ.
Cookies : Cookies là dữ liệu, được lưu trữ trong các tệp văn bản nhỏ dưới dạng cặp giá trị tên trên máy tính của bạn. Khi cookie đã được đặt, tất cả các yêu cầu trang tiếp theo sẽ trả về tên và giá trị của cookie.
API lưu trữ web cung cấp các cơ chế theo đó các trình duyệt có thể lưu trữ các cặp khóa / giá trị một cách an toàn, theo cách trực quan hơn nhiều so với sử dụng cookie. Các API lưu trữ Web mở rộng Window
đối tượng với hai thuộc tính mới - Window.sessionStorage
và Window.localStorage
. - việc gọi một trong số này sẽ tạo một thể hiện của đối tượng Storage, thông qua đó các mục dữ liệu có thể được đặt, truy xuất và xóa. Một đối tượng lưu trữ khác nhau được sử dụng cho sessionStorage
và localStorage
cho mỗi nguồn gốc (tên miền).
Các đối tượng lưu trữ là các kho lưu trữ khóa-giá trị đơn giản , tương tự như các đối tượng, nhưng chúng vẫn nguyên vẹn thông qua tải trang .
localStorage.colorSetting = '#a4509b';
localStorage['colorSetting'] = '#a4509b';
localStorage.setItem('colorSetting', '#a4509b');
Các khóa và các giá trị luôn là các chuỗi . Để lưu trữ bất kỳ loạiconvert it to String
và sau đó lưu trữ nó. Chúng tôi luôn khuyến nghị sử dụngStorage interface
các phương pháp.
var testObject = { 'one': 1, 'two': 2, 'three': 3 };
// Put the object into storage
localStorage.setItem('testObject', JSON.stringify(testObject));
// Retrieve the object from storage
var retrievedObject = localStorage.getItem('testObject');
console.log('Converting String to Object: ', JSON.parse(retrievedObject));
Hai cơ chế trong Lưu trữ web như sau:
Lưu trữ « Lưu trữ cục bộ ghi dữ liệu vào đĩa, trong khi lưu trữ phiên chỉ ghi dữ liệu vào bộ nhớ. Bất kỳ dữ liệu nào được ghi vào bộ lưu trữ phiên sẽ bị xóa khi ứng dụng của bạn thoát.
Dung lượng lưu trữ tối đa khả dụng là khác nhau trên mỗi trình duyệt , nhưng hầu hết các trình duyệt đã triển khai ít nhất giới hạn lưu trữ tối đa được đề xuất của w3c là 5MB .
+----------------+--------+---------+-----------+--------+
| | Chrome | Firefox | Safari | IE |
+----------------+--------+---------+-----------+--------+
| LocalStorage | 10MB | 10MB | 5MB | 10MB |
+----------------+--------+---------+-----------+--------+
| SessionStorage | 10MB | 10MB | Unlimited | 10MB |
+----------------+--------+---------+-----------+--------+
Luôn luôn bắt lỗi bảo mật và hạn ngạch của LocalStorage
QuotaExceededError : Khi giới hạn lưu trữ vượt quá chức năng nàywindow.sessionStorage.setItem(key, value);
, nó sẽ ném ngoại lệ DOMException "QuotaExceededError" nếu giá trị mới không thể được đặt. (Cài đặt có thể thất bại nếu, ví dụ: người dùng đã vô hiệu hóa bộ nhớ cho trang web hoặc nếu vượt quá hạn ngạch.)
DOMException. QUOTA_EXCEEDED_ERR là 22 , ví dụ fiddle .
Bảo mậtError :Uncaught SecurityError: Access to 'localStorage' is denied for this document
.
CHROME:-Privacy and security « Content settings « Cookies « Block third-party cookies.
StorageEvent «Sự kiện lưu trữ được kích hoạt trên đối tượng Window của tài liệu khi vùng lưu trữ thay đổi. Khi một tác nhân người dùng gửi thông báo lưu trữ cho Tài liệu, tác nhân người dùng phải xếp hàng một tác vụ để thực hiện một sự kiện có tên lưu trữ tại đối tượng Window của đối tượng Tài liệu, sử dụng StorageEvent.
Lưu ý: Để biết ví dụ trong thế giới thực, hãy xem Trình diễn lưu trữ web . kiểm tra mã nguồn
Nghe sự kiện lưu trữ trên dom / Window để nắm bắt những thay đổi trong bộ lưu trữ. bí ẩn .
Cookie (cookie web, cookie trình duyệt) Cookie là dữ liệu, được lưu trữ trong các tệp văn bản nhỏ dưới dạng cặp giá trị tên, trên máy tính của bạn.
Truy cập JavaScript bằng Document.cookie
Các cookie mới cũng có thể được tạo thông qua JavaScript bằng thuộc tính Document.cookie và nếu cờ httpOnly không được đặt, các cookie hiện tại cũng có thể được truy cập từ JavaScript.
document.cookie = "yummy_cookie=choco";
document.cookie = "tasty_cookie=strawberry";
console.log(document.cookie);
// logs "yummy_cookie=choco; tasty_cookie=strawberry"
Cookie an toàn và httpOnly Cơ chế quản lý nhà nước HTTP
Cookies thường được sử dụng trong ứng dụng web để xác định người dùng và phiên xác thực của họ
Khi nhận được yêu cầu HTTP, máy chủ có thể gửi tiêu đề Set-Cookie kèm theo phản hồi. Cookie thường được trình duyệt lưu trữ và sau đó cookie được gửi với các yêu cầu được gửi đến cùng một máy chủ bên trong tiêu đề Cookie HTTP.
Set-Cookie: <cookie-name>=<cookie-value>
Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>
Cookie phiên sẽ được gỡ bỏ khi máy khách bị tắt. Họ không chỉ định các Chỉ thị hết hạn hoặc Tuổi tối đa.
Set-Cookie: sessionid=38afes7a8; HttpOnly; Path=/
Cookie vĩnh viễn hết hạn vào một ngày cụ thể (Hết hạn) hoặc sau một khoảng thời gian cụ thể (Tuổi tối đa).
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly
Tiêu đề yêu cầu HTTP Cookie chứa cookie HTTP được lưu trữ trước đó được gửi bởi máy chủ với tiêu đề Set-Cookie. Các cookie chỉ HTTP không thể truy cập thông qua JavaScript thông qua thuộc tính Document.cookie, XMLHttpRequest và API yêu cầu để giảm thiểu các cuộc tấn công chống lại kịch bản chéo trang (XSS).
Cookies chủ yếu được sử dụng cho ba mục đích:
Cookies được phát minh để giải quyết vấn đề "làm thế nào để nhớ thông tin về người dùng":
Ví dụ về GitHubGist
Như tóm tắt,
Bảo hiểm địa phương :
Lưu trữ web có thể được xem một cách đơn giản như một sự cải tiến về cookie, cung cấp dung lượng lưu trữ lớn hơn nhiều. Kích thước khả dụng là 5MB, không gian để làm việc nhiều hơn đáng kể so với cookie 4KB thông thường.
Dữ liệu không được gửi trở lại máy chủ cho mọi yêu cầu HTTP (HTML, hình ảnh, JavaScript, CSS, v.v.) - giảm lượng lưu lượng giữa máy khách và máy chủ.
Dữ liệu được lưu trữ trong localStorage vẫn tồn tại cho đến khi bị xóa rõ ràng. Những thay đổi được thực hiện được lưu và có sẵn cho tất cả các lượt truy cập hiện tại và tương lai vào trang web.
Nó hoạt động trên chính sách cùng nguồn gốc. Vì vậy, dữ liệu được lưu trữ sẽ chỉ có sẵn trên cùng một nguồn gốc.
Bánh quy:
Chúng tôi có thể đặt thời gian hết hạn cho mỗi cookie
Giới hạn 4K dành cho toàn bộ cookie, bao gồm tên, giá trị, ngày hết hạn, v.v. Để hỗ trợ hầu hết các trình duyệt, hãy giữ tên dưới 4000 byte và kích thước cookie chung dưới 4093 byte.
Dữ liệu được gửi trở lại máy chủ cho mọi yêu cầu HTTP (HTML, hình ảnh, JavaScript, CSS, v.v.) - tăng lượng lưu lượng giữa máy khách và máy chủ.
phiênStorage:
Thay đổi chỉ khả dụng trên mỗi cửa sổ (hoặc tab trong các trình duyệt như Chrome và Firefox). Các thay đổi được thực hiện được lưu và có sẵn cho trang hiện tại, cũng như các lượt truy cập trong tương lai vào trang web trên cùng một cửa sổ. Khi cửa sổ được đóng, bộ nhớ sẽ bị xóa Dữ liệu chỉ có sẵn bên trong cửa sổ / tab được đặt.
Dữ liệu không liên tục, tức là nó sẽ bị mất khi cửa sổ / tab được đóng lại. Giống như localStorage, nó hoạt động trên chính sách cùng nguồn gốc. Vì vậy, dữ liệu được lưu trữ sẽ chỉ có sẵn trên cùng một nguồn gốc.