はじめに
何らかのサービスを作成するうえで、認証、認可の仕組みは必要不可欠です。
ログインができて、ログインしたユーザーしか特定のサービスを使えないようにするという機能は、実際ほとんどどんなサービスにも実装されています。
その機能のために必要なのが認証と認可の仕組みであり、その実装方法について様々な方法が開発され、使われてきました。
しかし、マイクロサービスなアーキテクチャでアプリケーションを作成しようとした場合、これらの機能はモノリシックなアーキテクチャと同じように実装しようとすると困難が生じます。
例えば、モノリシックアーキテクチャと同じようにサービスごとに認証機能を実装していると、一つのサービスにログインしてそのサービスを利用した後に別のサービスを使用しようとしたとき、そのサービスではログインしていないために再びログインを求められることになり不便になります。
そしてそもそも、認証や認可とはどのようなものでしょうか。
マイクロサービスアーキテクチャにおける認証と認可の仕組みを考えるにあたっては、その仕組みが認証に関わるものなのか認可に関わるものに分かれるため、この辺りは違いについて一度復習しておく必要がありそうです。
今回の記事では、認証と認可とはどのようなものであったかを軽く説明しながら、マイクロサービスアーキテクチャでそれらを実装するにあたっての困難な点を解説したいと思います。
認証とは
認証とは、一言でいうと「ユーザーがそのユーザーであると認識すること」です。
サービスでいうところの、ログインにあたります。
ログインしようとしている人がユーザーかどうかを確かめる方法には以下の例があります。
- ユーザーがユーザーIDやパスワードを知っているかどうか(知識情報)
- そのユーザーの体の特徴があること(生体情報)
- カードキーや証明書などの特定のモノを持っているかどうか(所持情報)
これらの情報があることによって、今そのサービスを使おうとしているユーザーが「その」ユーザーであるということを認識し、認証情報を保存します。
マイクロサービスアーキテクチャにおける認証の問題
モノリシックなアーキテクチャの場合、そのサービスの認証機能は一つのサーバーに持たせることができます。
ユーザー情報を1か所のデータベースにまとめ、ログイン時にはそのデータベースと照合して認証を行い、ユーザーがそのユーザーであるという認証情報も同じサーバーに保存することで、認証機能を実装することができました。
一方で、マイクロサービスアーキテクチャにおいて、サービスは境界コンテキストによって物理的に分割されます。
つまり、そのサービスを持つサーバーは複数になります。
この場合、ユーザー情報や認証情報はどのように保持するべきでしょうか?
単純にそれぞれのサービスに認証機能と認証情報を持たせた場合、ある一つのサービスでは認証されていることによって残りのサービスでも自動的に認証されることはありません。
認証情報はそれをほかのサービスに伝えない限り認証を行ったサービスの中にしか保存されないためです。
逆に、どのようにかして一つのサービスで認証されたことを他のサービスにも伝えることができればマイクロサービスにおける認証が実装できるのですが、その方法が問題になります。
認可とは
認可とは、一言でいうと「特定の条件において、その機能(リソース)にアクセスしてもいいよという許可を与えること」です。
サービスでいうところの、「ログインしないとサービスが使えない」という部分がそれにあたります。
「特定の条件」というのにはここでは「ログインしていること」があたりますが、認可においてはどちらかというと「そのサービスを使えるようにしたり使えないようにしたりすること」の方が本質です。
マイクロサービスアーキテクチャにおける認可の問題
認可を行う方法においても、認証と同じような問題に突き当たります。
例えば、プレミアムサービスのようなものがあって、ユーザーがそれに登録していなければそれを使えないサービスがあるとしたら、そのサービスごとに「そのユーザーはこのサービスを使う権限があるか?」ということを確認しなければなりません。
しかし、そのサービスを使おうとしてやってきたユーザーがどのようなサービスを使用する条件を達しているのかをどうやって知ればいいのでしょうか。
ここでもまた、特定のサービスを使ってもいいよという情報を、ほかのサービスにどうやって伝えるのか?といった問題が起きます。
まとめ
今回は、マイクロサービスアーキテクチャでの認可と認証機能の実装方法について考える前段階として、認証と認可とは何か、そしてそれらがマイクロサービスアーキテクチャで実装するにあたってどのような点が問題になるかについて解説してきました。
あるサービスではユーザーが認証されていることをほかのサービスではどのように確かめるか、そしてそのユーザーがどのサービスで何をしていいかということをどのように実装するかという問題は、モノリシックなアーキテクチャでは容易に実装できてもマイクロサービスアーキテクチャでは同じようにはいきません。
次回は、これらの問題についてどんな解決策があるかについて解説していきたいと思います。
お楽しみに!
謝辞
この記を書くにあたって、「WindowsでNFCタグを扱うには? (Windows nfcpy FeliCa)」の合田さんに執筆のサポートいただきました。
本当にありがとうございました!