chrome拡張は
- webのUIで
- サーバーやDBを用意せず
- 類似のwebサービスよりも強い権限をもって
ツールが提供できるのが利点
ただしDBをつかわない場合、データを永続化しようとしたときになかなか難儀します。
javascriptからデータを保存したい場合、以下のような方法が考えられます。
- local storage: 永続、文字列のみ
- session storage: タブ閉じるとデータが消える
- chrome storage: chrome限定
どれもkey-value型のデータストア
ただしこれらに重要な情報を置くのはどれもおススメできません
理由
のchrome storageのドキュメントより
これらのstorageに保存した情報は、保存したサイトと同じドメインのサイトでなくてはアクセスできませんが、サイトやchrome拡張内にXSSの脆弱性があった場合窃取される可能性があります
自分が気を付ければ防げる話でなく、使っているライブラリの脆弱性を突かれる可能性もあり、これらに認証情報を置くことはかなり危険といえます
(ちなみにいくつかのchrome拡張のコードを見ましたが、そのままストレージに保存して使っているのもちらほらありました)
自作の拡張ではlocal storageに以下の形で保存するようにしました
key: ハッシュ化
value: 元データを、ユーザーの入力したパスワードをハッシュ化したものをキーとして暗号化
よしこれで完全に安全だな!
→ NO!
このロジックはjavascriptに書いてあるため、この拡張を使う全ユーザーに筒抜け
攻撃者がソースコードを見てロジックを知っていた場合、ユーザー入力のパスが割れた瞬間、認証情報がばれます
まとめ
- chrome拡張単体で認証情報を安全に扱うのは難しい(逆に自分がtokenなどの入力を求められたときは注意)
- google系のサービスだけを扱うなら、chrome拡張からのoauth認証をサポートしてくれているので安全にできそう
- 現在lambdaに置き換えていくことを検討中
- マサカリ求む