Skip to main content

LocalStorageは安全に使える?

著者
Webinar LP header

2020年1月30日

0 分で読めます

基本的なテキストレイアウトにも苦労していた史上初のWebサイトの時代から、インターネットは大きく進化しました。HTML5はハイパーテキスト・マークアップ言語の最新バージョンで、追加のブラウザープラグインなしに、Web開発者が望むほぼあらゆることを実現できるよう設計されています。HTML5によって、開発者はさまざまなセマンティック要素やグラフィック要素に加え、Webストレージ、なかでもローカルストレージを利用する機能を手にしました。そこで気になるのが、ローカルストレージは安全に使えるのか、ということです。

データベースやサーバーを使わずにデータを保存できる手軽な方法として、ローカルストレージが開発者の注目を集めています。便利そうですが、いつでも使うのが得策なのでしょうか?Snykのメンバーの見解をご紹介します。

LocalStorageとは?

LocalStorageは、クライアント側、つまりユーザーのコンピューター上にデータを保存するためのHTML5 Web Storageオブジェクトです。ローカルに保存されたデータには有効期限がなく、削除されるまで残ります。(同じくHTML5のWeb Storage APIであるSessionStorageとは異なり、SessionStorageに保存されたデータはブラウザーを閉じると削除されます。)

ローカルストレージは純粋なJavaScriptです。また、ユーザーのデバイス上にプレーンテキストで保存される一方で、Cookieの4KBに対して最大5MBのデータを保存できます。そのため、サーバーへのコンテンツ要求を減らすコンテンツ管理や、読み込み時間の短縮など、ローカルストレージの興味深い活用方法が生まれています。

適切に使えば、ローカルストレージは強力で手軽なデータ保存手段になりますが、問題がないわけではありません。保存するデータによっては、ローカルストレージの利用が望ましくない理由がいくつかあります。

LocalStorageの利用が望ましくない理由

ローカルストレージは、Cookieを使う場合と比べて本質的に安全性が高いわけではありません。この点を理解すれば、セキュリティ上重要でないデータの保存には利用できます。しかし、ローカルストレージの利用を再検討すべき理由がいくつかあります。

1. サイトに XSSの脆弱性がある場合、LocalStorageは安全ではない

ローカルストレージの利用に対する最大の懸念は、関連するセキュリティ脆弱性でしょう。ローカルストレージにはCookieと共通する特徴が多く、同様のセキュリティリスクがあります。その一つがクロスサイトスクリプティング(XSS)への脆弱性です。攻撃者はCookieを盗み、サイトのログインセッションを使ってユーザーになりすますことができます。パスワードのような機密情報をローカルストレージのファイルに保存すると、攻撃者がCookieを自分のブラウザーに読み込む必要がなくなり、攻撃をかえって容易にしてしまいます。

2. 開発者はローカルに保存されたデータを管理できない

ローカルストレージにはサーバーサイドストレージがなく、開発者が管理できるデータベースもありません。これにはいくつかの問題があります。たとえば、データが保存された後に、開発者がコードや情報を更新する方法がありません。ユーザーがファイルを探して手動で削除するか、ブラウザーのキャッシュを消去する必要があります。後者の場合、保存されているデータがすべて失われます。

3. キャッシュは消去される

ブラウザーのキャッシュを定期的に消去するとCookieが正常に機能しやすくなります。また、ページが正しく読み込まれないといったブラウザーの問題をトラブルシューティングする際、まず行われるのがキャッシュの消去です。サイトの機能をローカルストレージに依存している場合、これは問題になります。ユーザーがブラウザーのキャッシュを消去すると、そのデータは完全に失われます。そのため、ローカルストレージは、むしろ代替データベースとして使うのが適しています。

LocalStorageの代替手段

情報が機密かどうかに応じて、ローカルストレージの代替手段はいくつかあります。ローカルストレージを使いたくない開発者は、次の方法を検討できます。

  •      機密情報にはサーバーサイドセッションを使う:機密情報をサーバーに保存することには、いくつかのメリットがあります。まず、開発者はデータの安全性を確保でき、個々のセッションをより細かく管理できます(必要に応じて即座に終了できます)。また、データはアーキテクチャ内で保護されるため、漏えいのリスクを抑えられます。

  •      機密情報でないデータにはIndexedDBを使う:クライアント側セッションを使いたい開発者は、IndexedDBを活用してローカルに保存できるアプリケーションを構築できます。ローカルストレージほど幅広いブラウザーでサポートされているわけではありませんが、機密情報ではないデータをローカルに保存する用途には有効です。IndexedDBには、ローカルストレージよりも多くの種類のデータを扱える、本格的なデータベースであるという大きな利点があります。

データ保存は賢く行おう

ローカルストレージを適切に活用すれば、サイトのパフォーマンスを高め、軽量なアプリケーションの構築に役立ちます。しかし、パスワードや個人情報などの機密情報を保存するために使ってはいけません。サイトのサーバーがすでに安全であれば、こうした使い方は回避できるセキュリティリスクを生み出します。

暗号化やセキュリティが必要な情報には、サーバーサイドセッションなど、効果的で手軽な解決策があります。サイバーセキュリティがこれほど重要視される今、あえてリスクを冒す必要はありません。リスクを冒さないでください。

Snykを活用して、脆弱性を継続的に検出・修正し、安全を確保しましょう。無料アカウントに登録できます。

Capture the Flagを始めよう

オンデマンドのバーチャル入門ワークショップを見て、Capture the Flagの課題の解き方を学びましょう。