Web 認証、承認用ライブラリ
むかーしむかし、あるところに
ざっとWebアプリの10年を振り返るとき、根本的に変わった点を探ると、私は第一にブラウザーの変化であると思っています。
ブラウザーというべきか、ブラウズする環境というべきか・・・
I.E.対応に苦しめられる時代は終わった。
これが実に大きいように思います。
(当時はまだガラケーを持つ人も多くいたので、ガラケー対応のために何機種も手元においてテストする・・・そんな時代でもありましたが。)
相変わらずPC用モニタの多くは横長であるけれども、誰もがスマホを持つ時代になった現在、スマホ用としては縦長の画面として設計することになる。
そして、Webアプリ側で頑張る!という流れから、JS、CSS実装の標準化や画面設計に適したライブラリが増えて、画面設計は以前よりも本質的な部分にアプローチできるようになってきたと思います。
(まぁ、現在に生きている人には当たり前の話過ぎますが。)
サーバー、クライアントはそれぞれがやるべきことに専心できる時代に
ライブラリを開発し、公開してくださっている皆様には本当に頭が下がります。
現在のWebアプリの設計は、サーバーはサービス側の責務、責任に専心し、クライアントアプリが顧客向けのツールとして動作する、本当にシンプルな流れになってきたと思います。かつては、クライアント向けの動作をすべてサーバー側が状態を管理しようとするため、サーバーの実装上の負担は多く、また脆弱性の原因にもなりがちでした。畢竟、Webフレームワークが、サーバー上ですべてをまかなえるシステムを目指し、鈍重なものになってしまう恐れがありました。
(当時においても、そういった問題をキレイに解決しうるよきライブラリもあったことを記憶していますが、ここでは触れません)
サーバー、クライアントの分離と連携
サーバーとクライアントの役割を分離するなら、簡単にいえば、
- サーバー=データの作成、取得、更新、削除を提供するAPI
- クライアント= ブラウザで動作するアプリケーション
この分離ですね。
クライアント上で動作する画面やアプリケーションプログラムをどこから取得するか、は、インストールする形か、オンデマンドにどこかのサーバーから取得するなどありますが、それも、分離して別の関心事としましょうか。
(恐ろしいことに、かつては、これらすべてサーバー側のプログラムが管理していたのです!)
さて、本題ですが、いかに役目を分けたとしても、一つの目的を達するためには「連携」は必要です。その連携を、ローカルな仕様や技術標準に則った規約などで整備するか、とにかく連携できるようにすることが重要です。
OAuthやRESTはそういった設計を容易にしてくれると思っています。
サーバー、クライアントに共通する認証、承認
認証や承認は、サーバー、クライアントに共通する関心事かと思います。
黎明期のWebアプリでは、フォームにユーザーとセッションを結びつけるハッシュを仕込んでおき、ハッシュ毎に処理をする、とか、ミドルウエアが持つセッション情報などを通じて、クライアントの状態をサーバー側で管理するのが常道でしたが、複雑かつ脆弱でした。
パスワード認証の終わり
パスワードを使用した認証が脆弱であることが知られており、W3Cは、パスワード認証を非推奨とし、WebAuthnをWeb標準とすることが公開されています。
W3CとFIDO Alliance - パスワード不要の安全なログインが勧告化に
Fido2?
WebAuthnがWeb標準はもちろんよいのですが、独自にFido2を実装するのが合理的でしょうか。
SSO連携
SSOの技術的には無論10年前にもありましたが、まだまだ主流とは言えない感がありました。
しかし、現状ではWebアプリ認証の合理的な解決方法としては、たとえば、Windows10はWebAuthnに対応しており、Microsoftは個人用のマイクロソフトアカウントまたは、Office365(Microsoft 365)のアカウントによる認証を使用しています。
また、Googleアカウントでの認証を多用している人なども多いでしょう。
これら、WebAuthnに対応しているアカウント情報と連携してSSOしていく構成が、現状での認証・承認としては、経済的に合理的かつ安全なのではないでしょうか。
SSO連携は、サーバー、クライアントの分離とも相性がよいです。クライアントはクライアント上で認証をへて承認を取得し、サーバー側は適切なトークンを持ったアクセスであるかを独自に検証すればよいので、サーバー上での考慮事項はシンプルです。
このブログの近々の課題としては、まずはMicrosoftのAzure AD B2Cを中心に検討していきたいと思います。
認証サービスで最も有名なものの一つはAuth0かと思いますので、こちらも確認していきたいと思います。