ウェブストレージ

**ウェブストレージ**(Web storage)は、**DOMストレージ** (Document Object Model storage)と呼ばれることもあり、ウェブアプリケーションにクライアント側のデータを保存する方法とプロトコルを提供する。ウェブストレージは永続性のあるデータストレージをサポートするという点で HTTP cookie（クッキー）と似ているが、容量が拡大され、HTTP request headerに情報が保存されなくなった。ウェブストレージにはローカルストレージ(local storage)とセッションストレージ(session storage)の２種類があり、それぞれpersistent cookieとsession cookieと同様にふるまう。ウェブストレージはWorld Wide Web Consortium (W3C)とWHATWGによって標準化されていて、すべての主要なブラウザーにサポートされている。

## 特徴
ウェブストレージはクッキーといくつかの点で異なる。

; 目的
: クッキーはサーバーとの通信を目的としているため、すべてのリクエストに自動的に加えられ、サーバーとクライアント側の双方からアクセス可能である。ウェブストレージにアクセスできるのはクライアントサイドスクリプティングのみに限定される。ウェブストレージのデータはHTTPのリクエストごとにサーバーに自動的に送信されるわけではなく、またウェブサーバーがウェブストレージに直接書き込むことはできない。 ただし、クライアント側でこれらの効果を実現するようなスクリプトを明示的に書くことは可能であり、クライアント側からはサーバーと望み通りの通信ができるような細かい制御が実現できる。
; ストレージの大きさ
: クッキーは4 KBに制限される。ウェブストレージの容量はそれよりもはるかに大きい。
:* Mozilla Firefoxはオリジンごとに5 MBの容量がある。
:* Google Chromeはオリジンごとに10 MB の容量がある。
:* Internet Explorerはストレージエリアごとに 10 MB の容量がある。
; ローカルストレージとセッションストレージ
: ウェブストレージには、ローカルストレージとセッションストレージという2つの異なるストレージエリアがあり、有効範囲（スコープ）と有効期限が異なる。 ローカルストレージに保存されるデータの有効範囲は、 同一生成元ポリシーで規定されているように、同じプロトコル、ホスト名、およびポート番号の組み合わせごとである。 データは、以前にデータを保存したページと同じオリジンのページから読み込まれるすべてのスクリプトから利用でき、ブラウザが閉じられた後も保存される。 そのため、ウェブストレージにはのセクション8.5および8.6に書かれているクッキーの弱い完全性および弱い機密性のような問題がない。セッションストレージの有効範囲は、オリジンごとであって、さらにインスタンスごと（ウィンドウごとまたはタブごと）であり、インスタンスの有効期限に限定される。 セッションストレージは、同じウェブアプリケーションの異なるインスタンスが互いに干渉することなく異なるウィンドウで実行できるように設計されている。これはクッキーで十分にサポートされていない利用法である。
; インターフェイスとデータモデル
: ウェブストレージは、キーと値の両方が文字列である連想配列データモデルを採用しているため、クッキーよりも優れたプログラムのインターフェイスが提供されている。 データモデルにアクセスするための追加のAPIが、W3C Webアプリケーションワーキンググループによって検討されている。

## 使用法
ウェブストレージをサポートするブラウザはwindowレベルで宣言される `sessionStorage` と `localStorage` というグローバールオブジェクトを持っている。以下のJavaScriptコードによって、これらのブラウザでウェブストレージを動作させることができる。

```javascript
// セッション期限に限ってブラウザに値を保存する
sessionStorage.setItem('key', 'value');

// 値を得る (ブラウザを閉じて再度開くと消去される)
alert(sessionStorage.getItem('key'));

// セッション期間を超えてブラウザに値を保存する
localStorage.setItem('key', 'value');

// 値を得る (ブラウザを閉じて再度開いても継続する)
alert(localStorage.getItem('key'));
```


ストレージのAPIでは文字列のみ保存できる。他のデータ型を保存しようとすれば、多くのブラウザでは自動的に文字列に変換される。しかし、JSONに変換すれば、JavaScriptのオブジェクトを効率的に保存することができる。

```javascript
// 文字列のかわりにオブジェクトを保存する
localStorage.setItem('key', {name: 'value'});
alert(typeof localStorage.getItem('key')); // string

// 文字列のかわりに整数を保存する
localStorage.setItem('key', 1);
alert(typeof localStorage.getItem('key')); // string

// JSONを使ってオブジェクトを保存する
localStorage.setItem('key', JSON.stringify({name: 'value'}));
alert(JSON.parse(localStorage.getItem('key')).name); // value
```


## 名称
W3Cの文書は「Web Storage」というタイトルである。「DOM storage」という名称も一般的に使われていたが、あまり使われなくなってきた。たとえば、MozillaとMicrosoftの開発者サイトではDOM Storageの記事がWeb Storageの記事に書き換えられた。

DOMストレージの「DOM」は、文字通りDocument Object Modelを意味しない。 W3Cによれば、「DOMという用語は、ウェブアプリケーションのスクリプトで使用できるAPI群を指すために使用され、実際にDocumentオブジェクトが存在することを必ずしも意味しない」。

## ウェブストレージの管理
ウェブストレージオブジェクトの保存は現在のすべてのサポートするウェブブラウザでデフォルトで有効にされていて、ブラウザのベンダーごとに、ユーザーがウェブストレージを有効・無効にする方法、そしてウェブストレージの「キャッシュ」を消去する方法が提供されている。同様にウェブストレージを制御する方法は、サードパーティーのブラウザ拡張機能によっても可能である。ブラウザごとにウェブストレージのオブジェクトを保存する方法が次のように異なっている。

* Firefoxではウェブストレージのオブジェクトをユーザープロフィールのフォルダの `webappsstore.sqlite` というSQLiteのファイル `webappsstore.sqlite` に保存する。

* Google ChromeはウェブストレージのデータをユーザープロフィールのSQLiteファイルに保存する。このファイルが保存されているサブフォルダはWindowsでは `\AppData\Local\Google\Chrome\User Data\Default\Local Storage` であり、macOSでは `~/Library/Application Support/Google/Chrome/Default/Local Storage` である。

* Operaのウェブストレージは、Operaのバージョンによって `\AppData\Roaming\Opera\Opera\sessions\autosave.win` か、あるいは `\AppData\Local\Opera\Opera\pstorage\` のいずれかに保存される。

* Internet Explorerのウェブストレージは `\AppData\LocalLow\Microsoft\Internet Explorer\DOMStorage` である。

## 関連項目
*Indexed Database API

## 脚注

## 外部リンク
* HTML Living Standard 11 Web storage
** HTML Standard — Web Storage（日本語訳） — 非公式な翻訳
* W3C: Web Storage
*Web Storage API on Mozilla Developer Network
* Opera: Web Storage: easier, more powerful client-side data storage
*Local Storage on BlackBerry DevZone