APITokenのHash化の安全性と利便性について

APITokenのHash化の安全性と利便性について

APITokenのHash化の安全性と利便性について

LaravelでSPAを設計しようとした場合、必ずTokenの管理が出てきます。
そして、Tokenをユーザーに知らせたいという要望も、多分出てくると思います。

そんな場合の「できる」「できない」をまとめておこうと思います。

基礎情報:Laravel標準機能としてのToken

LaravelもAPIとの相性が良くなっていて、基本的にToken管理はLaravelさんが勝手にやってくれます。
具体的にはこんな感じ

  • Token発行指示を出すと勝手にpersonal_access_tokensに保存してくれる
  • この際、勝手にHash化してくれる
  • (ノーマル状態で)Tokenの有効期限は1年間
  • Token発行時にHash化していない生なToken情報を【plainTextToken】に記載し用意してくれている
  • plainTextTokenは発行時の1回のみ確認できる情報で、SQLテーブルから取り出そうとするとハッシュ化した値しか取れない
  • よってセキュリティー的にはバッチリな環境を手軽に簡単に入手できる

すげーぜLaravelさん。

「plainTextTokenは発行時の1回のみ確認」が地味に痛い

  • 1年間使えるトークンの値を忘れたらどうするの?
  • 他の端末に発行Tokenを渡したいんだけど(スマホでもPCでも利用したい)
  • なんならログインしないで専用アプリからPOSTしたいし

問題はこの最後の「専用アプリからWebAPIにPOSTしたい」という要望です。
これをする為には、ユーザー認証かけないGuest扱いでAPIPost受けないとイケナイ訳ですが、そもそも簡単に取得できる形で生Tokenを公開してしまうわけにもいきません。
Token取得専用の導線を用意したとしても、Hush化している値が取れるだけで、こいつがTokenとして利用できるわけがありません。

う〜ん、なかなか辛い。

こういう時はOneTime Tokenとして利用すればいい

絶対に安全とは言えませんが、1年間使えるTokenではなく、1回限りのTokenとして用意し、都度削除していく仕組みにすれば再利用されない環境が構築できます。
こんな姿が構築できれば、Hush化せずに生Tokenを保存してアプリから呼び出すなんてことも可能かと思います。

まぁ明確で正確な導線の絵をかけないと甘々になる可能性が否定できないので「ヤラナイに越したことはないですけどね」

まとめ

Hush化が基本で、Hush化していないTokenの取り回しを考えるのが基本です。

でも、そうそう上手く運ばない現場もあります。

そんな時は、安全性をルールで乗り切る方法を考えることも解の一つだと思います。