ローカルストレージは安全に使用できるのか？

もう、2月。もうすぐ節分。
2022年2月3日の恵方は、「北北西」のようですね。

東京では、久しぶりに夕方グラっと地震がありドキッとしました。

QiitaでITセキュリティ関連の記事をご紹介しつつ、いざというときの家庭のセキュリティについては後回しに。
早めに見直さなければと思いつつ、また、明日と先延ばししています。

今年の抱負の一つが密かに、[何事もシフトレフトを目指す]
も入っているのですが、、、

今回は、ローカルストレージのセキュリティについて「[Is local Storage Safe to Use?](
https://snyk.io/blog/is-localstorage-safe-to-use/ )」
のブログ翻訳をご紹介します。



#ローカルストレージは安全に使用できるのか？

リラン・タル
2020年1月30日

インターネットは、基本的なテキストのレイアウトにさえ苦労していた[最初のウェブサイト](http://info.cern.ch/hypertext/WWW/TheProject.html)から長い道のりを歩んできました。HTML5はハイパーテキストマークアップランゲージの最新の進化形で、ブラウザのプラグインを追加することなく、ウェブデベロッパが望むほぼすべてのことができるように設計されています。HTML5では、セマンティックな要素、グラフィックな要素、さらにはウェブストレージ（特にローカルストレージ）を利用したいくつかのトリックなど、さまざまな要素がデベロッパに提供されています。もちろん、ローカルストレージは安全に使えるのか、という疑問もあります。

ローカルストレージは、データベースやサーバーを必要としない、軽量なデータストレージとしてデベロッパの注目を集めています。それはとても素晴らしいことですが、それを使用することは毎回良いアイデアだと言えるのでしょうか？ここでは、[Snyk](https://snyk.io/)のスタッフの考えをご紹介します。

#ローカルストレージとは？
[ローカルストレージ](https://www.w3schools.com/html/html5_webstorage.asp)は、クライアント、つまりユーザーのコンピュータにデータを保存するためのHTML5ウェブストレージオブジェクトです。ローカルに保存されたデータには有効期限がなく、削除されるまで存在し続けます。(これに対して、もう一つのHTML5ウェブストレージAPIであるセッションストレージは、ブラウザが閉じたときに保存されたデータを削除します)

ローカルストレージは純粋なJavaScriptです。同様に、ユーザーのデバイス上にプレーンテキストのドキュメントを生成することに変わりはありませんが、ローカルストレージでは（cookieの4KBに対して）最大5MBのデータを保存することができます。これにより、コンテンツを管理してサーバーへのリクエストを減らしたり、ロード時間を短縮したりするなど、ローカルストレージの興味深い応用が可能になりました。

慎重に使えば、ローカルストレージは強力な軽量データストレージソリューションとなりますが、問題がないわけではありません。ここでは、保存対象によってはローカルストレージの使用が好ましくないと思われる理由をいくつか紹介します。

#ローカルストレージの使用が好ましくない理由
ローカルストレージは、本質的にはcookieを使用するよりも安全ではありません。このことを理解していれば、セキュリティの観点からは重要ではないデータの保存にオブジェクトを使用することができます。しかし、ここに[ローカルストレージの使用を再考すべき](https://dev.to/rdegges/please-stop-using-local-storage-1i04)いくつかの理由があります。

##1. [XSS](https://snyk.io/learn/cross-site-scripting/)に脆弱なサイトの場合、ローカルストレージは安全ではない
ローカルストレージを使用することに対する最大の反対意見は、おそらくローカルストレージに関連するセキュリティの脆弱性でしょう。ローカル・ストレージは、cookieと同じ特徴を持ち、同じセキュリティ・リスクを含みます。そのひとつがクロスサイトスクリプティングで、cookieを盗み、ハッカーにユーザーになりすまさせてサイトにログインさせることができます。パスワードのような機密性の高いものをローカルストレージファイルに保存すると、実際にはハッカーは自分のブラウザのなかでcookieを読み込む必要がないため、プロセスが簡素化されます。

##2. ローカルに保存されたデータをデベロッパが管理できない
ローカルストレージでは、[サーバー側のストレージ](https://snyk.io/blog/best-practices-for-secrets-management-in-serverless-applications/)、つまりデベロッパがコントロールできるデータベースがありません。これにはいくつかの問題がありますが、その一つは、一度保存されたコードや情報をデベロッパが更新する手段がないことです。ユーザーは手動でファイルを削除する必要がありますが、そのためにはファイルを探す必要があります。あるいは、ブラウザのキャッシュを消去して、保存されたデータをすべて失わせる必要があります。

##3. キャッシュを消去する
ブラウザのキャッシュを定期的にクリアすることで、Cookieの機能をより効果的に発揮させることができます。また、ページが正しく読み込まれないなどのブラウザの問題をトラブルシューティングする際の最初のステップにもなります。これは、サイトの機能をサポートするためにローカルストレージを使用する場合の問題です。ユーザーがブラウザのキャッシュを消去してしまうと、その情報は永久に失われてしまいます。そのため、ローカルストレージは予備のデータベースとしての役割を果たします。

#ローカルストレージの代替手段
情報が機密性の高いものかどうかに応じて、ローカルストレージの代わりとなるものがいくつかあります。ローカルストレージを使用したくないデベロッパは、以下のような選択肢があります。

* 機密情報にはサーバーサイドセッションを使用する
サーバーにデータを保存することは、機密情報を扱う場合にいくつかの利点があります。第一に、デベロッパはそのセキュリティを保証することができ、個々のセッションをよりコントロールすることができます（必要に応じて即座に終了させることができます）。第二に、データはアーキテクチャ内で保護されているため、データが流出する可能性が低くなります。

* 非機密情報にはIndexedDBを選択する
IndexedDBは、クライアントサイドのセッションを使用することにこだわるデベロッパにとって、ローカルに保存できるアプリケーションの構築を可能にします。ローカルストレージほど広くブラウザでサポートされているわけではありませんが、機密性のないデータをローカルに保存する場合には便利です。IndexedDBには、ローカルストレージに比べて、より多くの種類のデータを扱うことができる本格的なデータベースであるという大きな利点があります。

#データストレージを賢く使う
ローカルストレージをうまく活用すれば、サイトのパフォーマンスを向上させ、より軽量なアプリケーションを作ることができます。しかし、ローカルストレージは、パスワードや個人情報などの機密情報には決して使用しないでください。機密情報にローカルストレージを使用することで、本来、サイトのサーバーがすでに安全であれば避けることができるセキュリティリスクを生み出します。

暗号化やセキュリティが必要な情報については、サーバーサイド・セッションなど、効果的で手軽なソリューションがあります。サイバーセキュリティがこれほど大きな関心事となっている今、リスクを冒す必要はありません。

Snyk は、常に脆弱性を見つけて修正し、安全な状態を維持できるよう支援します。サインアップして、無料のアカウントを取得しましょう。

https://app.snyk.io/login?cta=sign-up&sect=body&page=is-localstorage-safe-to-use

######最後まで、読んでいただきありがとうございました！

---
Contents provided by:
Jesse Casman, Fumiko Doi, Content Strategists for Snyk, Japan, and Randell Degges, Community Manager for Snyk Global