localStorage、sessionStorage、session、cookieの違いは何ですか?


532

localStorage、sessionStorage、session、cookiesの技術的な長所と短所は何ですか。


2
セッションストレージ(対HTML5ローカルストレージ:これはまた顔をしているに関連するトピックの良いstackoverflow.com/questions/5523140/...
サリンJS

2
また、ブラウザのWINDOWが開いている間は(セッションが設定されているタブではなく)セッションCookieが存続することに注意してください。ただし、タブを閉じるとすぐにsessionStorageが
null

はい、セッションもクッキーの一種です。特徴は、Cookieが永続的である場合の一時的なものです
Faris Rayhan 2017年

@ yar1特定のブラウザウィンドウは無関係なUI要素です。
curiousguy

回答:


718

これは非常に広い範囲の質問であり、多くの長所/短所は状況に応じて異なります。

すべての場合において、これらのストレージメカニズムは、個々のコンピューター/デバイス上の個々のブラウザーに固有です。セッション全体で継続的にデータを保存するための要件には、アプリケーションサーバー側が関与する必要があります。おそらくデータベースを使用しますが、XMLまたはテキスト/ CSVファイルを使用する可能性があります。

localStorage、sessionStorage、Cookieはすべてクライアントストレージソリューションです。セッションデータはサーバー上に保持され、直接制御されます。

localStorageおよびsessionStorage

localStorageとsessionStorageは比較的新しいAPI(つまり、すべてのレガシーブラウザがそれらをサポートするわけではない)であり、永続性を除いてほとんど同じです(APIと機能の両方)。sessionStorage(名前が示すとおり)は、ブラウザーセッションの期間中のみ使用できます(タブまたはウィンドウが閉じられると削除されます)。ただし、ページの再ロード後も存続します(ソースDOMストレージガイド-Mozilla Developer Network)。

明らかに、保存しているデータを継続的に利用できるようにする必要がある場合は、sessionStorageよりもlocalStorageを使用することをお勧めします。ただし、どちらの場合もデータの継続的な存在に依存しないように、両方をユーザーがクリアできることに注意してください。

localStorageとsessionStorageは、ページ間のクライアントスクリプト内で必要な非機密データ(たとえば、設定、ゲームのスコア)を保持するのに最適です。localStorageとsessionStorageに保存されたデータは、クライアント/ブラウザ内から簡単に読み取りまたは変更できるため、アプリケーション内の機密データやセキュリティ関連データの保存に依存しないでください。

クッキー

これはCookieにも当てはまります。これらはユーザーによって簡単に改ざんされる可能性があり、データはプレーンテキストで読み取ることもできます。したがって、機密データを保存する場合は、セッションが本当に唯一の選択肢です。SSLを使用していない場合、特にオープンwifiで、Cookie情報が転送中に傍受される可能性もあります。

肯定的な面では、Cookieには、クロスサイトスクリプティング(XSS)/スクリプトインジェクションなどのセキュリティリスクからある程度の保護を適用できます。これは、HTTPのみのフラグを設定することで、最新の(サポートする)ブラウザーがJavaScriptからのCookieと値へのアクセスを禁止することを意味します(これにより、独自の正当なJavaScriptがそれらにアクセスすることもできなくなります)。これは、認証Cookieで特に重要です。認証Cookieは、ログオンしているユーザーの詳細を含むトークンを格納するために使用されます。そのCookieのコピーがある場合、すべてのインテントと目的で、Webアプリケーションがそのユーザーである限り、そのユーザーになります。ユーザーが持つデータと機能への同じアクセス権を持っています。

Cookieは認証とユーザーデータの永続化に使用されるため、ページに有効なすべての Cookie は、同じドメインへのすべてのリクエストに対してブラウザからサーバーに送信されます-これには、元のページリクエスト、後続のAjaxリクエスト、すべての画像、スタイルシート、スクリプト、フォント。このため、大量の情報を保存するためにCookieを使用しないでください。ブラウザは、Cookieに保存できる情報のサイズに制限を課す場合もあります。通常、Cookieは、認証、セッション、および広告の追跡用の識別トークンを格納するために使用されます。トークンは通常、それ自体が人間が読み取れる情報ではなく、アプリケーションまたはデータベースにリンクされた暗号化された識別子です。

localStorageとsessionStorageとCookie

機能に関しては、cookies、sessionStorage、およびlocalStorageは文字列の保存のみを許可します-設定時にプリミティブ値を暗黙的に変換することができます(これらは読み取り後に型として使用するために変換し直す必要があります)オブジェクトまたは配列は不可(JSONでシリアル化して、APIを使用して保存することができます)。セッションストレージでは通常、サーバー側の言語/フレームワークでサポートされているプリミティブやオブジェクトを保存できます。

クライアント側とサーバー側

HTTPはステートレスプロトコルであるため、Webアプリケーションには、Webサイトに戻る際に以前のアクセスからユーザーを識別する方法がありません。通常、セッションデータはCookieトークンに依存して、繰り返しアクセスするユーザーを識別します(URLパラメータが使用されることはまれですが)同じ目的)。データには通常、スライドする有効期限があり(ユーザーがアクセスするたびに更新されます)、サーバー/フレームワークに応じて、データはインプロセス(Webサーバーがクラッシュまたは再起動するとデータが失われる)または外部で保存されます状態サーバーまたはデータベース。これは、Webファーム(特定のWebサイトに複数のサーバー)を使用する場合にも必要です。

セッションデータはアプリケーション(サーバー側)によって完全に制御されるため、本質的に機密情報や安全性を確保するために最適な場所です。

サーバー側のデータの明らかな欠点はスケーラビリティです。セッションの間、ユーザーごとにサーバーリソースが必要であり、クライアント側で必要なデータはリクエストごとに送信する必要があります。サーバーは、ユーザーが別のサイトに移動したかブラウザを閉じたかを知る方法がないため、すべてのサーバーリソースが放棄されたセッションによって占有されるのを防ぐために、セッションデータは一定時間後に期限切れになる必要があります。したがって、セッションデータを使用する場合は、特に長い形式のページでは、データが期限切れになり、失われる可能性があることに注意してください。また、ユーザーがCookieを削除したり、ブラウザやデバイスを切り替えたりしても失われます。

一部のWebフレームワーク/開発者は、非表示のHTML入力を使用して、フォームの1つのページから別のページにデータを永続化し、セッションの期限切れを回避します。

localStorage、sessionStorage、およびcookieはすべて「同一生成」ルールの対象となります。つまり、情報を設定するドメイン以外のブラウザは、データへのアクセスを禁止する必要があります。

クライアントストレージテクノロジーの詳細については、Dive Into Html 5を参照してください。


34
注意:sessionStorage、localStorageは認証情報には適していません。それらは自動的にサーバーに送信されません。つまり、ユーザーがURLを手動で変更したり、HTMLリンクをクリックしたりすると、認証情報が取得されません。HTMLリンクを書き換えたとしても、URLを介して認証情報を渡さなければならず、これはセキュリティの問題です。結局、あなたはクッキーを使わざるを得なくなります。関連トピックについては、stackoverflow.com / q / 26556749/14731を参照してください。
ギリ

23
ウィルsessionStorageときに削除され、ウィンドウが閉じている、またはタブ?
トリシス2014年

34
タブを閉じると、sessionStorageが削除されます。
rcarrillopadron 2014年

10
@Gili Cookieを使用しない場合、なぜ認証情報をURLで渡すのが唯一のオプションなのですか?HTTPヘッダーで渡さないのはなぜですか?
yby 2014

21
@Gili自動的に送信しないと言うのは正しいですが、適切でないと言うのは正しくありません。私はクライアントのために用意している多くの異なる本番アプリケーションでlocalStorageとsessionStorageを使用していますが、ヘッダーのIDとトークンの送信に加えてlocalStorage / sessionStorageに依存しているため、1つの脆弱性はありませんでした。サーバーへの負荷も少なくなります。また、ページのリロードフックとアプリケーションロードフックにイベントをバインドして、このユーザーがまだ認証されているかどうかをバックエンドに問い合わせます。よく働く。認証に成功しました!編集:さらにセキュリティを追加するすべてを備えたCSRFトークン。
NodeDad 2015

74
  1. ローカルストレージ

    長所

    1. Webストレージは、Cookieの改善と単純に見なすことができ、はるかに大きなストレージ容量を提供します。Mozillaソースコードを見ると、5120KB5MBはChromeでは250万文字に相当)がドメイン全体のデフォルトのストレージサイズであることがわかります。これにより、通常の4KBのCookieよりもかなり多くの領域を処理できます。
    2. データは、HTTPリクエスト(HTML、画像、JavaScript、CSSなど)ごとにサーバーに送り返されないため、クライアントとサーバー間のトラフィック量が減少します。
    3. localStorageに保存されたデータは、明示的に削除されるまで存続します。加えられた変更は保存され、サイトへの現在および将来のすべてのアクセスで利用できます。

    短所

    1. これは、上で動作する同一生成元ポリシー。そのため、保存されたデータは同じオリジンでのみ利用できます。
  2. クッキー

    長所:

    1. 他と比較して、私の知る限り何もありません。

    短所:

    1. 4Kの制限は、名前、値、有効期限などを含むCookie全体に対するものです。ほとんどのブラウザをサポートするには、名前を4000バイト未満に、Cookie全体のサイズを4093バイト未満にします。
    2. データはHTTPリクエスト(HTML、画像、JavaScript、CSSなど)ごとにサーバーに送り返され、クライアントとサーバー間のトラフィック量が増加します。

      通常、以下が許可されます。

      • 合計300クッキー
      • Cookieあたり4096バイト
      • ドメインあたり20個のCookie
      • ドメインあたり81920バイト(最大サイズ4096のCookieが20個の場合= 81920バイト)
  3. sessionStorage

    長所:

    1. に似ていlocalStorageます。
    2. データは永続的ではありません。つまり、データはウィンドウ(またはChromeやFirefoxなどのブラウザーのタブ)ごとにのみ利用可能です。データはページセッション中にのみ使用できます。加えられた変更は保存され、現在のページだけでなく、同じウィンドウでのサイトへの将来のアクセスにも使用できます。ウィンドウを閉じると、ストレージは削除されます。

    短所:

    1. データは、それが設定されたウィンドウ/タブ内でのみ使用できます。
    2. のようにlocalStorage同じ生成元のポリシーで機能します。そのため、保存されたデータは同じオリジンでのみ利用できます。

タブを越えたチェックアウト-クロスオリジンのブラウザタブ間の簡単なコミュニケーションを促進する方法。


13
Cookie:「データはすべてのHTTPリクエストに対してサーバーに送り返されます」。(認証プロセスなどの)いくつかのユースケースでは、これも利点と見なされる場合があります。 sessionStorage: " 変更はウィンドウ(またはChromeやFirefoxなどのブラウザのタブ)でのみ利用可能です。「変更はページセッション中にのみ利用可能」と定式化することをお勧めします。ページセッションは、ブラウザが開いている限り継続し、ページの再読み込みと復元(MDN:developer.mozilla.org/en/docs/Web/API/Window/sessionStorageから)
Deniz

更新しました!ありがとう@DenizToprak
softvar

1
@softvar:sessionStorage-Con 2 .:"データは永続的ではありません。つまり、ウィンドウ/タブが閉じられるとデータは失われます。" -これは間違いなく欠陥ではありません。それは利点だと思います。結局のところ、これは「セッション」ストレージです。そのように機能するように設計されています。
devstructor

@devstructorええ、そうです。一部のデータをローカルに保存するという意味で考えました。答えを更新しました。ご指摘いただきありがとうございます。
softvar '19

57

OK、のlocalStorageそれはそれはそれはまで保存することができ、あなたのブラウザのローカルストレージだと呼ばれるよう10メガバイトはのsessionStorageは同じことを行いますが、それの名前が言うように、それのセッションは、ベースと、ブラウザを閉じた後に削除されます、また、以下のlocalStorage以上保存することができ、最大5MBのようですが、Cookieはブラウザに保存される非常に小さなデータであり、最大4KB節約でき、サーバーまたはブラウザの両方からアクセスできます...

違いを一目で確認できるように、次の画像も作成しました。

LocalStorage、SessionStorage、Cookie


25

これらは、ドキュメントがDOMオブジェクトを保持するウィンドウオブジェクトのプロパティの1つであるように、JavaScriptの「ウィンドウ」オブジェクトのプロパティです。

セッションストレージプロパティは、ページセッションの期間中、つまりブラウザが開いている間(ページの再読み込みや復元を含む)使用可能な、指定されたオリジンごとに個別のストレージ領域を維持します。

ローカルストレージは同じことを行いますが、ブラウザを閉じて再度開いた場合でも保持されます。

保存されたデータは、次のように設定および取得できます。

sessionStorage.setItem('key', 'value');

var data = sessionStorage.getItem('key');

localStorageについても同様です。


10
追加するだけです- sessionStorage新しいタブでも新しいウィンドウです。したがって、1つのタブで特定のドメインに保存されたものは、次のタブの同じドメインでは使用できません。
RBT 2017年

5

ローカルストレージ:ユーザー情報データを有効期限なしで保存します。このデータは、ユーザーがブラウザウィンドウを閉じたときに削除されず、日、週、月、年で利用できます。

ローカルストレージでは、5〜10 MBのオフラインデータを保存できます。

//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

セッションストレージ:ローカルストレージの日付と同じですが、ウェブユーザーがブラウザウィンドウを閉じたときにすべてのウィンドウが削除されます。

セッションストレージでは最大5 MBのデータを保存できます

//set the value to a object in session storege
sessionStorage.myNameInSession = "Krishna";

セッション:セッションは、サーバーに格納されているグローバル変数です。各セッションには、格納された値を取得するために使用される一意のIDが割り当てられます。

Cookie:Cookieはデータであり、コンピュータ上に名前と値のペアとして小さなテキストファイルに保存されます。Cookieが設定されると、それに続くすべてのページ要求はCookieの名前と値を返します。


2

Web Storage APIは、ブラウザがCookieを使用するよりもはるかに直感的な方法で、キーと値のペアを安全に保存できるメカニズムを提供します。ウェブストレージAPIを拡張しWindow2つの新しいプロパティを持つオブジェクトを- Window.sessionStorageWindow.localStorage—これらの1つを呼び出すと、Storageオブジェクトのインスタンスが作成され、データオブジェクトを設定、取得、および削除できます。sessionStoragelocalStorage各オリジン(ドメイン)には異なるストレージオブジェクトが使用されます。

ストレージオブジェクトは、オブジェクトに似た単純なKey-Valueストアですが、ページの読み込み中はそのまま残ります

localStorage.colorSetting = '#a4509b';
localStorage['colorSetting'] = '#a4509b';
localStorage.setItem('colorSetting', '#a4509b');

キーと値は常に文字列です。任意のタイプconvert it to Stringを保存してから保存する。Storage interfaceメソッドを使用することを常にお勧めします。

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));

Web Storage内の2つのメカニズムは次のとおりです。

  • sessionStorageは、指定されたオリジンごとに個別のストレージ領域を維持します(ページのリロードや復元を含め、ブラウザが開いている限り)、ページセッションの期間に使用できる Same-originポリシー
  • localStorageも同じことを行いますが、ブラウザを閉じて再度開いた場合でも保持されます。

ストレージ « ローカルストレージはデータをディスクに書き込みますが、セッションストレージはデータをメモリのみに書き込みます。アプリが終了すると、セッションストレージに書き込まれたデータはすべて消去されます。

使用可能な最大ストレージは、ブラウザごとに異なっているが、ほとんどのブラウザでは、少なくとも、W3Cは、最大容量の制限推奨実装した5メガバイトを

+----------------+--------+---------+-----------+--------+
|                | Chrome | Firefox | Safari    |  IE    |
+----------------+--------+---------+-----------+--------+
| LocalStorage   | 10MB   | 10MB    | 5MB       | 10MB   |
+----------------+--------+---------+-----------+--------+
| SessionStorage | 10MB   | 10MB    | Unlimited | 10MB   |
+----------------+--------+---------+-----------+--------+

LocalStorageセキュリティとクォータ超過エラーを常にキャッチする

StorageEvent «ストレージ領域が変更されると、ドキュメントのWindowオブジェクトでstorageイベントが発生します。ユーザーエージェントがドキュメントのストレージ通知を送信する場合、ユーザーエージェントは、StorageEventを使用して、DocumentオブジェクトのWindowオブジェクトでstorageという名前のイベントを発生させるタスクをキューに入れる必要があります。

注:実際の例については、Web Storage Demoを参照してください。ソースコードをチェックしてください

dom / Windowのストレージイベントをリッスンして、ストレージの変更をキャッチします。バイオリン


Cookie(Web Cookie、ブラウザCookie)Cookieは、コ​​ンピュータ上の名前と値のペアとして小さなテキストファイルに保存されたデータです。

Document.cookieを使用したJavaScriptアクセス

Document.cookieプロパティを使用してJavaScript経由で新しいCookieを作成することもできます。HttpOnlyフラグが設定されていない場合、JavaScriptから既存のCookieにもアクセスできます。

document.cookie = "yummy_cookie=choco"; 
document.cookie = "tasty_cookie=strawberry"; 
console.log(document.cookie); 
// logs "yummy_cookie=choco; tasty_cookie=strawberry"

安全なHttpOnly Cookie HTTP状態管理メカニズム

Cookieは、ユーザーとその認証済みセッションを識別するためにWebアプリケーションでよく使用されます

HTTP要求を受信すると、サーバーは応答とともにSet-Cookieヘッダーを送信できます。Cookieは通常ブラウザによって保存され、CookieはCookie HTTPヘッダー内の同じサーバーに対して行われたリクエストとともに送信されます。

Set-Cookie: <cookie-name>=<cookie-value> 
Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date>

クライアントがシャットダウンされると、セッションCookieは削除されます。ExpiresやMax-Ageディレクティブは指定していません。

Set-Cookie: sessionid=38afes7a8; HttpOnly; Path=/

永続的なCookieは、特定の日付(Expires)または特定の期間(Max-Age)後に期限切れになります。

Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly

Cookie HTTPリクエストヘッダーには、以前にSet-Cookieヘッダーを使用してサーバーから送信された、保存済みのHTTP Cookieが含まれています。クロスサイトスクリプティング(XSS)に対する攻撃を緩和するために、Document.cookieプロパティ、XMLHttpRequestおよびRequest APIを介してJavaScript経由でHTTPのみのCookieにアクセスすることはできません。

Cookieは主に次の3つの目的で使用されます。

  • セッション管理 «ログイン、ショッピングカート、ゲームのスコア、その他サーバーが覚えておくべきこと
  • パーソナライゼーション «ユーザー設定、テーマ、その他の設定
  • 追跡(ユーザーの行動の記録と分析)«Cookieにはドメインが関連付けられています。このドメインが表示しているページのドメインと同じである場合、CookieはファーストパーティCookieと呼ばれます。ドメインが異なる場合、それはサードパーティのCookieと呼ばれます。ファーストパーティCookieはそれらを設定しているサーバーにのみ送信されますが、Webページには他のドメインのサーバーに保存されている画像やその他のコンポーネント(広告バナーなど)が含まれている場合があります。これらのサードパーティコンポーネントを介して送信されるCookieはサードパーティCookieと呼ばれ、主にWeb全体での広告と追跡に使用されます。

Cookieは、「ユーザーに関する情報をどのように記憶するか」という問題を解決するために発明されました。

  • ユーザーがWebページにアクセスすると、その名前がCookieに保存されます。
  • 次にユーザーがページにアクセスすると、そのページに属するCookieがリクエストに追加されます。このようにして、サーバーはユーザーに関する情報を「記憶」するために必要なデータを取得します。

GitHubGistの


まとめとして、

  • localStorageは、さまざまなタブまたはウィンドウにわたって保持されます。また、ブラウザーを閉じた場合でも、それに応じて、ドメインのセキュリティポリシーと割り当て制限に関するユーザーの選択に従います。
  • sessionStorageオブジェクトは、別のタブまたはウィンドウを介してサーフィンする場合は存在しないため、タブ(トップレベルのブラウジングコンテキスト)を閉じると永続化しません。
  • Webストレージ(セッション、ローカル)を使用すると、大量のキーと値のペアと大量のテキストを保存できます。これは、Cookieを使用して実行するのは不可能です。
  • デリケートなアクションに使用されるCookieは、有効期間が短い必要があります。
  • 主にWeb全体での広告と追跡に使用されるCookie。たとえば、Googleで使用されるCookie種類をご覧ください。
  • Cookieはリクエストごとに送信されるため、パフォーマンスが低下する可能性があります(特にモバイルデータ接続の場合)。クライアントストレージ用の最新のAPIは、WebストレージAPI(localStorageおよびsessionStorage)とIndexedDBです。

2

LocalStorage

  • Webストレージは、Cookieの改善と単純に見なすことができ、はるかに大きなストレージ容量を提供します。利用可能なサイズは5MBで、通常の4KB Cookieよりもかなり多くのスペースを処理できます。

  • データは、HTTPリクエスト(HTML、画像、JavaScript、CSSなど)ごとにサーバーに送り返されないため、クライアントとサーバー間のトラフィック量が減少します。

  • localStorageに保存されているデータは、明示的に削除されるまで存続します。加えられた変更は保存され、サイトへの現在および将来のすべてのアクセスで利用できます。

  • 同一生成元ポリシーで機能します。そのため、保存されたデータは同じオリジンでのみ利用できます。

クッキー:

  • クッキーごとに有効期限を設定できます

  • 4Kの制限は、名前、値、有効期限などを含むCookie全体に対するものです。ほとんどのブラウザをサポートするには、名前を4000バイト未満に、Cookie全体のサイズを4093バイト未満にします。

  • データはHTTPリクエスト(HTML、画像、JavaScript、CSSなど)ごとにサーバーに送り返され、クライアントとサーバー間のトラフィック量が増加します。

sessionStorage:

  • これはlocalStorageに似ています。
  • 変更はウィンドウ(またはChromeやFirefoxなどのブラウザのタブ)ごとにのみ使用できます。加えられた変更は保存され、現在のページだけでなく、同じウィンドウでのサイトへの将来のアクセスにも使用できます。ウィンドウを閉じると、ストレージは削除されます。データは、それが設定されたウィンドウ/タブ内でのみ使用できます。

  • データは永続的ではありません。つまり、ウィンドウ/タブが閉じられると失われます。localStorageと同様に、同じ生成元のポリシーで機能します。そのため、保存されたデータは同じオリジンでのみ利用できます。


0

ここでは簡単なレビューと簡単で迅速な理解があります

ここに画像の説明を入力してください

freecodecampのBeau Carnes先生から

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.